以太单位
一个数字字面量可以采用 wei、gwei 或 ether 的后缀来指定 Ether 的子面额,其中没有后缀的以太数字被假定为 Wei。(gwei 是gasPrice常用单位)
function test() public pure returns (bool, bool, bool) {
return(1 wei == 1, 1 gwei == 1e9, 1 ether == 1e18);
}
后缀e的唯一效果是乘以十的幂次方,是1 ether = 1*10**18 wei的科学记数法。
其它单位之间的转换关系如图:
0.7.0 版中删除了 finney 和 szabo 面额单位。
时间单位
数字字面量跟着的seconds
, minutes
, hours
, days
and weeks
等后缀可用于指定具体的单位时间,seconds是基本单位,以下是各单位之间的换算:
1 == 1 seconds
1 minutes == 60 seconds
1 hours == 60 minutes
1 days == 24 hours
1 weeks == 7 days
请注意!如果您使用这些单位执行日历计算,因为不是每年都等于 365 天,而且由于闰秒,甚至每天不都有 24 小时。由于无法预测闰秒,因此必须由外部预言机更新精确的日历库。
由于上述原因,后缀year已在 0.5.0 版本中删除。
这些后缀不能应用于变量。例如如果你想解释一个以days为单位函数参数,可以通过以下方式:
function f(uint start, uint daysAfter) public {
if (block.timestamp >= start + daysAfter * 1 days) {
// ...
}
}
全局变量
智能合约中有特殊变量和函数始终存在于全局命名空间中,主要用于提供有关区块链的信息或者是普通使用的实用程序功能。
区块和事务属性
所有与msg相关的成员属性值,包括msg.sender和msg.value都会随着外部函数的调用而改变。对库函数调用也是如此。
当合同在链外而不是在区块中包含的交易上下文中进行评估时,您不应假设block.*和tx.*去指任意特定区块或事务的值。这些值由执行合约的EVM实现提供,可以是任意的。
不要依赖
block.timestamp
、now
和blockhash
产生随机数,除非你知道自己在做什么。时间戳和区块哈希在一定程度上都可能受到挖矿矿工影响。例如,挖矿社区中的恶意矿工可以用某个给定的哈希来运行赌场合约的 payout 函数,而如果他们没收到钱,还可以用一个不同的哈希重新尝试。
当前区块的时间戳必须严格大于最后一个区块的时间戳,但这里唯一能确保的只是它会是在权威链上的两个连续区块的时间戳之间的数值。
blockhash函数以前称为block.blockhash,它在版本0.4.22中弃用,并在版本0.5.0中删除。
gasleft先前已知为msg.gas,其在0.4.21版中弃用,并在0.5.0版中删除。
在版本0.7.0中,删除了now(block.timestamp)的别名。
参考文档:Units and Globally Available Variables — Solidity
最后安利一个solidity视频学习资源:https://www.bilibili.com/video/BV1j34y167mx?p=24