区块链中的随机性为何很重要
扫描二维码
随时随地手机看文章
许多现代的区块链协议,包括near,都依赖随机性的来源来选择在协议中执行某些操作的参与者。如果恶意参与者能够影响这种随机性源,他们就可以增加被选中的机会,并可能危及协议的安全性。
分布式随机性也是构建在区块链上的许多分布式应用程序的重要组成部分。例如,一个智能合约接受参与者的下注,并以49%的比例支付两倍的金额,而以51%的比例不支付,它假设它可以得到一个不可破解的随机数。如果恶意参与者能够影响或预测随机数,他们就可以增加在智能合约中获得付款的机会,并将其耗尽。
当我们设计分布式随机性算法时,我们希望它有三个属性:
1. 它必须是不操控的。换句话说,任何参与者都不能以任何方式影响随机生成器的结果。
2. 它必须是不可预测的。换言之,任何参与者都不能预测在生成数字之前将生成什么数字(或其任何属性的原因)。
3. 协议需要容忍一定比例的参与者离线或故意拖延协议。
在本文中,我们将介绍分布式随机信标的基础知识,讨论为什么简单的方法不起作用。最后,我们将介绍dfnity、ethereum serenity和near使用的方法,并讨论它们的优缺点。
RANDAO
Randao是一种非常简单的随机性方法,因此非常常用。一般的想法是网络的参与者首先私下选择一个伪随机数,提交对这种私人选择的数字的承诺,所有人都使用一些共识算法就一些承诺达成一致,然后全部显示他们选择的数字,达到一个 对显示的数字达成共识,并将显示数字的XOR作为协议的输出。
这是不可预测的,与基础共识协议具有相同的活力,但是可偏倚的。具体来说,一旦其他人开始透露他们的数字,恶意的参与者就可以观察网络,并根据目前观察到的数字的异或来选择透露或不透露他们的数字。这允许一个恶意参与者对输出产生一点影响,而控制多个参与者的恶意参与者的影响程度与其控制的参与者数量相同。
RANDAO + VDF
为了使RANDAO不可替换,一种方法是使输出不仅仅是XOR,而是需要花费更多时间来执行而不是分配时间来显示数字。如果最终输出的计算花费的时间长于揭示阶段,则恶意行为者无法预测它们显示或不显示其数量的影响,因此不能影响结果。
虽然我们希望计算随机性的函数为生成随机数的参与者花费很长时间,但我们希望随机数的用户不必再次执行相同的昂贵函数。因此,他们需要以某种方式能够快速验证随机数是否正确生成,而无需重新进行昂贵的计算。
这种计算时间长、验证计算速度快、每个输入都有唯一输出的函数称为可验证延迟函数(简称vdf),结果表明设计一个延迟函数非常复杂。最近有了多项突破,即这一次和这次突破使得它成为可能,以太坊目前计划使用RANDAO和VDF作为随机信标。除了这种方法不可预测和不可替代的事实之外,即使只有两个参与者在线,它还具有活力的额外优势(假设基础共识协议具有如此少的参与者的活力)。
这种方法最大的挑战是,需要以这样的方式配置vdf:即使是拥有非常昂贵的专用硬件的参与者也无法在显示阶段结束之前计算vdf,理想情况下,具有一些有意义的安全边际,比如10倍。下图显示了具有专用ASIC的参与者的攻击,该ASIC允许他们比分配用于显示RANDAO承诺的时间更快地运行VDF。这样的参与者仍然可以在有和没有共享的情况下计算最终输出,并根据这些输出选择显示或不显示:
对于上面的VDF系列,专用ASIC可以比传统硬件快100倍。因此,如果显示阶段持续10秒,则在这样的ASIC上计算的VDF必须花费超过100秒才能具有10倍的安全深度,因此在传统硬件上计算的相同VDF需要花费100 x 100秒= 约3小时。
以太坊基金会计划解决的方法是设计自己的ASIC,并免费公开发布。一旦发生这种情况,所有其他协议都可以利用这项技术,但在此之前,RANDAO + VDFs方法对于无法投资设计自己的ASIC的协议来说并不可行。
门限签名BLS
由Dfinity开创的另一种随机性方法是使用所谓的门限BLS签名。
BLS签名是一种允许多方在消息上创建单个签名的结构,通常用于通过不需要发送多个签名来节省空间和带宽。区块链中BLS签名的常见用法是在BFT协议中对块进行签名。假设100个参与者创建了区块,并且如果其中67个块在其上签名则认为该区块是最终的。他们都可以提交他们的BLS签名部分,然后使用一些共识算法来同意其中的67个,然后将它们聚合成单个BLS签名。任何67个部分都可用于创建累积签名,但是根据汇总的67个签名,生成的签名将不相同。
事实证明,如果参与者使用的私钥是以特定方式生成的,那么无论聚合的是多过67个(或更多,但不是更少)签名,所得到的多重签名都是相同的。这可以用作随机源:参与者首先同意他们将签署的一些消息(它可能是RANDAO的输出,或者只是最后一个区块的散列,只要它是真的无关紧要每次都不同并达成一致),并在其上创建多重签名。直到67个参与者提供他们的部分,输出是不可预测的,但即使在提供第一部分之前,输出已经预先确定并且不受任何参与者的影响。
这种随机性方法是完全不可替代且不可预测的,并且只要有2/3的参与者在线(但可以针对任何阈值进行配置),这种方法是有效的。虽然1/3离线或行为不端的参与者可能会停止算法,但至少需要2/3参与者合作才能影响输出。
不过有一个警告。上面,我提到过这个方案的私钥需要以特定的方式生成。密钥生成的过程称为分布式密钥生成(简称DKG),它非常复杂,是一个非常活跃的研究领域。在最近的一次谈话中,Dfinity提出了一个非常复杂的方法,其中涉及zk-SNARKs,这是一个非常复杂且没有时间测试的加密结构,作为其中一个步骤。通常对阈值签名BLS和DKG的研究并不处于可以在实践中容易应用的状态。
RandShare
NEAR方法受另一种称为RandShare的算法的影响。Randshare是一个不可抗拒的、不可预测的协议,它可以容忍多达_的行为体是恶意的。本文还描述了两种加快速度的方法,称为randhound和randhound,但与randshare本身不同,randhound和randhound相对复杂,而我们希望协议非常简单。
RandShare的一般问题除了交换的大量消息(参与者一起交换O(n^3)消息)之外,事实上虽然1/3是实践中活跃度的有意义阈值,但影响输出能力却很低 。有几个原因:
· 影响输出的好处可能大大超过拖延随机性的好处。
· 如果一个参与者在Randshare中控制了超过1/3的参与者,并使用它来影响结果输出,那么它就不会留下任何痕迹。因此,一个恶意的行动者可以在不被揭露的情况下做到这一点。拖延共识自然是显而易见的。
· 控制1/3的hashpower/staking情况并非不可能,考虑到(1)和(2)以上的控制者不太可能试图阻止这种随机性,但能够并且可能会试图影响这种随机性。
NEAR Approach
NEAR方法在我们最近发表的论文中有所描述。这是不可避免的,不可预测的,并且可以容忍1/3恶意行为者的活力,即如果有人控制1/3或更多的参与者,他们可以停止协议。
然而,与RandShare不同,它可以容忍最多2/3恶意行为者,然后才能影响输出。这对于实际应用来说是明显更好的阈值。
该协议的核心思想如下(为简单起见,假设有100个参与者):
1. 每个参与者提出他们的部分输出,将其分成67个部分,擦除代码以获得100个份额,使得任何67个足以重建输出,将100个份额中的每一个分配给其中一个参与者并使用这种参与者的公钥。然后他们共享所有的编码。
2. 参与者使用一些共识(如:tendermint)从67名参与者中就这些编码集达成一致。
3. 一旦达成一致意见,每个参与者将以公开密钥编码的方式发布的67个集合中的每一个集合中的编码共享,然后解码所有这些共享,并立即发布所有这些解码共享。
4. 一旦至少67个参与者完成了步骤(3),所有商定的集合可以被完全解码和重建,并且最终的数量可以作为参与者在(1)中提出的初始部分的XOR获得。
这个协议不可破解和不可预测的原因类似于随机共享和门限签名:一旦达成共识,就可以决定最终的输出,但直到有个参与者解密用其公钥加密的共享,任何人都不知道最终的输出。
处理所有极端情况和可能的恶意行为使其稍微复杂一些(例如,当步骤(1)中的某个人创建了无效的擦除代码时,参与者需要处理这种情况),但总的来说整个协议非常简单,用所有证明描述它的整篇论文,相应的加密原语和参考只有7页长。
类似的利用纠删码的想法已经在NEAR的现有基础设施中使用,其中特定时期的块生成器创建包含特定分片的所有事务的所谓块,并且分发这样的块的擦除编码版本。 merkle向其他区块生产商提供证据以确保数据可用性。