实用去中心化的区块链随机数的实现
己化被
发表于 2023-1-2 00:48:48
226
0
0
传统的链上随机数有几种办法。
第一种是让可信第三方为合约提供随机数,这种情况通常是中心化的解决方案,通过一个可信的oracle来提供独立的随机数源。智能合约发送请求给独立于区块链系统之外的Oracle,当Oracle监听到链上相关请求后,生成随机数并调用回调函数将结果返回区块链。
这个方案的主要问题式是中心化的解决方案,与基于区块链的分布式精神相悖,另外还有其他的弱点,比如信息在p2p网络中传递过程中的延时问题,对于不同等级的应用需求没法提供差异化的服务等。
第二种是交互式的commit 和reveal。参与过程的多方预先commit一个随机数,然后将hash递交到区块链上。所有参与方都递交完毕后,各方reveal自己的随机数,通过将各自的随机数合并产生一个最终的随机数。这个过程能够保证随机数不被预先知道。但是这个过程有几个问题,第一是需要交互式的多次通讯,自动化实现起来非常困难。第二是如果某方在对自己结果不利的情况下,可以采用不reveal自己随机数来延迟随机数的流程。特别是在参与方比较多的情况下,正确处理好网络的延迟和故意的攻击比较困难。
第三种是采用链上的公开信息,比如使用区块的哈希值/时间戳/难度系数等作为随机数源。一般情况下,应用需要使用将来的某个区块的哈希值以保证在这个区块出来之前,准备操作已经固定且无法修改。这种方式是在实际中被采用最多的方法,但在实现的过程中有很多陷阱。而且,即使实现的过程完美无瑕,还是有个无法克服的漏洞是,产生区块的矿工,可以通过允许范围内的操作,来改变区块的哈希值,使得产生的随机数偏向矿工的选择。最简单的方式,是通过有选择性地打包交易,使得哈希值对自己有利。
第四种是从共识层,通过阈值签名的方式,使得每个共识节点递交各自对某个信息的签名片段,在足够多的签名片段收集到之后,任何一个共识节点都可以将签名片段合并成一个合法的可验证的签名。这个签名可以作为随机数源。
: e8 a J# M! ^' o6 N" C8 C$ }1 G' ?8 y
这个做法的好处是矿工没法对最终的签名进行可操作的修改。对于同一个信息message,不同的矿工签名组合出来的结果都是一致的。一旦message确定,签名也就确定了。Dfinity采用这个方式作为其共识协议的基础,同时提供可验证的随机数源。但是这里有个问题是在每一轮区块产生的过程中,每个节点需要广播自己的签名片段,这样使得每轮消息的传递是O(n2),类似于PBFT。这个问题会导致共识的节点数量的限制,以及可支撑的应用效率等。$ r6 e! Y! K9 Z4 A' q5 o7 U/ V6 n4 h
【解决方案】
墨客子链采用阈值签名,提出一个O(n)信息复杂度的随机数实现方法。
g! |9 f* p+ A; \: G1 w
首先,墨客子链是基于墨客多层结构的layer2区块链实现。子链的矿工是从海量的节点pool中随机选择的一部分来作为某个子链的共识节点。子链的出块顺序由子链的矿工通过Round Robin的方式依次出块。同时,子链会周期性地将子链状态的hash flush到主链上面,实现:1. 状态的finality。2. 剔除已证明的恶意节点。3. 随机retire一小部分节点,随机增加一些新节点。4. 实现子链与母链的跨链操作。& W2 e/ m6 m$ C
+ o0 f+ Z) h2 s+ u; l$ [* w
在提供随机数的子链实现中,每个子链的矿工通过VSS初始化操作实现私钥的可验证分发。然后,每个矿工递交一组阈值签名的签名片段,当足够多的签名收集到之后,即可完成阈值签名的合并,矿工可以产生区块,并以此签名作为智能合约的随机数源,处理智能合约中的相关交易。, e$ R$ V) C1 v# j8 r5 ~" t- O* ^
- z0 i: w9 g* A* q! b( p5 t
流程如下:
初始化阶段,前每个节点依次产生区块,不需要包括合法的阈值签名。但是每个节点需要在合法的区块中包含当前节点对[ H(b), H(b+1), …, H(b+m-1)]的签名片段,b是当前的区块号。' @- N+ `0 q0 V0 E; o
9 H* n' q! R" V. f) \
过了m个区块后,正常出块开始,当前节点应该能够收到足够的签名片段(m个),并合成有效的阈值签名,由此,该节点可以产生一个合法的区块。这个区块中包括收集到的m个签名片段[H1(b), H2(b), …, Hj(b)],以及合成的阈值签名Sig_thres,交易集{TX},区块Sig_block,并公布自己的[ H(bi), H(bi+1), …, H(bi+m-1)]的签名片段
0 {% R5 A( l6 ], z. O( r1 K
如果有Byzantine failure,当前节点没有收到足够的签名片段,该节点不产生区块,只广播自己当前的签名片段。" q) s7 S' `4 S
第三步可以持续多次up to m次
( V1 k8 t2 ~3 o7 r- s6 i3 @; s! r
下一个节点如果收到足够多的签名片段,则可以产生区块,回到步骤
d4 o% s% a7 q, \$ Q
这样,能够保证某个区块的阈值签名是对当前区块号的集合签名。这个签名是可以验证的,但是不能被预先知道,也不可以被矿工的操作修改。而且,这个出块过程中的信息量是O(n)。
另外,当子链的刷新周期到时,子链的节点数量将变化,恶意的节点被剔除,同时有一定几率的新旧节点变化。新节点的VSS过程可以在刷新周期前完成。这样可以保证刷新周期之后,新的一批节点可以马上进入持续的出块过程,使得整个流程不受中断。% t3 i5 p7 j5 F- D8 C2 G" ~
/ m* t4 N9 V- `' w* O
此外,墨客子链的实现使得在智能合约中可以直接调用这个阈值签名作为随机数源,来处理应用的逻辑。而且,这个阈值签名是和区块号绑定的,可以大大简化智能合约对相应逻辑的处理。, F$ B3 u! r p/ e0 H( K+ j
墨客科技(MOAC BlockChain Tech)已经实现了这个随机数子链,命名为RandDrop (这个是暨ProcWind,FileStorm之后墨客的第三个子链实现)。目前在测试网进行测试。很快可以提供给各游戏和应用厂商进行测试。2 p+ A7 D0 K! x5 l
5 P8 ~, K& R) Z- F: ?. {
总结一下,墨客随机数子链RandDrop的优点:( a* [" S3 D- L/ Y3 J: ]8 d2 B
解决了现有智能合约获得可靠的随机数的困境,随机数由子链的共识节点通过阈值签名的方式获得,安全性高。随机数完全不受单个矿工的影响。
3 g* B N: q3 h' C3 }8 w% `3 q
拜占庭节点的存在可以延迟某个区块的产生,但是不会影响随机数的结果。7 f: h( \5 |" B/ Z7 D
6 b' |8 O' G; I2 M: |5 Z3 |4 J V5 ?
第一个线性消息复杂度的随机数方案,能够支持更多的共识节点,适用性更强。/ T) c# o. B/ l9 L/ J
简化的流程设计,使得智能合约中能够直接调用获得当前区块的随机数。
成为第一个吐槽的人