前言
- 区块链上随机数的产生是一个非常特殊的一类问题,和一众经典难题一样,有着显而易懂的需求和资源限制,但却相对极难解决。
- 由于区块链以及衍生发展出的智能合约产生随机数背景条件有诸多限制,如公开性,可验证性以及信息不平衡,导致目前已有的团队开发的框架大部分是针对特定的应用场景,不可避免的都会有缺陷,使得这个领域的研究充满着机遇和挑战。
本文目标
- 梳理关于区块链随机数的概念。
- 整理目前区块链上,或者是分布式环境上产生随机数的方法和思路。
随机性
- 随机性本身在区块链中属于比较困难的课题。这里随机性的获取包括不只限于:如何在智能合约中引入不可预测的随机数;如何在共识协议中安全的进行随机抽签。
- 随机性很大一方面的困难来源于区块链系统的透明性——因为该特性会使得一切算法的输入,输出以及算法本身暴露给系统的参与者。
- 而且区块链内部不具有公平的天然随机性的结构,如Linux系统收集大气噪音生成随机数,或者是JVM中线程调度具有的一些随机性。
- 所以广泛使用的伪随机生成数不可以被直接以硬编码的方式或者是智能合约编码的方式获得安全的随机数。
随机性的定义
- 我们在生活中经常接触到,诸如“随机选择”,“伪随机数”,“随机模型”,“随机序列”之类的词汇,还有像“伪随机数”,“真随机数”这样的概念。
- 我们在这其中最需要了解的核心内容是关于随机序列的定义,它需要满足
- 均匀性:该序列服从均匀分布。
- 独立性:该序列的各个元素相互独立。
- 不可预测性:依据该序列的任意片段,不能预测该序列余下的部分。
- *信息公平性:无法通过自己在节点的有利地位,来对获取下一个生成数据的更多信息。
- 我们可以考虑以下的问题:
- 一个要么取0要么取1的序列。假设它每一项均为1,它显然不是随机序列,因为违反了均匀性。均匀性要求0和1出现的概率相同。
- 假设它的每一项和前一项都不相等。比如“0101010101”,他满足了均匀性,但仍然不是随机序列,因为违反了独立性。
- 对于一个满足独立性和均匀性的随机序列。比如从常数e的小数点后选取数码组成的序列,满足独立性和均匀性,但是可以被预测。
- 密码学中,只满足前两条的随机序列是不足够的;但是在仿真模拟中,自然对数e的确可以作为随机序列参与模型的构成
随机数的产生
- 随机序列可以被分为真随机(True Random)和伪随机(Pseudorandom)。
- 真伪随机在统计学上实际上是无法区分的,但是由于区块链环境的特殊性,我们对于序列不仅需要做到根据先前的数据无法预测之后的数据,还要做到在算法铭文的情况下无法对结果进行预测。
- 真随机数发生器通常利用的是一些非确定性现象,通常的非确定现象包括混沌效应和量子随机过程。混沌效应的定义是:对初始值过于敏感,无法精确预测其结果[3];
- 而量子随机过程是利用围观量子态的不确定性,他能够保证及时输入值完全相同,输出值也可能完全不同。
- 硬件真随机数发生器,通常使用芯片实现;而软件真随机数发生器,则使用系统自带的非确定现象,譬如硬盘寻道时间,RAM内容,进程调度随机性或者用户输入。Linux中的
/dev/random
就是一种真随机数发生器,通过采集机器运行中的硬件噪音数据获得足够的数据来源。
目前区块链上获取随机数的技术
- 我们在了解了上面的信息之后,很容易的想到是否能将伪随机数发生器用于区块链,在区块链的公式过程中加入随机性,使得随机性满足上面的四条性质?
- 遗憾的是,目前现有的方案都无法在不接触外界信息的情况下,单纯依靠区块链的信息获取满足上述四个要求。
- 由于区块链上所有的信息都是透明的,包括输入到伪随机数发生器的种子,这导致黑客可以使用
preimage attack
[1]来对随机数进行预测。 - 这里我们可能会问,伪随机数发生器可用的种子熵源有哪些[2]:
- block.coinbase 表示当前区块的矿工地址 [被矿工操控]
- block.difficulty 表示当前区块的挖掘难度[公开]
- block.gaslimit 区块内交易的最大限制燃气消耗量 [公开]
- block.number 表示当前区块高度 [公开]
- block.timestamp 表示当前区块挖掘时间 [可被矿工操控,可预测]
- block.blockhash(block.number) :基于当前区块的区块哈希[在EVM中本值为0,称为区块后才会赋值]
- block.blockhash(block.number - 1) : 基于负一区块的区块哈希[preimage攻击]
- 未来区块哈希[攻击逻辑如下]:
- 私有seed,如
Slotthereum lottery
合约就使用了私有变量pointer
。尽管私有变量对于其他合约不可见,但是客户端的web3.eth.getStorageAt()
可以检索合约中整个堆栈所有存储的值,此时再进行preimage攻击就能够达到目的。
预言机
- 目前以太坊中最流行的随机数发生器还是通过引入
Oracle
,不同的手段包括通过中心化随机数网站或者参与者。 - 这种方法在于,真随机性的产生方法都是中心化的或者有信息依赖的偏向性,这对于去中心化的框架无疑如鲠在喉。
- 目前在以太坊,使用
Oraclize
的较为典型的案例有,vDice合约和Pray4Prey合约,后者使用WolframAlpha
作为数据源。
目前来说
- 目前区块链项目上主流的随机数应用协议有如
Algorand
,Cardano
,Dfinity
和Randao
,External oracles: BTCRelay
,Signidice
,Niguez
。[4] 其中链上生成随机数的后者都是依赖Oracle服务提供随机数。 - 从智能合约的角度,简单的合约依赖块hash,较为复杂的合约更倾向于使用预言机服务[4]。
展望
- 目前要对这一个领域做相关的研究,一个还是要了解清楚目前已有的生成随机数的框架,能够掌握尽可能多的掌握当前合约产生随机数的方法。
- 其次是要承认目前随机数的生成是具有局限性的,即没有最好的随机数生成方案,只有最适合场景的生成方案。
参考资料
[1] A Review on Generating Random Numbers in Decentralised Environments [Sr dan Daniel Simi´c, Robert Šajina, Nikola Tankovi´c, Darko Etinger]
[2] https://www.freebuf.com/vuls/179173.html
[3] https://blog.priewienv.me/post/randomness-blockchain-1/
[4] https://blog.csdn.net/weixin_43587332/article/details/106743233