区块链上的随机性:概述与构造
随机是不确定性,而依赖确定性是人的天性。程序本是确定的,而引入随机数这个不确定因素之后,带来了更多的可能性。
随机性 (Randomness) 的获取是区块链中非常重要的一个课题。这里的随机性的获取包括但不仅限于:如何在智能合约中引入不可预测的随机数;如何在共识协议中安全地进行随机抽签。显然,上述对于随机性获取的问题描述已经说明了为何这个课题十分重要。而在区块链中获取随机数非常困难,这一方面来自于区块链系统的透明性——从通常意义上来讲,该特性会使得一切算法的输入,输出以及算法本身暴露给所有的系统参与者——因此,在密码学中广泛使用的伪随机数发生器不可以被直接以硬编码的方式或者是智能合约代码的方式应用在区块链系统中来获取安全的随机数,因为透明性,系统参与者能够根据代码预测到随机数甚至操纵随机数,从而让随机源不“随机”。另一方面,随机数获取协议作为区块链系统的一个子协议常常与该系统下的其他协议有紧密的关系,如共识协议,这意味着其他协议很有可能会影响随机数获取协议的安全性。从而使随机数获取协议的设计变得非常复杂,常常需要具体问题具体分析。
随机性的定义
在日常生活中,我们经常会听到诸如“随机选择”,“伪随机数”,“随机模型”,“随机序列”之类的词汇,以及“伪随机数”、“真随机数”这样的概念。想要理解这些词汇和概念,必须要搞清楚随机是什么。事实上,与“随机”相对的是“确定”。因此,我们可以将“随机”直观上理解为“不确定”——无论是随机数,还是随机选择,我们都希望这个数或者选择的结果从某种程度上来讲是不确定的。因此,如果直接给出一个数,而不给出这个数的产生方式,它不能被称之为随机数,比如直接给出一个数字 1,我们不能说 1 是随机数,但是如果这个 1 是通过掷骰子决定的,则可以说这个 1 是随机的。当然,这些都是非常直观而宽泛的理解。更精确地讲,“随机”,或者我们说“随机数”、“随机序列”,在不同的领域有不同的定义。在数学上,随机数的定义和概率论相关;在计算复杂性理论中,使用描述随机序列的程序长度来定义(即序列越随机,描述它的程序的长度就越长);密码学会结合统计特性和密码攻击来描述随机数。
我们这里先给出随机序列的描述性定义,我们可以称一个序列为随机序列,当它满足:
均匀性:该序列服从均匀分布。
独立性:该序列的各个元素相互独立。
不可预测性:依据该序列的任意片段,不能预测该序列余下的部分。
对于一个满足独立性和均匀性的随机序列。比如从常数 e 的小数点后第 10 位开始依次选取数码组成序列。这样的序列在统计上满足独立性和均匀性,但是它的序列是可以被预测的。
我们说过,不同的领域对随机性有不同的定义。比如,在仿真当中我们想要模拟顾客到达的间隔时间,用只满足前两条的随机序列是足够的。但是在密码学中,比如生成随机的密钥,仅满足前两条的随机序列是不够的,一个有可能被预测的随机序列用在密钥生成中当然是有安全问题的。比如我们用自然对数的底 e 的数码作为随机序列。e 确实可以被认为在统计上是均匀分布和独立的(尽管没有完全证明),用来做仿真是足够的,但是不能用作密码学中的随机种子。因为对手有可能通过一定长度的已知序列猜测到是在使用 e 。同理,在抽奖、游戏当中使用的随机数也通常是要求不可预测的。鉴于区块链领域中涉及的多是密码学和游戏的场景,接下来的内容都是满足全部三条性质的随机序列。
随机序列又可以被分为真随机 (True Random) 序列和伪随机 (Pseudorandom) 序列。伪随机序列,顾名思义,就是“不是真的随机,只是看起来是随机的”。因此,根据图灵奖得主姚期智提出的概念,粗略地讲,伪随机序列就是指一个与真随机序列在计算上不可区分的序列。而真随机序列,指的是不可被重现的随机序列,比如通过抛硬币产生的随机序列。我们可以看出来,在这样的定义下,伪随机序列的统计特性应当和真随机序列无法区分,也就是说,伪随机序列同样是满足全部三条性质的随机序列。当然,这样的定义通常用在计算复杂性理论以及密码学当中,在其他领域,只满足前两条性质的随机序列也可以被称作伪随机序列。