以太坊 2.0:随机性
本文中,我们将谈及随机数 (random numbers) 以及如何在以太坊2.0中实现随机性。什么是 RANDAO?什么是 VDF (可验证延迟函数)?它们又是如何一起运作的?
信标链 (beacon chain) 如何决定轮到哪些验证者 (validator) 来提议区块,以及哪些验证者应该对该提议进行证明 (attest)?在以太坊2.0系统中的 1,024 条分片链和成千上万名活跃验证者之间,信标链是如何在任何特定时间做出这一决定的呢?
信标链需要的是随机性 (randomness)!
计算机中的随机性
计算机是无法生成真正的随机数的。
你可以这么来理解:计算机 (computer) 是一种机器,给定相同的输入,总是会生成相同的输出。它们就是计算的机器,就好像一台计算器不能让2与2相加得到5一样 (除非是恶作剧或机器受到严重损坏)。
为了生成一个合理的随机数,计算机将依赖于 seed (种子):即计算的起点,用于获取输出的输入 (input)。种子可以是屏幕上鼠标光标的移动,也可以是维基百科数据库的所有内容。在种子之上,计算机将执行数学运算并最终得出一个人类无法预测的数字。
即使现在,如果你访问 BitAddress (开源JavaScript比特币钱包工具) 网站 (https://www.bitaddress.org/),当你移动鼠标时,你会注意到“seed”将相应地发生变化,这是网站正在通过你的鼠标不规则移动中“搜集随机性”,见下图:
备注:继续移动鼠标,当图中的百分百达到100%时,就可以生成一个比特币钱包
如果我们在生成种子时总是应用相同的数学方法处理,那我们如何能将之称为随机的呢?最重要的是,当足够多的难以重复的种子放在一起时,得到的随机数就会是相当随机的。人们是无法在一个500万像素屏幕区域重复完全一样的鼠标运动轨迹的,因此这在某种程度上是可靠的。
如果再加上一些其他的数值,比如一天中的时间,或者像 Cloudflare 那样使用熔岩灯产生伪随机数 (见下图),也许还有某个运动队当年进球的次数,这样你就得到了一个相当随机的种子(seed)。
备注:Cloudflare 是一家提供安全服务的云服务商,向客户提供了免费的 SSL 服务。因为要处理海量的加密流量,它需要使用到大量的随机数。这些随机数都是伪随机数生成器 (PRNG) 产生的。伪随机数生成器产生的随机数能被预测和破解。那么如何减少随机数的可预测性?Cloudflare 披露了它的方法——使用熔岩灯。熔岩灯的名字源于内部不定形状的蜡滴的缓慢流动,让人联想到熔岩的流动。Cloudflare 利用摄像头监视熔岩灯,拍摄视频和照片,然后将其转变成无法预测的随机比特流,再用它生成密钥。
区块链中的随机性
但是区块链中没有鼠标、传感器或者运动比赛结果预测。更重要的是,即使一个节点到达某个随机数,但该随机数必须与区块链的所有其他节点的随机数相同,否则该条链将分裂。在同一条区块链中,如果同一个区块的随机数不同,这将导致分叉。那么区块链是如何来处理随机性的呢?
一些区块链依赖区块哈希 (block hash) 来处理随机性。因为哈希值是未知的、随机的,但在所有节点上都是相同的,所以对于基本的可证明公平的赌博来说,哈希值可以作为随机性的来源。
然而,如果区块奖励少于矿工操纵区块哈希所能获得的奖励 (当前的以太坊区块奖励是 2ETH),那矿工就完全有经济动力进行恶意行为。更严重的是,在权益证明 (PoS) 系统中,由于生成一个区块几乎不需要计算时间或能量,矿工 (验证者) 可以很容易地继续生成数千个区块,直到获得一个他们喜欢的哈希值,并将这个哈希值进行提交。
这也适用于验证者的选择。如果当前负责生产某个区块的验证者能够通过某种方式进行操纵,使得该区块哈希成为一个能够再次选中该验证者 (或者由该验证控制的另一个验证者客户端) 的种子,使该验证者继续成为提议区块的验证者,那么该验证者就可以一直提议区块,将其他的验证者挡在主要的利润之外!
显然,我们需要更强劲的区块链随机性,以太坊2.0系统更是如此!
简单概述 RANDAO
想象一下,如果房间里面有很多人,每个人都在脑海中想象一个数字。为了得到一个随机数,我们要求这些人一个接一个地大声说出他们的数字。所有这些数相加之和就是我们想要的随机数。
这就是 RANDAO 的本质。RANDAO 机制就是,当用户通过储存 (质押) 32 ETH 成为验证者之后,该用户将选择一个由自己选择的随机数。当需要为某个区块公布其随机数时,将系统中所有随机数加起来就可以得到一个全新的随机数。
备注:上面的过程只是简化过程,本文将不详细论述。如果需要关于以太坊2.0 RANDAO这方面的专门文章,请通过 Twitter 告知作者 (@bitfalls)。
但即使在这种情况下,最后公布的数字对最终的随机数也会有一定程度的影响。最后一个人可以选择保持沉默,以这样或那样的方式改变这个最终的随机数。房间里的最后一个人会记住之前每个人公布的数字,如此一来,就可以知道加上 (以及不加上) 他提供的数字之后的最终随机数结果。如果相对于其他数字,某个数字对最后一个人更有利,那最后一个人就有动机去进行某种程度的操纵,不管程度高低。
对于这一问题,以太坊2.0将通过 VDF (可验证延迟函数) 来解决!
RANDAO VDF
VDF 全称为 Verifiable Delay Function (可验证延迟函数)。
其言外之意就是需要花很长时间来进行计算。
如果我们有某个数字 X,之后假设这个数字 X 的6倍二次方 VDF 函数是:((((((X^2)^2)^2)^2)^2)^2)^2。这种情况下,如果X=5,那最终的结果就是:
随着计算的继续,计算的结果将越来越大。一个复杂的 VDF 将需要花费很长的时间才能计算出来,因为对于任何计算机来说,其计算过程都是非常复杂的。
那么这有什么意义呢?
首先,在计算最终数字时的延迟 (delay) 是可以验证的,我们知道哪些计算机操作是达到结果所必需的,并且能够以合理的精确度确定机器达到结果所需要的时间。
其次,如果要计算出第三级结果,那计算机就必须先计算出第一级而第二级的结果--我们无法在多台计算机上并行地进行此计算,因为每个新的输入都依赖于之前的输出,而且每个输出都需要预先确定的计算时间。
如果现在我们用 RANDAO 中的随机数来代替上方 VDF 例子中的数字 X,且如果函数的指数不是6而是好几千,并且函数不是使用平方根 (^2) 而是更复杂的函数,那么我们将得到一个完全不同的函数,这个函数将使 RANDAO 的结果完全不一样,而且要计算出这个结果将需要花上一段时间,不管你拥有多少台电脑。
通过引入这种延迟,并使计算的时间要长于验证者可以通过影响某个随机数而获得利益的时间,我们就可以消除最后一级的随机性偏差--即消除验证者可以对 RANDAO 生成产生的最后一点影响。
在以太坊2.0阶段,这个 VDF 被定义为102分钟时长--超过了一个半小时。当前以太坊基金会正与 Filecoin 等区块链项目合作,资助开发一种针对此计算优化的开源 ASIC --这是一种专门用来进行这种计算的微型计算机。该机器将有爱好者、加密货币项目和其他区块链平台甚至验证者来运行,它具有一个小优势,可以第一时间响应 VDF 检查,而且不需要比典型的微型计算机全节点更高的电力成本。
这样一台高度专业化的机器确保了任何其他试图开发一种更好的 ASIC 来重获最后一点影响的人,都必须使其在效率方面提升 100 倍才能发挥作用。开发这种设备将耗资巨大,除非存在某种可能完全摧毁以太坊的重大利润,而我们知道这是不可能成功的。
在以太坊2.0阶段,每生成64个区块(大约需要6.4分钟,这称为一个时间段(epoch)),信标链 (Beacon Chain) 将打乱验证者并将他们重新分配到所有的分片链中。
每个时间段 (epoch) 都会公布一个 RANDAO,这意味着我们可以在每个时间段 (epoch) 运行一个新的 VDF 函数。这就意味着,每个小时将会有16个 VDF 函数,也就有16个随机数。之后,这一随机性将成为选择下一个验证者集合的种子 (seed),这就确保了公平性。
Nimbus 中的随机性
在 Nimbus 客户端中,我们与以太坊2.0规范保持一致。我们的 RANDAO 实现已经符合以太坊2.0规范的 0.5.1 版本。我们需要确保我们的测试与官方测试相匹配。
现在谈论 VDF 还为时过早。VDF 还处于研究阶段,一旦它被添加到规范中,客户端将需要一段时间才能赶上它。必须设计出与远程 VDF 设备通信的方法,对 staking (质押) 奖励进行轻微修改,使其更倾向于运行 VDF 的区块生产者,以及其他方面等等。现在,鉴于 RANDAO 对于以太坊的早期需求是足够随机的,它将作为打乱验证者和提供其他随机性的基础层。
结语
以太坊2.0将每隔 6.4 分钟生成一个合理的随机数,该随机数的随机性足以确保巨额价值的安全。
只有当某人搭建的 VDF ASIC 的效率比以太坊社区提供的任何 ASIC 都高100倍,或者当全球所有的 VDF ASIC 都离线时,以太坊的 VDF 才会失败。即便这发生了,底层的 RANDAO 所带来安全性也能将影响降到最小,使以太坊也足以保证链上财富的安全。
参考链接:
https://our.status.im/two-point-oh-randomness/