关于智能合约随机数的讨论
如何在合约中安全地生成一个随机数
在这个领域需要记住一些权衡和关键点。
-
用户做出的任何可以影响结果的决定,都会给该用户带来的优势。例子包括:
- 使用blockhash,timestamp或其他矿工定义的值。 请记住,矿工可以选择是否发布一个区块,因此他们可以假设每个区块有一次机会获得奖金。
- 任何用户提交的随机数。 即使用户预先提交了一个号码,他们也可以选择是否显示该号码。
-
公众可以看到合约里的一切。
- 这意味着在开奖之前都不应该生成该号码。
-
EVM不会超越物理计算机。
合约生成的任何数字可能在该块出块之前已知。要在数字的生成和使用之间留出时间。
技术方面:
完全去中心化的彩票式非可延展承诺:
- 赌场为随机数留出奖励
- 每个用户生成他们自己的秘密随机数 N
- 用户通过用他们的地址和哈希后的N来创建他们的承诺:
bytes32 hash = sha3(N, msg.sender)
注意:步骤2和3应在本地秘密进行 - 用户将其哈希值发送给合约,以及大于或等于随机数值的 eth
- 提交的内容将持续一定数量的块,或者直到有足够的参与者加入。 一旦提交轮次结束,揭幕轮开始。
- 每个用户将其随机数N提交给合约
- 合约验证
sha3(N,msg.sender)
是否与原始提交匹配 如果用户未及时提交有效N,则他的之前给的eth将被没收。 - N全部都是或(&&)的逻辑,以生成结果随机数。
- 该数字用于确定哪些参与者获得奖励。
(N % numUsers))
备注和备选方案:
-
用户必须在哈希之前将其地址连接到
N
.否则,另一个用户可以简单地提交相同的哈希值,然后等待N
显示,然后提交。N XOR N
等于0,因此可以用来取消除攻击者之外的所有提交。 -
这是权衡取舍的地方。最后一个透露他们的 N 的人可以选择是否透露或不透露。这实际上给了他们获胜的双倍机会。输入足够的时间,您将获得每个条目的新选择。提示:矿工选择了一个区块中的交易顺序。为了阻止这种情况,用户必须提供大额保证金,等于通过操纵随机数获得的价值。对于许多用户来说这可能是一个问题,特别是对于大型累积奖金,即使是游戏理论上的优化。
- 常用的替代方案是半集中式系统。这需要“管理员”提交第一个哈希和最后一个显示。如果管理员不履行职责,每个人的以太币都会被退回。这会产生一些问题,例如如果即将支付累积奖金,房子选择剥落。这个想法是房子的声誉受到威胁。
- 请注意,这基本上集中了整个系统。人们只需要拆掉房子就可以关闭整个操作。通过雇用多个可信赖的非玩家作为第一个/最后一个通勤者,可以降低这种风险。
- 另一个技巧是使用聘请的专业第三方为您“挖掘”随机性,这样玩家就不必为此过程烦恼。
- 常用的替代方案是半集中式系统。这需要“管理员”提交第一个哈希和最后一个显示。如果管理员不履行职责,每个人的以太币都会被退回。这会产生一些问题,例如如果即将支付累积奖金,房子选择剥落。这个想法是房子的声誉受到威胁。
-
奖励是必要的,以促进参与者之间的竞争。它导致了一个典型的公地悲剧/囚徒困境。参与者之间的勾结将允许他们赢得一个大蛋糕并将其瓜分,但如果每个人都知道其他人将提交什么,他们就知道他们自己应该提交什么以赢得奖励。因此,如果奖励大于随机数的值除以玩家的数量,则每个人都被激励以保持他们自己的号码是秘密的,以便更好地获得奖励。请注意,只有一个参与者需要提交一个好的随机数,结果将是不可预测的。
觉得文章不错就扫码支持一下呗~