本文作者:原本区块链CTO甘露
原文链接:https://mp.weixin.qq.com/s/gujOZuYZhuewX-2-KChTVg
有很多项目采用了VRF来实现区块链的共识算法。和传统共识算法相比,采用VRF实现的共识算法可以同时满足系统高速度和高扩展性的要求,实现在海量节点数的区块链系统中的快速出块。这篇文章中我们就以Algorand项目为例子来详细说说通过VRF方法实现的共识。
首先,VRF本身不是一个共识算法。通过VRF方法实现的共识算法,一般都是两层共识的架构。第一层共识,在全部的节点中选择出几个或者十几个节点。第二层共识,在选中的少数节点间,通过传统的共识算法,比如BFT,完成共识和出块过程。
二层共识属于链上扩容的范畴。我们知道造成区块链性能瓶颈的核心原因就是共识算法。支持大量节点的共识算法(比如PoW)一般都有出块速度慢的问题,而出块速度快的共识算法(比如BFT)一般对网络通信有很高的要求,很难支持大量的节点。
于是就产生了二层共识的扩容思路,先从全部节点中筛选出来特定的少数节点,然后在这些选中的节点中通过快速共识算法完成快速出块。从而同时支持海量的区块链节点和出块的高速度。
DPoS其实是个比较类似的采用二层共识的方法。第一层共识通过投票选择出一些代理节点。第二层共识在选出的节点间进行,轮流进行出块。DPoS确实实现了系统的高性能,但是由于通过Token数投票的存在,真正参与到共识过程中的节点数屈指可数,并且长期垄断,这使得区块链不再具有去中心化的特性,被少数节点所把持。
Algorand采用的也是二层共识的方法。和DPoS相比,在第一层的节点选择中,采用了随机选择的方法(DPoS是投票选择),并且,每一次出块前都要重新选择一次(DPoS如果投票结果没有变化就不会重新选择),这使得区块链中的每一个节点都有参与出块的机会。在第二层的共识中,Algorand采用了一种自己改进过的BFT算法,BA*,可以快速在选出的节点间完成BFT共识,与之相比,DPoS只是在选中的节点中轮流进行出块,没有真正意义上的共识算法。
Algorand的设计中,获得出块机会的概率也和持有的Token数挂钩,比较像是PoS。这是经济激励体系设计的选择,为了鼓励大家持有Token和参与出块。在采用PoW共识的系统中,区块是通过算力竞争产生的,我们可以通过在出块中设置奖励,来鼓励大家参与到出块的竞争中,从而促进系统中的算力增加和节点数增加。假如出块变成了完全随机选择,在出块中设置的奖励就没有意义了,因为如果我完全无法通过自身的努力来提高获得收益的概率,我就没有动力参与这个活动了。
我们说回技术层面,在第一层共识中采用的随机选择方法,必须满足下面的几个特性:
首先这个选择必须是随机的。当然我们知道计算机世界里没有真正的随机,那么这个选择至少必须是伪随机的。随机性保证了系统中的每个账户都有被选中的权力,并且选择是无法预测的。假如一个节点,可以预测自己将要参与未来哪几个区块的共识,那它就可以对生成的区块进行攻击。比如,一个节点可以想办法提前找到某一个区块的所有共识参与者,联合这些人一起,把非法的数据写入区块中从而获益。
然后这个随机选择必须是唯一的。对于给定的一组输入(节点账号信息和当前区块链状态,后面会说),随机选择必须永远给出同样的一组选中账号。
最后这个随机选择必须是可验证的。任何人都可以很容易地验证某一个账户(公钥)是不是真的是这一轮共识中选出的账户,保证没有人可以作弊,并且不暴露这个账户的密钥。
具备了这些特性的随机选择过程,保证了整个区块链系统不被特定的少数节点把持,有足够的安全性,同时还实现了系统的高性能,在有大量节点的情况下,出块速度也可以达到BFT算法的水平,目前是在几千TPS。
VRF就是用来实现第一层共识中的随机选择节点的方法。VRF全称叫做可验证随机函数(Verifiable Random Function),思想仍然来源于密码学中的非对称加密(必须要感叹一下,计算不可行性简直是整个世界的基石)。VRF实现了从一组给定的节点账户(公钥和密钥对)中随机选择出若干个账户的功能,同时保证了选择的随机性和可验证性。
VRF是一组函数。首先通过一个随机种子,可以生成一组公钥Pk和对应的密钥Sk。
然后对于一个给定的密钥Sk,和一个输入值X,VRF可以计算出一个随机值R,以及对这个随机值的证明P。
对于外界来说,通过公开的公钥Pk和输入值X,以及证据P,任何人都可以验证随机值R是否是正确的。
看上去,VRF过程特别像是数字签名,区别就在VRF保证了唯一性和随机性,而数据签名只保证了可验证性。
使用VRF实现节点选择的过程是这样的,首先每个节点都生成了自己的公钥和密钥对。在每一轮出块之前,系统根据上一个区块的数据生成输入值X。每个节点根据自己的密钥Sk和输入值X,计算出自己这一轮的随机数R,以及对应的证明P。如果计算出的随机数R在一个特定的大小范围内,则这个节点知道自己是这一轮出块的参与节点。在生成的区块中会同时记录节点的随机数R以及证明P,以供其他节点进行验证。
这里比较巧妙的地方是,通过将VRF的输入值X和最新区块的数据绑定,实现了任何人都无法提前计算和验证自己会参与哪些区块的共识,保证了随机选择的无法预测性。
通过VRF实现的随机选择还有一个特性,就是即使在随机选择的过程完成了以后,在被选中的节点暴露自己的身份以前,任何人都仍然不知道究竟谁是这一轮选中的节点,这在更加增强了系统的安全性的同时,也带来了另一个问题。第二层BFT共识是要在选出的节点中进行的,如果每个节点都不知道还有哪些节点是被选中的,那BFT共识需要的通信过程就无法建立。因此在开始BFT共识之前,还得有一个等待全部共识节点暴露身份和验证的过程,这么做就又太慢了。
Algorand通过BA*算法的巧妙设计解决了这个问题。关于BA*算法的设计,不是本文的重点,这里就不再介绍了。
总的来说,通过VRF实现的二层共识是链上扩容的一个重要方向,能够将海量节点的区块链系统的性能提升到BFT算法的级别,在技术上有很大的前景
本文经「原本」原创认证,作者一个洋葱,点击“阅读原文”或者访问yuanben.io查询【5UK1594Y】获取授权。