在确定性系统实现随机数-Randao机制

问题

如何在区块链系统中使用随机数
最简单的实现是使用当前状态信息处理后作为随机数的seed使用。例如:在solidity中使用blockhash、时间戳等信息处理后作为seed。
但是矿工有能力操纵这些区块链数据,因此能够间接影响随机数。若随机数包含区块链数据,会使矿工有能力构建对其有利的随机数。

规则

一枚任何人都能参与,大家一起生成随机数的DAO(去中心化自治组织)!首先,需要在区块链中创建一个RANDAO合约,定义参与规则。生成随机数的基本过程可以分为三个阶段:

第一阶段:收集有效sha3(s)

想要参与生成随机数的人需要在指定时间段内(例如,6个区块期间,约72s)向合约C发送m个ETH做抵押并附上sha3(s)的结果,s为参与者自选的秘密数字。

第二阶段:收集有效s

第一阶段后,成功提交sha3(s)的人要在第一阶段指定时间内向合约C发送一笔带有秘密数字s的交易。合约C会对s运行sha3运算并将结果与先前提交的数据进行比较,检查s是否有效。有效s将被保存到种子集合中,最终生成随机数。

第三阶段:计算随机数、退还押金及奖金

  1. 成功收集全部秘密数字后,合约C根据函数f(s1,s2,…,sn)计算出随机数,计算结果会被写入C的存储并发送到之前请求随机数的其他合约。

  2. 合约C在第一阶段将押金返还给参与者,并将利润分成相等份作为额外奖励发给全部参与者。收益指消耗随机数的其他合约所支付的费用。

附加规则

为确保RNG不受操纵,同时出于安全和效率考量,合约C有以下附加规则:

  1. 第一阶段中,超过两个相同sha3(s)按顺序提交时,接受第一个。

  2. 第一阶段中,设参与人数最低门槛,该时间段内未能收集足够sha3时,该区块高度的RNG失败。

  3. 参与者提交sha3(s)被合约C接受时,须在第二阶段中披露该s。

    1. 参与者未能在第二阶段披露s时,第一阶段发送的m个ETH被没收且不提供任何回报。
    2. 第二阶段有一个或多个s未披露时,此块高度的RNG失败。没收的ETH被均分成等份发予在第二阶段中披露s的其他参与者。其他合约支付的费用予以退还。

drand 分布式随机信标守护进程

https://github.com/drand/drand