Nervos Fans

RANDAO:以太坊DAO 随机数生成器

2018-09-18  本文已影响41人  526ba0512193

每晚八点,我们在社区分享知识,等你。

NervosFans 微信公号:Nervosfans

入群请加乐乐微信:sensus113 美果大冰微信:xj73226

备注入群,谢谢!


### 随机数在编程中很重要。

确定性系统中实现RNG很难。

别信矿工!


一枚任何人都能参与,大家一起生成随机数的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。

    3.1 参与者未能在第二阶段披露s时,第一阶段发送的m个ETH被没收且不提供任何回报。

    3.2 第二阶段有一个或多个s未披露时,此块高度的RNG失败。没收的ETH被均分成等份发予在第二阶段中披露s的其他参与者。其他合约支付的费用予以退还。


激励机制

RNG周期很短,譬如可以是一小时20个周期,若一个周期的利润为0.001%,则月收益率最高为0.00001 * 20 * 24 * 30 = 0.144。假设月收益率为14.4%,RNG平均有n位参与者,则合约的运行成本为n * 3 * 500 * gasPrice + Ccost。(Ccost指合约内部消耗的gas,包括计算和存储等。)假设每个随机数平均有r次请求,则调用价格为p ETH,收入为r * p。则每位参与者单次参与可获rp - 1500n * gasPrice - Ccost/n。当前gas价格为10 szabo,合约消耗gas估计值为1500n

gas,则净收入估计值为rp / n - 0.03ETH。假设每轮RNG有10位参与者,押金1000ETH,则最低收入为0.4ETH,那么此情形下利润率大于0.001%。因此,若RNG仅被请求一次,则服务价格为0.4ETH,请求10次,则单个请求的价格仅为0.04ETH。

RANDAO充当了以太坊系统的基础设施,被其他合约调用。不同用途的合约需要的随机数不同:有些强调较高的安全性,比如彩票;有些强调稳态响应且需即时响应请求,此类合约的价值通常都比较低;有些需要回调,意思是希望在数字准备就绪时收到随机数通知。

仅有一个RNG合约显然不能满足各种情形下的不同要求,因此会有大量初始参数不同的合约被创建,但是基本规则是一样的。

譬如说,需要高级别安全性的话,可以大大增加第一阶段的押金数量。 如此,不披露s导致RNG过程失败的成本也随之增加。对于那些并不涉及大量利益的合约,可以调低参与人数最低门槛以及押金数量。

我们拿投注奇偶数的dApp做例子,展示下如何通过使作弊成本高于预期收益来调整合约参数以满足所需的安全级别。假设下注金额为1000ETH,下注合约调用RNG合约C1,C1未能在请求的块高度生成随机数时,下注合约等待C1的下个随机数,一直等到生成随机数为止。

下面,来创建RNG合约C1,将C1的押金数额设置为2000ETH。玩家G既参与下注又参与生成随机数(RNG合约C1)。G在披露秘密数字s前察觉到自己处于劣势时,可以选择不披露s,于是RNG失败,玩家G下轮还有机会。但是这样做会失掉2000ETH的押金,所以即便G后面能拿到1000ETH的回报,无任何经济意义。但是,G可以借助些手段降低自己在C1上的损失,比方说用两个账户参与C1,发送两个sha3(s)。处于劣势时,G只披露一个账户的秘密,假设参与C1的有两个人,那么G在C1中只失掉1000 ETH,但是能获得1000ETH的预期回报,所以还是值得一exploit的。

这个问题可以通过完全没收押金ETH的方式解决,意思是罚金不作奖励发予参与者。因此1000ETH押金的合约可以满足投注dApp的要求。

除了没收以外,还有另一种通过引入附加系统来防止此类攻击的方案:RANDAO会员。要成为会员,必须缴纳会费,缴纳会费的人就是会员。不同级别的会员,需要支付的缴纳的会费也不同。会员资格不属于合约范畴,作用类似参与某些RANDAO合约的护照。出现违约时,违约人的会员资格被终止并没收会费。所以,可以向C1追加一个协定:C1仅接受由投资额足够高的会员(高级会员)提交的数字(比方说会费超过1000ETH)。如此,借助经济手段降低人们发送攻击的热情。


QA:

Q:为何不让矿工参与RNG?为何不使用tx hash、随机数以及其他区块链数据?

A:矿工有能力操纵这些区块链数据,因此能够间接影响RNG。若RNG包含区块链数据,会使矿工有能力构建对其有利的随机数。

Q:如何处理‘矿工忽略某些包含自己不喜欢随机数的交易’?

A:时间窗口就是专门应对这个问题的。合理的时间段应大于6个区块,原因是我们认为没人能连续出6个块。因此,若参与者诚实且在时间窗口打开时即刻发送数字,就不需要担心会被排挤。

Q:RNG为何必须拉上全部参与者,参与者子集是否可行?

A:子集选择规则是确定性的,因此参与者有N种方法占据集合中的某特定位置,一旦成功,就能提前获悉子集生成的随机数。即便子集选择规则是随机的,也依旧存在真正随机化的问题。

Q:会员费跑到哪里去了?

A:捐给慈善或作RANDAO经费。

注:f(s1,s2,...,sn)是有多个输入的函数,例如r = s1 xor s2 xor s3 ... xor sn, 或r = sha3(sn + sha3(sn-1 + ... (sha3(s2 + s1))))


https://github.com/randao/randao

上一篇下一篇

猜你喜欢

热点阅读