引介 | 以太坊 2.0:随机性

本文为 Ethereum 2.0 系列 的一部分,我们建议您先阅读前面几篇文章。

在本文中,我们将讨论随机数(random numbers)以及如何在以太坊 2.0 中实现随机性。什么是 RANDAO?什么是 VDF(可验证延迟函数)?它们又是如何相互配合的?

信标链(beacon chain)如何决定轮到哪些验证者(validator)来提议区块,以及哪些验证者应该对该提议进行证明(attest)?在以太坊 2.0 系统中的 1,024 条分片链和成千上万名活跃验证者之间,信标链是如何在任何特定时间做出这一决定的呢?

这就需要随机性(randomness)!

计算机中的随机性

计算机是无法生成真正的随机数的。

你可以这么来理解:计算机(computer)是一种机器,给定相同的输入,总是会生成相同的输出。它们就是计算的机器,就好像一台计算器在 2 与 2 相加时不会得出 5 一样(除非是恶作剧或机器受到严重损坏)。

为了生成一个可靠的随机数,计算机将依赖于 seed(种子):我们把这个值当成计算过程的输入值,当作计算的起点,计算完成后就可以得到一个随机的输出值。种子可以是屏幕上鼠标光标的移动,也可以是维基百科数据库的所有内容。用种子来执行运算之后,我们就可以得到一个无法提前预知的数值(即随机数)。

现在,如果你访问 BitAddress 网站 (开源的 JavaScript 比特币钱包工具),当你移动鼠标时,你会注意到 “seed” 将相应地发生变化。也就是说,网站正是通过你的鼠标的不规则移动来 “收集随机性” ,见下图:

备注:继续移动鼠标,当图中的百分比达到100%时,就可以生成一个比特币钱包

但是,如果我们总是对生成的种子做同样的数学操作,又怎么能称结果为 “随机” 的呢?关键在于,当足够多的难以重复的种子放在一起时,得到的随机数就会是相当随机的:人们是无法在一个500万像素屏幕区域重复完全一样的鼠标运动轨迹的,因此这在某种程度上是可靠的(校对注:这就是 “随机性” 的定义之一 “不可复现性”)。如果再加上一些其他的数值,比如日期,或者像 Cloudflare 那样使用熔岩灯产生伪随机数 (见下图),也许还有某个运动队当年进球的次数,这样你就得到了一个相当随机的种子(seed)。

备注:Cloudflare 是一家提供安全服务的云服务商,向客户提供了免费的 SSL 服务。因为要处理海量的加密流量,它需要使用到大量的随机数。这些随机数都是伪随机数生成器(PRNG)产生的。伪随机数生成器产生的随机数能被预测和破解。那么如何减少随机数的可预测性?Cloudflare 披露了它的方法——使用熔岩灯。熔岩灯的名字源于内部不定形状的蜡滴的缓慢流动,让人联想到熔岩的流动。Cloudflare 利用摄像头监视熔岩灯,拍摄视频和照片,然后将其转变成无法预测的随机比特流,再用它生成密钥。

区块链中的随机性

但是区块链中没有鼠标、传感器或者运动比赛结果预测。更重要的是,即使一个节点得出了某个随机数,网络中的所有其他节点 必须 得出同样的随机数,否则该条链将分裂。那么区块链是如何来处理这个问题的呢?

一些区块链依赖区块哈希(block hash)来产生随机性。因为区块哈希值不可预知、随机性很强,但在所有节点上都是相同的,所以对于基本 可证明公平的赌博 来说,哈希值可以作为随机性的来源。

然而,如果区块奖励少于矿工操纵区块哈希所能获得的奖励,那对他们来说,操纵哈希值在经济上是完全理性的。更严重的是,在权益证明(PoS)系统中,由于生成一个区块几乎不需要计算时间或能量,矿工(验证者)可以很容易地连续生成数千个区块,直到获得一个他们喜欢的哈希值,然后提交这个哈希值。

在使用随机数来选择验证者的语境中,道理也是一样的。如果区块哈希作为种子来生成随机数并选择验证者,而当前负责生产区块的验证者又能操作区块哈希让自己(或由自己控制的另一个验证者客户端)再次成为区块生产者,那么他等于可以一直提议区块,将其它验证者拒之于提议区块的奖励之外!

显然,我们需要更强劲的区块链随机性,以太坊 2.0 系统更是如此!

简单概述 RANDAO

想象一下,如果房间里面有很多人,每个人都在脑海中想象一个数字。想要得到一个随机数的话,我们只需要求这些人一个接一个地大声说出他们的数字。所有这些数相加之和就是一个随机数。

RANDAO 的本质就是如此。RANDAO 机制就是,当用户通过储存(质押)32 ETH 成为验证者之后,该用户可以任意选定一个随机数。当需要为某个区块公布随机数时,将所有验证者的随机数加起来就可以得到一个全新的随机数。

备注:上面的过程只是简化过程,本文将不详细论述。如果需要关于以太坊2.0 RANDAO这方面的专门文章,请通过 Twitter 告知作者( @ bitfalls )。

但即使在这种情况下,最后一个公开随机数的人也可以在一定程度上操纵随机数。最后一个人可以选择保持沉默,以这样或那样的方式改变这个最终的随机数:房间里的最后一个人可以记住之前每个人公布的数字,如此一来,就可以知道加上(或者不加上)他提供的数字之后的最终随机数结果。如果相对于其他数字,某个数字对最后一个人更有利,那最后一个人就有动机去进行某种程度的操纵,不管程度高低。

对于这一问题,以太坊 2.0 将通过 VDF(可验证延迟函数)来解决!

RANDAO + VDF

VDF 全称为 Verifiable Delay Function(可验证延迟函数)。

其言外之意就是此类行数需要花很长时间来进行计算。

比如,对数字 X 来说,一种 VDF 可以是 X 的连续 6 次平方: ((((((X^2)^2)^2)^2)^2)^2)^2 。假如 X=5,那么最终结果就是

((((((5^2)^2)^2)^2)^2)^2)^2 =
(((((25^2)^2)^2)^2)^2)^2 =
((((625^2)^2)^2)^2)^2 =
(((390625^2)^2)^2)^2 =
((152587890625^2)^2)^2 =
(23283064365386962890625^2)^2 =
542101086242752217003726400434970855712890625^2 =
293873587705571876992184134305561419454666389193021880377187926569604314863681793212890625

随着计算的继续,计算的结果将越来越大。一个复杂的 VDF 将需要花费很长的时间才能计算出来,因为对于任何计算机来说,其计算过程都是非常复杂的。这个例子来源于一个真实的 VDF,直到现在它还是 在 MIT 的一个时间胶囊密码学谜题的一部分 ,该 VDF 用了 80 万亿次平方。

那么这有什么意义呢?

首先,在计算最终数字时的 延迟 (delay)是可以 验证 的,我们知道哪些计算机操作是达到结果所必需的,并且能够以合理的精确度确定机器达到结果所需要的时间。

其次,如果要计算出第三级结果,那计算机就 必须 先计算出第一级和第二级的结果——我们无法在多台计算机上并行地进行此计算,因为每个新的输入都依赖于之前的输出,而且每个输出都需要预先确定的计算时间。

如果现在我们用 RANDAO 中的随机数来代替上方 VDF 例子中的数字 X,且如果函数的指数不是 6 而是好几千,并且函数不是使用平方(^2)而是更复杂的函数,那么我们将得到一个完全不同的函数,这个函数会将 RANDAO 的结果转变成另一个完全不一样的随机数,而且要计算出这个结果将需要花上一段时间,不管你拥有多少台电脑。

通过引入这种延迟,并使计算的时间要长于验证者可以通过影响某个随机数而获得利益的时间,我们就可以消除最后一级的随机性偏差——即消除单个验证者可以对 RANDAO 结果产生的最后一点操控。

在以太坊 2.0 阶段,这个 VDF 被定义为 102 分钟时长——超过了一个半小时。当前以太坊基金会 正与 Filecoin 等区块链项目合作 ,资助开发一种针对此计算优化的开源 ASIC ——这是一种专门用来进行这种计算的微型计算机。该机器将由爱好者、加密货币项目和其他区块链平台甚至验证者来运行,它具有一个小优势,可以第一时间响应 VDF 检查,而且不需要比一般的 微型计算机全节点 更高的电力成本。

这样一种高度专业化的机器确保了任何其他试图对 RANDAO 重获最后一点影响的人,都必须开发出比当前的 ASIC 效率 高 100 倍的机器 。开发这种设备将耗资巨大,除非真有某种一本万利的用途;而如果能开发出来的话,几乎可以完全摧毁以太坊。

在以太坊 2.0 阶段,每 6.4 分钟称为一个时间段(epoch)。每经过一个 epoch, RAODAO 就揭晓一次,同时这也意味着每过一个 epoch 我们就得运行一个新的 VDF。每个 VDF 的周期是 102.4 分钟,因此总会有 16 个 VDF 同时运行。VDF 得到的结果即作为随机性种子,用来选定下一组验证者,保证公平性。

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/

作者:Bruno Škvorc

翻译&校对:Jhonny@Unitimes & 阿剑

本译稿首发于 公众号 Unitimes ,EthFans 经授权后转载。