智能合约基础3

132 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

单位和全局可用变量

在智能合约的代码中,是含有单位的。

1、以太单位

文字数字可以采用 后缀weigweiether指定 Ether 的子面额,其中不带后缀的 Ether 数字被假定为 Wei。

assert(1 wei == 1);
assert(1 gwei == 1e9); //1后面9个0
assert(1 ether == 1e18); //1后面18个0

2、时间单位

字面值后的后缀如secondsminuteshoursdays 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可以为每个外部函数调用而改变。这包括对库函数的调用。