智能合约的开发中常常会用到随机数,例如 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

  1. 这是一个游戏,如果你能猜到从块哈希和时间戳生成的伪随机数就赢;

一个攻击合约 Attack

  1. 攻击通过简单复制计算随机数的代码来计算正确答案;
// SPDX-Li