时间戳和区块哈希在一定程度上都可能受到挖矿矿工影响。例如,挖矿社区中的恶意矿工可以用某个给定的哈希来运行赌场合约的 payout 函数,而如果他们没收到钱,还可以用一个不同的哈希重新尝试。
以太币单位(Ether)
甭管是虚拟货币还是现实中的“稳定币”
,他们都有各自的货币单位。当然咯,作为以太坊
区块链上交易的虚拟货币以太坊
也是有属于自己的那一套货币单位的。
而目前以太币(Ether)
主要分为这三个:wei
、gwei
以及ether
。或许您之前还见过 finney
和 szabo
,但这两个早在solidity 0.7.0
就被删除了,而gwei
却是solidity 0.6.11
新添加的!
使用起来很容易,便是在数字
后边跟上这些以太币单位
,当然,数字与以太币单位之间需要空格隔开的,这一点想必您应该是清楚的吧!
若没加以太币单位
,那么它缺省为wei
。
assert(1 wei == 1);
assert(1 gwei == 1e9);
assert(1 ether == 1e18);
关于assert
的用法,我们后续会讲到,可以理解为断言
,用于判断表达式是否为true
,反之则抛出错误!
时间单位
说到时间单位
,您肯定会想到生活中的时(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
uint today = 今天的时间戳;
uint tomorrow = today + 1 days;
特殊变量(全局变量)
它们是 Solidity 在全局命名空间 预设的一些变量和函数,用于获取区块链信息和一些通用的工具函数。
区块和交易属性
blockhash(uint blockNumber) returns (bytes32)
:指定区块的区块哈希 —— 仅可用于最新的 256 个区块且不包括当前区块,否则返回 0 。block.basefee
(uint
): 当前区块的基础费用block.chainid
(uint
): 当前链 idblock.coinbase
(address
): 挖出当前区块的矿工地址block.difficulty
(uint
): 当前区块难度block.gaslimit
(uint
): 当前区块 gas 限额block.number
(uint
): 当前区块号block.timestamp
(uint
): 自 unix epoch 起始当前区块以秒计的时间戳gasleft() returns (uint256)
:剩余的 gasmsg.data
(bytes
): 完整的 calldatamsg.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
的别名) 被移除了。