分享 · 2018-11-01 0

密码学 | 区块链上的随机数

beepress7-1563189425

这集来聊随机性。随机性要保证的是机会均等,而只要机会均等,区块链上恶人就没有空子可钻,就可以达成真正的共识。所以有两点是非常明确的,第一,实现随机性非常重要,只要有随机就有共识。第二,真正去中心化环境下实现随机是非常困难的,以至于到目前为止,Peter 认为真正被验证过的可行方案只有一种,就是 POW 。

什么是随机?

有必要抛开区块链,先给随机性( Randomness ) 一个非常清晰的定义。

首先,要保证不可以预测性。比如掷骰子,不管你看我掷了多少次,下一次的结果,依然是完全没办法猜到的。不可预测性,肯定是随机的一个必要条件。

其次,要保证没有规律。只有不可预测,是不能保证随机性的。比如现在我同时掷两个骰子,最后要两个数之和。这个和肯定是不可预测的,但是和为7要比和为2的概率大很多倍,所以这也不是随机。

总之,随机性要同时保证不可预测和无规律,最终目的保证的是机会均等。没有任何人为耍花招的余地。

产生随机数的方式

随机的概念说完了,下面来看看产生随机数的方式。

首先说真随机这个概念。自然界有些事情是人类尚未找到任何规律的,例如大气噪声,量子活动,这些都可以作为真随机数的来源。有人会抬杠说,这些底层不一定没规律啊,只是我们还没找到而已,所以不能叫真随机。这个说法不是没道理,但是这些数据起码目前可以在人类社会能够保证机会公平的,所以我们认为是真随机的。

但是程序世界里面,只有伪随机,没有真随机的。计算机上随机数如何去生成呢?首先程序会去采集一些硬件噪声,注意,这些是来自真实世界的真随机数。程序中去生成随机数是通过伪随机数生成器,说白了就是一套算法。算法基于之前采集到的真随机数来做初始化,所以这些真随机数就被叫做随机种子。算法的输出是很多伪随机数,之所以说是伪随机数,是因为它们是完全是由种子决定的。

所以说,产生真随机数在真实世界里面是可能的,但是程序毕竟都是写死的有确定执行规律的代码,所以用有规律的代码去生成随机的东西是不可能的,只能通过采集真实世界的真随机数做种子,来生成伪随机数。

区块链上获得随机数

再说区块链,区块链不但是程序,而且是去中心化的,所以在区块链上生成随机数是非常有挑战性的。

读取自然界的真随机数就会遭遇中心化问题。一个提供这个服务例子是 random.org ,这个网站号称自己能够提供随机数,有区块链项目在用这个服务的。但是这种中心化方式的问题是很明显的,random.org 的数据如果有人做手脚,没有任何人会知道。

那么要用去中心化的方式,能不能拿到随机数呢?答案是可以的,数据源头是人的行为。如果大家都能诚实的选一个任意的数,那么人多了,自然可以得到随机性。过程中,可以通过抵押代币来防止有人作恶,或者不作为,可以通过选举出委员会来提升生成效率,可以用到各种密码学方法来保证安全。说到这里,我们逐渐就感觉到,这个生成随机数的过程,跟共识过程有很多相似之处了。Algorand ,Cardano ,Randao 中的各种实现随机的方案,很多就类似于共识算法或者基于智能合约,生成随机数过程跟共识过程一样,也会面临女巫攻击和经济激励问题。

也可以说,区块链上生成随机数是一个尚未解决的问题。

总结

这节我们聊了什么是随机,真随机和假随机,最后介绍了区块链上用去中心化的方式去达成随机的基本思路。目前,Peter 大致的结论是这样:各种方式其实都不完美,但是如果给定一下限制条件,有些方案可能是可行的。区块链上生成随机既然要依赖人的行为,这里面就要考虑经济激励。没有激励或者激励太少,不会有人参与,激励太多了,就会有人攻击。POW 的本质也是机会公平的选出一个记账人,所以也可以认为是一个随机数生成过程,而且似乎是目前唯一被验证的在去中心化条件下的可行方式,虽然 POW 是不是公平这个事还有待商榷。


原文始发于微信公众号(Rebase社区):密码学 | 区块链上的随机数