Solidity 之旅(七)单位以及全局变量

01
以太币单位(Ether)
甭管是虚拟货币还是现实中的“稳定币”,他们都有各自的货币单位。当然咯,作为以太坊区块链上交易的虚拟货币以太坊也是有属于自己的那一套货币单位的。
而目前以太币(Ether)主要分为这三个:wei、gwei 以及 ether。或许您之前还见过 finney 和 szabo,但这两个早在 solidity 0.7.0 就被删除了,而 gwei 却是 solidity 0.6.11 新添加的!
使用起来很容易,便是在数字后边跟上这些以太币单位,当然,数字与以太币单位之间需要空格隔开的,这一点想必您应该是清楚的吧!
若没加以太币单位,那么它缺省为 wei。
关于 assert 的用法,我们后续会讲到,可以理解为断言,用于判断表达式是否为 true,反之则抛出错误!
02
时间单位
说到时间单位,您肯定会想到生活中的时(hour)、分(minute)、秒(second)以及天(day)、周(week)。
Solidity 时间单位有:seconds、minutes、hours、days 和 weeks,seconds 是时间的缺省单位。
早期版本(solidity 0.5.0 之前但不包括)还有一个 years 用来表示年的时间,由于闰年的缘故,便废除了。
1 == 1 seconds
1 minutes == 60 seconds
1 hours == 60 minutes
1 days == 24 hours
1 weeks == 7 days
03
特殊变量(全局变量)
它们是 Solidity 在全局命名空间 预设的一些变量和函数,用于获取区块链信息和一些通用的工具函数。
04
区块和交易属性
blockhash(uint blockNumber) returns (bytes32):指定区块的区块哈希 —— 仅可用于最新的 256 个区块且不包括当前区块,否则返回 0 。
block.basefee(uint):当前区块的基础费用
block.chainid(uint):当前链 id
block.coinbase(address):挖出当前区块的矿工地址
block.difficulty(uint):当前区块难度
block.gaslimit(uint):当前区块 gas 限额
block.number(uint):当前区块号
block.timestamp(uint):自 unix epoch 起始当前区块以秒计的时间戳
gasleft() returns(uint256):剩余的 gas
msg.data(bytes):完整的 calldata
msg.sender(address):消息发送者(当前调用)
msg.sig(bytes4):calldata 的前 4 字节(也就是函数标识符)
msg.value(uint):随消息发送的 wei 的数量
tx.gasprice(uint):交易的 gas 价格
tx.origin(address):交易发起者(完全的调用链)
不要依赖 block.timestamp 和 blockhash 产生随机数,除非你明确知道自己做的用意。
时间戳和区块哈希在一定程度上都可能受到挖矿矿工影响。例如,挖矿社区中的恶意矿工可以用某个给定的哈希来运行赌场合约的 payout 函数,而如果他们没收到钱,还可以用一个不同的哈希重新尝试。
当前区块的时间戳必须严格大于最后一个区块的时间戳,但这里能确保也需要它是在权威链上的两个连续区块。
在 Solidity 0.7.0, now(block.timestamp 的别名)被移除了。

版权声明:本文为 CSDN 博主「甄齐才」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/coco2d_x2014/article/details/128311510
想学习更多有关区块链的文章请关注微信公众号:BSN 研习社
评论