以太坊智能合约中经常需要随机数(尤其是博彩应用),我怎样才能安全地生成一个随机数? 有什么好的做法和安全权衡需要考虑?
用户做出任何影响结果的决定都会给用户带来不公平的优势。 如:
一切合约上的数据都是公开的。
EVM不会快过物理计算机。
完全去中心的彩票方案(也许扩展不好):
赌场为一个随机数字预留了奖励
每个用户生成自己的秘密随机数 N
用户计算N
和地址的Hash : bytes32 hash = sha3(N,msg.sender)
注意: 2 和 3 应该在离线的安全环境下执行
发送上一步生产的 hash 给合约(尽管可能hash数据量比 N
大)
其他的用户继续按同样的方法提交各自的hash, 知道回合结束。
需要所有的提交完成之后,才进行开奖环节。
每个用户向合约提交之前生成的随机数 N
。
合约根据hash值验证随机数 N
,使用同样的方法 sha3(N,msg.sender)
,无法通过验证的 N
,可以没收罚金。
可以考虑所有有效的 N
在一起生成一个最终的随机数。
用这个随机数来决定谁可以获奖。
一个例子: RANDAO
深入浅出区块链 - 系统学习区块链,学区块链的都在这里,打造最好的区块链技术博客。