数据类型
值类型
布尔
bool
, true
和 false
.
运算符:
!
(逻辑否定)&&
(逻辑与, “and”)||
(逻辑或, “or”)==
(相等)!=
(不等)
||
和 &&
是惰性运算.
整型
int
/ uint
默认是 int256
/ uint256
.intM
和 uintM
中 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
定点数, 暂不完全支持.
注意与浮点数区别: 小数点左右位数都是定义好的.
ufixed
和 fixed
默认是 ufixed128x19
和 fixed128x19
.ufixedMxN
和 fixedMxN
中 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
,callcode
和delegatecall
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. 顺序随意.
####