VRF + BFT共识算法实现探索

摘要

前文介绍的PBFT算法,是一种经典的联盟链BFT共识算法,在节点较少的情况下,性能比较高,安全性也比较好,但是在公网节点众多的情况下,性能会直线下降,超过100个共识节点的话,几乎是不可运行的。现有不少算法都是在PBFT的基础上,通过各种机制,选取出块节点,然后再达成共识,例如:EOS的DPOS - BFT算法,NEO的dBFT算法,但是这两种算法被人病垢过于中心化,违背了区块去中心化的设计哲学。放弃一些去中心化,换取更高的TPS,是现有鼓吹自己区块链3.0技术的一个卖点。那么有没有一种更好的高TPS去中心化的共识算法呢?本文就和大家一起探讨一种可能的算法:VRF + BFT。

什么是VRF?

VRF(Verifiable Random Function): 可验证随机函数。

要理解VRF的工作原理,前提是理解哈希函数,例:SHA256,SHA3等,这里不做详述,读者可自行百度了解。先理解一下这里说的“随机”是什么意思:一个理想的哈希函数,其值域应该是离散的、均匀分布的,给定不同的输入值,其输出值应该没有规律,随机的分布在值域区间内。

再看一个简单的哈希函数变种,即结合了密钥secret的哈希函数,比如result = SHA256(secret,info),那么要得到结果result,仅仅拥有info是不够的,必须要知道secret才能计算出来,或者说我们已经拥有了结果result和info,但是必须知道secret才能验证info和result是否是匹配,这就是带密钥的哈希函数。此时引出另一个问题,有没有可能不通过密匙secret,也能验证info和result是匹配的?于是就有了可验证的随机函数即:VRF。实现原理:结合了非对称加密技术的哈希函数,例如:result = VRF_Hash(SK, info), SK是私钥,不公开,和SK对应的公钥PK,需要发送给验证者。

具体操作流程如下:

1. 证明者生成一对密钥,SK、PK;

2、证明者计算result = VRF_Hash(SK,info);

3、证明者计算proof = VRF_Proof(SK,info);

4、证明者把result和proof递交给验证者;

5、 验证者计算result = VRF_P2H(proof)是否成立,若成立,继续下面的步骤,否则中止;

6、 证明者把PK,info递交给验证者;

7、 验证者计算True/False = VRF_Verify(PK, info, proof) ,True表示验证通过,False表示验证未通过。

所谓的验证通过,就是指proof是否是通过info生成的,通过proof是否可以计算出result,从而推导出info和result是否对应匹配、证明者给出的材料是否有问题。在整个操作流程中,证明者始终没有出示自己的私钥SK,验证者却可以推导出info和result是否对应匹配,这就是VRF的妙用。

采用VRF的拜占庭容错算法

VRF最大的作用生成一个可以被他人验证的随机数,并且这个随机数是他人生成不了的,也就是防碰撞和防篡改的,接下来我们看看VRF如何应用到拜占庭容错算法当中。先给出ontology项目的具体实现,稍后会分析这种方法的潜在问题。

Ontology VBFT算法实现流程

ontology VBFT算法是基于参与的共识节点进行的,共识节点是经过认证的具有一定ont token的节点,类似于EOS的超级节点,不是网络中的所有节点都能够参与共识。

1. 基于当前块的信息,算出新的VrfValue,所需信息如下:

a. 新的块号:当前块号 + 1

b. 产生当前块的节点id

c. 当前块的块头根hash

d. 当前块的VrfValue

根据上述四个信息,采用SHA512算法,算出新的VrfValue,参考代码:ontology/consensus/vbft/node_utils.go 方法:getParticipantSelectionSeed

2. 每个共识节点根据新的VrfValue,以及所有共识节点的PosTable,无需网络通信,就可以算出统一的产生下一块的提案节点,验证节点,确认节点,其中PosTable存放了所有共识节点的token 权重。参考代码:ontology/consensus/vbft/node_utils.go 方法:buildParticipantConfig

3. 从VRF得到的多个提案节点,将独立提出备选区块。提案节点产生的块头会包含一个可验证的随机值:VrfValue,如果当前提案节点产生的块被选中作为最终块,则当前提案节点产生的VrfValue会用于生成下次共识节点列表。

4.从VRF得到的多个验证节点,将从网络中收集备选的区块,进行验证,然后对最高优先级的备选区块进行投票。验证节点会对提案节点产生的VrfValue进行验证,确认其合法性。

5.从VRF得到的多个确认节点,对上述验证节点的投票结果进行统计验证,并确定出最终的共识结果。

6.所有节点都将接收确认节点的共识结果,并在一轮共识确认后开启新的共识。

Ontology VBFT分叉选择

由于同时由多个节点出块以及恶意节点的攻击,那么有可能出现分叉的问题。每个区块头都包含了生成当前块的节点token 权重,那么以权重最长的链作为主链,类似于比特币以算力最长链为主链。由于每次出块都会随机产生出块节点,因此恶意节点很难有机会一直进行出块,因此恶意节点导致的分叉,将会很快消亡。

Ontology VBFT共识节点表的更新

为维护Ontology共识网络的网络质量,Ontology共识管理合约将定期自动更新共识网络中的节点列表。在发生网络风险时,共识管理合约也支持通过基于Stake的投票,强制更新共识网络中的节点列表。

一个新的节点在获得更多Stake,并且确认满足共识网络的节点性能需求后,将在下一次共识网络更新时被加入共识网络。

共识网络自动更新的时间是以区块为单位。每一次更新的共识网络在完成给定数目的区块共识后,下一个区块的备选提案节点必须构建一个共识管理合约执行事务,并将其作为区块中第一个事务打包到提案区块中;对应的共识验证节点和确认节点也将以此验证提案区块的有效性。

在包含共识管理合约事务的区块完成共识后,每个节点将自动执行共识管理合约,更新共识节点列表,至此完成共识节点列表的更新。

VBFT与当前主流共识算法性能对比

VRF + BFT共识算法实现探索_第1张图片
共识算法性能对比


Ontology VBFT的最新性能测试报告显示,该算法在7个共识节点的情况下,TPS达到了5300以上,共识节点过少参考价值有待验证。

Ontology VBFT问题

由于Ontology VBFT采用了可验证的随机函数从一批共识节点中产生下一轮出块所需的节点,在算法上比dpos更加的随机以及去中心化,加大了作恶节点判断出出块节点的难度。但是由于当前区块头包含了产生下一个区块的共识节点信息,因此作恶节点可以在每轮出块前,获取下一次的共识节点列表,对这些节点进行攻击,缩小了攻击的范围,因此该算法在理论上是存在安全风险的。

结合Ontology VBFT的算法思想,我们可以根据密码学算法,来保证产生下一块前,非共识节点不能根据当前块的信息获取到最终的可验证随机数,也就无法得到下一轮的共识节点列表,这样就能解决非共识节点的作恶可能性。我们暂且定位非确定性的VBFT算法,下文描述该算法的实现过程

非确定性的VBFT算法

该算法的思想,借鉴了门限签名(k, n), k<=n,简单说就是:给每一个节点发送一个私钥以及一串向量,该节点就可以通过这两份信息,恢复出每个节点的公钥以及群公钥,用来验证节点签名以及群签名,只要获取到至少k个节点的签名就可以恢复群签名,然后对群签名进行hash计算出一个可验证的随机数VrfValue,根据VrfValue就可以计算出产生新的块的共识节点列表。

1. 提案节点根据自己掌握的私钥对块号签名Signi,插入到提案的区块头中,广播给其他共识节点。

2. 共识节点收到k个经过验证的提案节点的签名,就可以恢复出群签名,然后对群签名进行hash计算出一个可验证的随机数VrfValue,根据VrfValue就可以计算出下一次出块的共识节点列表。

3. 其他共识流程与Ontology VBFT相似。由于提案节点产生的提案块只在共识节点之间传播,并且通过对方的公钥进行加密,因此非共识节点无法获取到相关信息,也就不能知道下一次出块的共识节点列表,在安全上得到了保证。

非确定性的VBFT算法,目前还在研究当中,进一步的会代码实现验证其可行性。

参考

Ontology VBFT测试报告:https://blog.csdn.net/yitengtongweishi/article/details/81115696

你可能感兴趣的:(VRF + BFT共识算法实现探索)