Solidity 值类型

本章节主要详细介绍solidity中值类型的属性以及注意点,包括: Boolean,Integer,Address,定长字节数组,Enums。


1. Boolean类型

bool: 可以取值 true和 false。

对应的运算符同 java 相同包括:!逻辑非,&&逻辑与,||逻辑或,==等于,!= 不等于,其中 &&,|| 为短路运算符。

2. Integer类型

int/uint: 有符号/无符号整型,支持从 uint8 到 uint256 及 int8 到 int256。int 和 uint 默认值为 int256 和 uint256。

  • 1.有符号:表示任何规定范围内的整数(例如:int8范围是-127-127)
  • 2. 无符号:只能表示非负数(例如:uint8范围是0-255)

支持运算符操作

  • 比较运算符: <= , < , == , != , >= , > 比较结果的返回值为bool类型
  • 位运算符:& ,|,^(异或),~(非)
  • 数学运算:+,-,,/,%(取余),*(次方) ,<<(左移) , >>(右移)

补充说明

(1)var声明:var类型表示第一次使用时所表示的类型

(2)除法截断:整数的除法会被截断(例如:1/4结果为0),但是使用字面量的方式不会被截断

pragma solidity ^0.4.0;
contract IntegerTest{
    function get() returns (int){
        int a = 1;
        int b = 4;
        var c = 1 / 4 * 4;//未截断
    return c;
    }
}

3.Address 地址类型

表示一个账户的地址,在以太坊中地址的长度为20字节,一字节8位,一个 address 就是 160 位,所以 address 可以用 uint160 表示。

  • 支持运算符:

>,<,==,>=,<=,!=

  • 地址类型的成员:

属性:balance

函数:transfer(),send(),call(),callcode(),delegatecall()

(1).balance:它能得到以Wei为单位的地址类型的余额。

pragma solidity ^0.4.0;
contract addressTest{
    function getBalance(address addr) returns (uint){
        return addr.balance;
    }
}

(2) . transfer(uint256 amount):向地址类型发送数量为amount的Wei,失败时抛出异常,不可调节。

(3) .send(uint256 amount) returns (bool):向地址类型 发送数量为 amount 的 Wei,失败时返回 false,不可调节。

补充:send 与transfer对应,但send更底层。如果执行失败,transfer不会因异常停止,而send会返回false。send() 执行有一些风险:如果调用栈的深度超过1024或gas耗光,交易都会失败。因此,为了保证安全,必须检查send的返回值,如果交易失败,会回退以太币。如果用transfer会更好。

(4) .call(…) returns (bool):发出低级函数 CALL,失败时返回 false,发送所有可用 gas,可调节。

(5) .callcode(…) returns (bool):发出低级函数 CALLCODE,失败时返回 false,发送所有可用 gas,可调节。

(6) .delegatecall(…) returns (bool):发出低级函数 DELEGATECALL,失败时返回 false,发送所有可用 gas,可调节。

上面的这三个方法call(),callcode(),delegatecall()都是底层的消息传递调用,最好仅在万不得已才进行使用,因为他们破坏了Solidity的类型安全。

(1).msg.sender:表示当前调用方法时的发起人,调用方法的人很多,如何判断合约的拥有者?在第一次部署的时候进行定义,即在构造函数中定义:

contract Test {
    address public _owner;
    function Test() {
        _owner = msg.sender;
    }
}

(2).合约地址:合约部署后,会有一个合约地址,合约地址表示合约本身,可以用this表示

  contract Test {
    address public _owner;
    function Test() {
        _owner = msg.sender;
    }
     function returnContractAddress() constant returns (address) {
        return this;
    }
}

4.定长字节数组(固定大小字节数组)

定义方式bytesN,其中N可取1~32中的任意整数,bytes1代表只能存储一个字节。一旦声明,其内部的字节长度不可修改,内部字节不可修改

运算符

比较:<=,<,==,!=,>=,>,返回值为bool类型。

位运算符:&,|,^(异或),~非

支持序号的访问,与大多数语言一样,取值范围[0, n),其中n表示长度。

注:

可以通过 .length返回字节个数,可以通过索引读取对应索引的字节。

5.枚举(Enums)

枚举类型是在Solidity中的一种用户自定义类型。

enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }

ActionChoices 可以理解为一个自定义的整型,当枚举数量不够多时默认类型为uint8,此例子中可以理解成uint8,当枚举数量足够多时,他会自动变成uint16。

6.函数

  • 可以将一个函数赋值给一个变量,一个函数类型的变量。
  • 还可以将一个函数作为参数进行传递。
  • 也可以在函数调用中返回一个函数。

:函数调用方式有两种;internal和external。(这里的external是调用方式,不要访问权限中的那个混淆)

内部函数(internal) –默认是这种类型

因为不能在当前合约的上下文环境以外的地方执行,内部函数只能在当前合约内被使用。如在当前的代码块内,包括内部库函数,和继承的函数中。

外部函数(External)–调用此函数需要用this:这个this是指合约。

外部函数由地址和函数方法签名两部分组成。可作为外部函数调用的参数,或者由外部函数调用返回。

pragma solidity ^0.4.5;
contract FuntionTest{
    function internalFunc() internal{}
    function externalFunc() external{}
    function callFunc(){
        //直接使用内部的方式调用
        internalFunc();
        //不能在内部调用一个外部函数,会报编译错误。
        // externalFunc();
        //不能通过`external`的方式调用一个`internal`
        //this.internalFunc();
        //使用`this`以`external`的方式调用一个外部函数
        this.externalFunc();
    }
}
contract FunctionTest1{
function externalCall(FuntionTest ft){
    //调用另一个合约的外部函数
    ft.externalFunc();
    //不能调用另一个合约的内部函数
    //ft.internalFunc();
    }
}

补:回退函数 fallback:

每一个合约有且仅有一个没有名字的函数。这个函数无参数,也无返回值。当调用的函数找不到时,就会调用默认的 fallback 函数

pragma solidity ^0.4.0;
contract SimpleFallback{
  function(){
    //fallback function
  }
}

下一章:Solidity 值类型与引用类型

solidity是一个静态类型的语言,在编译时需要明确指定变量的类型,本章将介绍solidity中值类型与引用类型。1.值类型值类型包含: 布尔(Booleans)整形(Integer)浮点型( ...