Solidity翻译笔记3-数据类型

数据类型

值类型

布尔

bool, truefalse.

运算符:

  • ! (逻辑否定)
  • && (逻辑与, “and”)
  • || (逻辑或, “or”)
  • == (相等)
  • != (不等)

||&& 是惰性运算.

整型

int / uint 默认是 int256 / uint256.
intMuintM 中 M 必须以 8 位步长的 8-256 中的值.

运算符:

比较运算符: <=, <, ==, !=, >=, >, 返回 bool 类型
位运算符: &, |, ^ (按位或), ~ (按位取反)
算数运算符: +, -, 一元 -, 一元 +, *, /, % (取余), ** (幂运算), << (左移), >> (右移)

整数除法会舍去小数部分; 位移运算符号看左面数 x, 右面数必须大于 0.

正数四舍五入: 4.6 => 5, 4.4 => 4;
Solidity 负数四舍五入: -4.6 => -4, -4.4 => -5
其他语言负数四舍五入: -4.6 => -5, -4.4 => -4

定点数, 暂不完全支持.

注意与浮点数区别: 小数点左右位数都是定义好的.

ufixedfixed 默认是 ufixed128x19fixed128x19.
ufixedMxNfixedMxN 中 M 表示整数部分长度, N 表示小数部分长度. M 必须以 8 位步长的 8-256 中的值, N 为 [0-80] 之间.

  • 比较运算符: <=, <, ==, !=, >=, > (结果为 bool 类型)
  • 算数运算符: +, -, 一元 -, 一元 +, *, /, % (取余)

地址类型

address 一个 20 位的值, Ethereum 中地址指针.

一般表示账户, 合约…

  • balance 查询地址的余额
  • transfer 转账

address x = 0x123;
address myAddress = this;
if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);

如果 x 是一个合约地址, 合约代码(的回调方法)将协同 transfer 方法执行 (这是 EVM 的特性无法避免).
如果对应的回调没有足够的 gas 或者因为其他原因失败了, 转账金额将会退到发起账户, 当前合约也会报错终止.

  • send 底层转账

transfer 相同, 只是报错不退出, 只是 send 方法返回一个 false 等待手动处理.
安全转账建议使用 transfer

  • call, callcodedelegatecall

    address nameReg = 0x123;

    nameReg.call(“register”, “MyName”);
    nameReg.call(bytes4(keccak256(“fun(uint256)”)), a);
    nameReg.call.gas(1000000).value(1 ether)(“register”, “MyName”);

call 返回 true 表示执行成功结束, false 表示引起了 EVM 错误. 无法访问被调用函数的返回值(原因需要深入理解编码和 size).
可以使用 .gas().value() 指定用的 gas 和 ether. 顺序随意.

####

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.