本文主要介绍了随机数在区块链中的需求及重要性,主要介绍了VRF,Commit Reveal,BLS的原理及应用,之后会继续完善。
一、场景需求
1. 随机数的需求
自然地,人们希望找到一种更公平的随机数生成和发布机制。而区块链作为一个去中心化的平台,为可证公平的随机数生成提供了天然的基础。
但是在公有区块链上设计一个可用的随机数发生器难度更大。除了基本的随机数统计学要求外,公有链上一个可用的随机数发生器至少要满足无法预测,不可操控,难以串谋,可证公平,可审计这几个特点。
2. 真随机与伪随机
Linux内核提供了统计方式的真随机数生成器。它利用机器的噪音生成随机数,噪音源包括各种硬件运行时速,用户和计算机交互时速,比如击键的间隔时间、鼠标移动速度、特定中断的时间间隔和块IO请求的响应时间等。random利用大气噪音生成真随机数并对外提供。另外,通过监听真空内亚原子粒子量子涨落产生的噪音,澳大利亚国立大学的科学家们建造了随机数发生器并提供给互联网用户。
量子现象利用了在原子尺度下粒子的行为具有随机性,而且其本质还未被人类发现,因此可以将其看做一个具有良好不确定性的熵源;混沌现象是指在混沌系统中, 初始量的微小差异会导致未来的发展截然不同,因此除非获得初始时刻的全部准确信息,则无法预测未来的发展趋势(eg. random)。
3. 随机数生成方案衡量标准
- 不可预测:不可预测是针对所有参与者的,不管是生产者和消费者,都无法根据历史数据预测下一个随机数的可能值,即便是稍稍提高一点点预测的成功率都做不到,即具有马尔可夫性质。在公共随机数的方案中,还要求任何人根据任何公开信息也都不能提高预测概率,例如Bitcoin Beacon的方案中,即便知道区块的历史数据,矿池的公钥,待打包的交易列表等,也无法获得预测上的优势。
- 不可串谋:在随机数的生成过程中,部分参与方联合起来,互相交换各自的私有信息,并不能影响随机数的生成过程或改变随机数的结果,或具有其他比较优势,比如相比其他人提前获得即将生成的随机数的结果。
- 不可提前获知:随机数的参与方同时知晓该随机数,任何一方不能提前知道结果。
- 不可篡改:即随机数的生产者不能伪造一个随机数出来,而当一个随机数生成好后,该随机数无法被任何人修改。
- 不可选择:随机数的生产过程可能同时有很多个随机数生成,生产者无法只选择其中的某一个提供出去,或用其中一个替代另外一个。
- 不可隐瞒:生产者在随机数生成完成后,不能拒绝公开该随机数。即生产好的随机数一定会被公开,无法被隐藏或者撤回。
- 可参与:随机数的生成过程中,随机数的相关方可以容易的参与进来,随机数生成方案应该为一般人的广泛参与提供便利,降低或消除参与门槛,参与的权力不应该被剥夺。
- 可审计:在随机数生成过程结束后,其整体过程是可以被时候审计的。
- 成本:随机数的生产成本应该尽可能低
- 响应速度:随机数的生成过程应该足够快
4. 随机数发生器方案及评价
-
- NIST随机数生成器:NIST Randomness Beacon用于实现公共随机数源。它使用两个独立、商用的随机数发生器,每个发生器配备一个独立的物理熵源和SP800-90认可组件。能够实现不可预测(任何算法都无法预测该生成器将会给出的随机数),自主(能够抵抗不相关者介入或阻止分发随机数的过程),一致(一组用户访问该服务能够确实地获得相同的随机数)的随机数源。
- random.org:使用大气噪音生成随机数。即先用录音设备获得大气中的声波,再检测其细微变化作为生成随机数的熵源。
-
Bitcoin Beacon
斯坦福和普林斯顿的Bonneau&Goldfeder 等于2015年提出可将比特币的区块数据作为一个不依赖第三方的公开随机源,并分析了区块头所包含的熵,以及根据该熵所生成的随机数的安全性。
用比特币区块数据生成随机数的问题在于,其通用安全性不够高,无法防止“块保留攻击(Block Withholding Attacks)”,即参与者可以贿赂矿工丢弃不利于自己的区块,从而在博彩类的应用中获得相对优势。比特币单个区块的奖励是固定的,因此,所有依赖于该方法获得的随机数有一个固定的安全上限,不能根据应用的具体情况动态调整,导致其适用性有很大的限制。此外,Bitcoin Beacon 方案中,普通用户无法参与区块的生成,虽然串谋的成本较高,但矿工并不能避免嫌疑。因此该方案仍然不是一个可证公平的随机数方案。
- Algorand
采用Verifiable Random Functions(VRF)选择出块人,委员会成员及解决分叉。
VRF的流程和特点:考虑如下情形:有一个公共的难以找到原象的函数F
,现在Bob给出一条信息x
,要求Alice用她的秘钥s
计算出F(s, x) = v
作为一个随机数输出,因为s
对公众不可见,所以Bob收到v
难以判断这个v
是否是Alice诚实计算F(s, x)
得出的。VRF实现了:让Alice在给出v
的同时也给出一个proof
和一个对应s
的公钥p
,Bob可以用p
和proof
来验证v
是否是F(s, x)
。
VRF的签发是由一个参与者完成的,因此该参与者可以选择不发布对自己不利的签名,和Bitcoin Beacon有相似的缺点,因此不适合用来作为可证公平的随机数发生器。
- Dfinity
Dfinity的共识算法建立在随机数的基础上,通过BLS签名算法实现随机数的生成,由一组人产生签名,任何个人都无法预测签名结果,单个人无法阻止签名发布。
BLS 是一种门限签名技术。首先将用户分组,第一轮由一个组产生一个随机数, 之后每一轮选一个组对上一轮产生的随机数签名,作为这一轮的随机数输出,每个成员都无法提前预知签名结果。其中签名过程使用BLS 签名机制,保证在签名过程中没有个体能够提前预知签名结果,因此无法操纵随机数。
BLS 很好的解决了Withholding 攻击的问题,且生成随机数过程不可操纵,无法预测,很难串谋,是一个比较理想的随机数生成方案。
- DAO
DAO是一种无中心的组织结构,组织规则由代码描述并强制执行,任何人可自由加入退出,不同参与者间地位平等,刚好可以满足我们对于公共随机数的设计目标。因此区块链技术以及DAO理论,可以用来支撑并指导公共随机数的设计和实现。
- 上述随机数发生器评测结果
二、VRF介绍
1. Why VRF?
为了解决这个问题,就引入了VRF,只有自己能够完成这个哈希过程,而别人只能在他声明之后验证这个过程,防止有人可以提前推测出将来的记账节点。
在任何基于区块链的权益证明算法中,都需要某种机制,来随机从当前活跃验证者集合中选择能够产生下一个区块的验证者。举个例子,如果当前活跃的验证者集合由持有40以太币的Alice,持有30以太币的Bob,持有20以太币的Charlie与持有10以太币的David组成,那么你想让Alice成为下一个区块的创建者的概率为40%,而Bob的概率为30%等(在实践中,不仅要随机选择一个验证者,而是要(随机产生)一个无限验证者序列,只有这样如果Alice不在线的时候,就可以有其他人在过段时间替代她,但是这并没有改变问题的本质)。在非基于区块链的算法中,出于不同的原因也经常需要考虑随机性。
——以太坊Github《Proof of Stake FAQ》
基于PoS的区块链协议最基本的一个问题就是模拟领导者选举过程。为了在股东们之间的选举达到一个真正的随机性,系统中就必须要引入熵(entropy),但引入熵的机制可能会容易被敌手操作。例如,一个控制一群股东的敌手可能会试图模拟协议的执行,尝试不同的股东参与者的顺序以此来找到对敌对股东有力的继续者。这会导致一个叫做"grinding"的致命弱点,敌对参与者可能会使用计算资源来倾斜领导者选举。
——Ouroboros白皮书《Ouroboros: A Provably Secure Proof-of-Stake Blockchain Protocol》
- VRF的目的
VRF的目的就是要生成随机值,既要无法被预测,同时又要可验证,可重放。
VRF是可验证随机函数(verifiable random function),一方面具有伪随机性,另一方面它还具有可验证性(输出包括一个非交互零知识证明)
VRF 的方式是,实现本地抽签,各个节点自己抽签,如果抽中了之后,大家可以很容易地验证这个结果确实是你生成的。
3. VRF具体的操作流程?
- 证明者生成一对密钥,PK、SK;
- 证明者计算result = VRF_Hash(SK,info),proof = VRF_Proof(SK,info);
- 证明者把result,proof,PK递交给验证者;
- 验证者计算result = VRF_P2H(proof),True/False = VRF_Verify(PK, info, proof)
4. 抽签有没有必要用VRF?
- 在密码学签名算法中,大都会引入随机性,也就是对相同信息的多次签名会得到不同的签名值,因此矿工可以不断对相同的输入SK和block,计算签名,以满足结果小于D。那么理论上任何人都会成为出块者,只要计算足够多次的签名。
- 有些非对称加密方式得到的随机数不是均匀分布的,如RSA
- 缺乏零知识,不管使用确定性签名还是随机性签名,都存在个安全隐患。就是一旦将自己的出块凭证公布,任何人都可以公开验证,包括攻击者。那么攻击者可以对出块节点进行攻击,使其不能出块。使用VRFs的方式,矿工只需要公布自己的R表明自己的出块权,当出完块的时候再公布P,那么攻击者就无法在出块之前知道谁具有出块权,因此也就无法实施针对性的攻击。
5. 应用
三、Commit Reveal介绍
1. Commit Reveal是什么?
Commit Reveal 是一种在规定时间内可以有多人一起参与产生随机数的流程。
2. 技术原理
所有希望参与随机数生成的生产者,在指定的时间窗口期内(例如以太坊的6个出块周期,大约72秒),向合约C发送m
个以太的保证金,同时附上其任意挑选的数字s
的sha3(s)
。
3. 方案评价
- 缺点:生成随机数的速度较慢,从接到随机数生成请求,到生成随机数,至少需要10个块以上的组织协调时间,在以太坊不缩短出块间隔的情况下,耗时在3分钟以上;因为需要参与者多次发送交易提交数据,其生产和使用成本较高。
- 优势:其参与门槛基本为零,任何人都可以随时加入一个随机数的生成过程,在防止串谋和可证公平方面拥有非常特殊的优势。
4. 应用
四、BLS介绍
1. Why and What?
BLS 是一种多人蔘与生成随机数的方式,其目标是给消费者在可证公平的前提下以一种更高效的方式来提供随机数。
2. BLS签名
(3)初始化:要让BLS签名机制运行起来,需要一次初始化,生成成员的私钥和全组公钥。
- 每个成员
i
生成自己的随机数组ran_i
(对其他人保密,包括同组成员)。 - 使用一个(BLS签名机制给出的)函数
f
计算出send_{ij} = f(ran_i , j)
,通过私密通道发送send_{ij}
给成员j
(对不同的j
,send_{ij}
不同;f
有单向性,用send_{ij}
和j
无法得到rani
)。对所有j(= 1, 2, ..., N)
,成员i
要对成员j
发送send_{ij}
(对于i = j
,则计算出send_{ii}
记录在本地)。 - 每个成员
j
收集数据send_{1j} , send_{2j} , ..., send_{Nj}
,用(BLS签名机制给出的)函数v
验证send_{ij} (i = 1, 2, ..., N)
的合法性(v(send_{ij} ) = 1
则合法,v(send_{ij}) = 0
则非法)。 - 全部合法后,用它们计算出自己的秘钥
s_j
,s_j
对应的公钥pub_j
,和S
对应的公钥P
。 - 将
pub_j
以及P
广播。
- 每个成员
i
用秘钥s_i
对消息M
签名得到sig_i
并广播sig_i
。 - 每个成员
j
收集其他成员广播的sig_i
,并用pub_i
验证,通过验证通过则作为有效签名接受。当收集到k
个有效签名(包括自己的签名sig_j
),则计算出最终签名SIG
并广播SIG
。
3. BLS签名产生随机数
- 将全网节点分为
h
个组G = g_1, g_2, ..., g_h
g_1
生成一个随机数SIG_1
并广播,将g_1
从G
中剔除。- 对
i = 2, 3, ..., h
,执行:取g_{work} = G (sig_{i−1}mod|G|)
,将g_{work}
从G
中剔除,g_{work}
对SIG_{i−1}
签名得到SIG_i
并广播。 - 最终得到的
SIG_h
为最后输出的随机数。这个过程保证每一步的签名都是一个随机数,每个组都无法预测后续组的签名结果。只有最后一个组有操纵SIG_h
的优势,当最后一个组有不超过k
个非法成员,则SIG_h
是安全的,但是无法预测哪个组会担任SIG_h
的生成任务。
4. 方案评价
- 初始化阶段
- 提供服务阶段
- 审计监督
- 为了防止消费者和某些服务者成员勾结,提前获取某些内容的签名结果,然后有选择的提供待签名内容给BLS 服务,获得比较优势从而获益,可以通过以下的惩戒条例来避免串谋,并使得服务者不敢接受贿赂提供私下签名。
- 如有人出示某成员私钥对内容s 的签名结果,且该内容s 未出现在智能合约的已签名的历史记录中,则可判定该成员私自签名,罚没押金。
- 考虑到区块链重组的可能性,该成员可以申辩,申辩内容应该包括包含内容s 的区块。
- 成员必须保有一定的押金在系统中,该押金的私钥拥有者可以转移走押金,这样可避免成员向特定人群公开自己的私钥。
- 为了防止成员在BLS 服务组到期之前,私自转走押金,增加一条规则,如在默认到期之前提前转走押金,则扣除20% 的押金给坚持到期的其他成员。
- 每个BLS 服务组会有一个健康指标,该指标由押金状况,签名响应速度,节点在线率等指标构成。健康指标对外公示,消费者可挑选服务组的服务。服务组的健康度可能会影响其服务的收费标准。
5. 应用
Rando,Dfinity,高频率、 中低中奖额抽奖(如快速抽签)