本文已参与「新人创作礼」活动,一起开启掘金创作之路。
单位和全局可用变量
在智能合约的代码中,是含有单位的。
1、以太单位
文字数字可以采用 后缀wei
,gwei
或ether
指定 Ether 的子面额,其中不带后缀的 Ether 数字被假定为 Wei。
assert(1 wei == 1);
assert(1 gwei == 1e9); //1后面9个0
assert(1 ether == 1e18); //1后面18个0
2、时间单位
字面值后的后缀如seconds
, minutes
, hours
, days
and weeks
可以用来指定时间单位,其中秒是基本单位。
1 == 1 seconds
1 minutes == 60 seconds
1 hours == 60 minutes
1 days == 24 hours
1 weeks == 7 days
提示:如果您使用这些单位执行日历计算,请小心,因为并非每年都等于 365 天,而且由于闰秒,甚至每天都有 24 小时。由于无法预测闰秒,因此必须由外部预言机更新精确的日历库。并且,这些后缀不能用于变量
如果想以days
为单位解释一个函数参数,你可以通过以下方式:
function f(uint start, uint daysAfter) public {
if (block.timestamp >= start + daysAfter * 1 days) { //在开始的多少天后然后与时间戳进行对比。
// ...
}
}
3、特殊变量和函数
blockhash(uint blockNumber) returns (bytes32)
//给定块的哈希值,当`blocknumber`它是 256 个最近的块之一时;否则返回零,也就是说,他只返回最新的256个块中的一个
block.basefee( uint)
//当前区块的基本费用
block.chainid(uint)
//当前链 id
block.coinbase()
//当前区块矿工地址,返回address payable类型
block.difficulty( uint)
//当前区块难度
block.gaslimit( uint)
// 当前区块gaslimit
block.number(uint)
//当前区块号
block.timestamp( uint)
//当前区块的时间戳,自 unix 纪元以来的秒数
gasleft() returns (uint256)
//剩余气体
msg.data()
//完整的通话数据bytes calldata
msg.sender( address)
//消息的发送者(当前通话),该全局变量使用的非常频繁,基本每一个项目的智能合约中都存在。
msg.sig( bytes4)
//calldata 的前四个字节(即函数标识符)
msg.value(uint)
//随消息发送的 wei 数量
tx.gasprice( uint)
//交易的gas价格
tx.origin( address):
//交易的发送者(完整的调用链)
提示:msg.sender
和 msg.value
可以为每个外部函数调用而改变。这包括对库函数的调用。