智能合约的开发中常常会用到随机数,例如 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
- 这是一个游戏,如果你能猜到从块哈希和时间戳生成的伪随机数就赢;
本文探讨了智能合约开发中使用随机数的安全问题,特别是基于区块链变量的随机数生成方式。通过分析合约示例GuessTheRandomNumber及其攻击合约Attack,揭示了在相同区块内使用block.number和block.timestamp生成随机数的漏洞。修复建议包括避免使用区块变量作为种子,改用预言机获取随机数以提高安全性。
订阅专栏 解锁全文
888

被折叠的 条评论
为什么被折叠?



