智能合约的开发中常常会用到随机数,例如 Lottery 和现在流行的 NFT 数字藏品的属性等都需要用到随机数。目前来说常见的随机数获取有两种:使用区块变量生成随机数,使用预言机来生成随机数。
使用区块变量生成随机数,常见的区块变量有:
- 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 纪元以来的当前区块时间戳(以秒为单位)
- blockhash(uint blockNumber) returns (bytes32):给定区块的哈希
其中 block.difficulty, blockhash, block.number 和 block.timestamp 这四个是用得比较多的。
1.合约示例
一个随机数合约 GuessTheRandomNumber
- 这是一个游戏,如果你能猜到从块哈希和时间戳生成的伪随机数就赢;
一个攻击合约 Attack
- 攻击通过简单复制计算随机数的代码来计算正确答案;
// SPDX-Li