数据类型
值类型
布尔
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和delegatecalladdress 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. 顺序随意.
####