关于智能合约随机数的讨论

如何在合约中安全地生成一个随机数

在这个领域需要记住一些权衡和关键点。

  1. 用户做出的任何可以影响结果的决定,都会给该用户带来的优势。例子包括:

    1. 使用blockhash,timestamp或其他矿工定义的值。 请记住,矿工可以选择是否发布一个区块,因此他们可以假设每个区块有一次机会获得奖金。
    2. 任何用户提交的随机数。 即使用户预先提交了一个号码,他们也可以选择是否显示该号码。
  2. 公众可以看到合约里的一切。

    • 这意味着在开奖之前都不应该生成该号码。
  3. EVM不会超越物理计算机。

    合约生成的任何数字可能在该块出块之前已知。要在数字的生成和使用之间留出时间。

技术方面:

完全去中心化的彩票式非可延展承诺:

  1. 赌场为随机数留出奖励
  2. 每个用户生成他们自己的秘密随机数 N
  3. 用户通过用他们的地址和哈希后的N来创建他们的承诺: bytes32 hash = sha3(N, msg.sender) 注意:步骤2和3应在本地秘密进行
  4. 用户将其哈希值发送给合约,以及大于或等于随机数值的 eth
  5. 提交的内容将持续一定数量的块,或者直到有足够的参与者加入。 一旦提交轮次结束,揭幕轮开始。
  6. 每个用户将其随机数N提交给合约
  7. 合约验证 sha3(N,msg.sender) 是否与原始提交匹配 如果用户未及时提交有效N,则他的之前给的eth将被没收。
  8. N全部都是或(&&)的逻辑,以生成结果随机数。
  9. 该数字用于确定哪些参与者获得奖励。 (N % numUsers))

备注和备选方案:

  1. 用户必须在哈希之前将其地址连接到 N .否则,另一个用户可以简单地提交相同的哈希值,然后等待 N 显示,然后提交。 N XOR N 等于0,因此可以用来取消除攻击者之外的所有提交。

  2. 这是权衡取舍的地方。最后一个透露他们的 N 的人可以选择是否透露或不透露。这实际上给了他们获胜的双倍机会。输入足够的时间,您将获得每个条目的新选择。提示:矿工选择了一个区块中的交易顺序。为了阻止这种情况,用户必须提供大额保证金,等于通过操纵随机数获得的价​​值。对于许多用户来说这可能是一个问题,特别是对于大型累积奖金,即使是游戏理论上的优化。

    • 常用的替代方案是半集中式系统。这需要“管理员”提交第一个哈希和最后一个显示。如果管理员不履行职责,每个人的以太币都会被退回。这会产生一些问题,例如如果即将支付累积奖金,房子选择剥落。这个想法是房子的声誉受到威胁。
      • 请注意,这基本上集中了整个系统。人们只需要拆掉房子就可以关闭整个操作。通过雇用多个可信赖的非玩家作为第一个/最后一个通勤者,可以降低这种风险。
    • 另一个技巧是使用聘请的专业第三方为您“挖掘”随机性,这样玩家就不必为此过程烦恼。
  3. 奖励是必要的,以促进参与者之间的竞争。它导致了一个典型的公地悲剧/囚徒困境。参与者之间的勾结将允许他们赢得一个大蛋糕并将其瓜分,但如果每个人都知道其他人将提交什么,他们就知道他们自己应该提交什么以赢得奖励。因此,如果奖励大于随机数的值除以玩家的数量,则每个人都被激励以保持他们自己的号码是秘密的,以便更好地获得奖励。请注意,只有一个参与者需要提交一个好的随机数,结果将是不可预测的。


觉得文章不错就扫码支持一下呗~

打赏二维码

参考链接