自2018年末Lisk改进提案(简称LIP)推出以来,Lisk社区间的合作更加密切,生态系统得到进一步完善。借助LIP改进提案引入的众多网络功能之一便是拜占庭共识系统。本文探讨了拜占庭共识算法的优势。在Lisk SDK 3.0.0应用拜占庭共识算法之前,有必要讲讲拜占庭共识的一个重要方面——区块的终结性,即保证某个特定区块永远不会被逆转。

拜占庭共识的主要好处是什么?

在深入讨论拜占庭共识优势之前,先快速了解一下拜占庭共识对区块链有哪些关键功能改进。

1.安全性:如果网络中2/3的活跃受托人诚实地遵循协议行事,则两个富有争议的区块无法在区块链上达成终结性。

2.活性:即使1/3活跃受托人离线,新区块仍可在区块链上达成终结性。

3.问责制:如果一名受托人违反了共识协议,他/她将为自己行为负责。

以上便是拜占庭共识具有的三个高级特性。它能迅速地从分叉中恢复过来,快速地达成区块链终结性。三个特性都需要深入了解,如果你乐意的话,可以了解LIP以及拜占庭共识研究论文。本文重点是介绍拜占庭的实现细节。

在拜占庭共识算法中,每个节点不仅维护区块链,还维护其他内存元数据,以便根据算法规则验证区块链。部分内存元数据还将保存在区块链上,以防节点奔溃时可以重建内存数据集。我们另外针对区块增加的属性是受托人锻造的前一区块高度以及锻造区块时的最大预投票高度。与此同时,每个节点都将追求终结高度,因此在恢复区块链的情况下,已被终结的区块无法再逆转。

支持区块民主投票

在Lisk生态系统中,投票并不是什么新鲜事——投票是任何DPoS共识算法的基础。LSK代币持有者可以给受托人投票,然后,根据得票多少,系统选出得票最高的受托人锻造新一轮区块。之前,投票系统仅仅用于给受托人投票,引入拜占庭共识算法后,投票系统不再仅用于投票了。每个受托人将给区块投上一票,不同的是受托人投的票由各个节点自身维护和保留。只有少数计算出来的属性会公布在网络上,并非公布到整个投票账本上。拜占庭数学公式和协议确保各个节点正确地投票。

与其他投票系统的基本规则一致,受托人只能在给特定高度的区块投票一次。因为同一高度不能存在两个区块,受托人只能投给一个区块。这个过程叫做预投票,收集了2/3选票的区块合格进入下一轮投票。

第二轮投票叫做预提交,规则与上面类似,受托人可以预提交一个区块,只能提交一次,获得2/3预投票的区块达到合格线。在第二轮中,获得2/3预提交的区块具有终结性。具有最高预提交数的区块最终确定为区块链的高度。低于终结性区块高度的区块也将具有最终性,且不可逆转。

其他一些规则:

1.如果受托人没有参与这轮投票,就不能进行预投票或预提交。目的是防止垃圾投票。因此在受托人激活时,我们会跟踪投票轮情况。

2.一个受托人不能参与3轮投票,提高整个系统性能。

示例场景1—4个受托人同时锻造

假设网络中有4名活跃受托人,要让每个区块都具有终结性,至少要3名(大于或等于2/3原则)受托人投票通过。

 科普|拜占庭共识算法具备哪些优势?-LISK应用链

4名受托人都参与锻造的情况

我们模拟一个数据来更好地理解。

1. 当一个区块被申请添加到区块链上时,需检查以下信息:受托人之前锻造的区块高度,链上获得了2/3以上选票的最高区块,以及受托人上次参与的投票轮。

2. 受托人检查之前的预投票状态,并预提交那些拥有2/3选票的区块。由于拜占庭共识规则规定,一个受托人不能预提交区块两次。而且出于性能考虑,我们不会在链当前高度的后两轮继续执行这些预提交。

3.受托人预投票所有区块。根据规则受托人不能一次只能预投票给一个区块。而且要在自己被激活的时间内才能预投票。而且出于性能考虑,我们不会在链当前高度的后两轮继续执行这些预提交。

4. 如图所示,链中的第一个区块在高度6处有三个预提交。这意味着该区块被终结,且永远无法被逆转。

5. 链中的其余区块显然是之前申请到链上的,这些区块可以被逆转,以解决网络分叉问题。

6.在预提交之前,拥有2/3投票的区块数量在上升。拥有更多预投票的区块有望获得更多预提交,也就更大可能被最终确定。 

但终结性不是针对单个区块,而是针对特定区块高度而言。如果一个区块在高度7被最终确定,则意味它之下的区块也被最终确定了。终结性并非按照顺序排列,而是根据受托人列表(受托人列表决定锻造顺序)而变化。有可能好几个区块没有被最终确定,而新来的区块先被确定了。这种情况下,所有前面低于当前被最终确定的区块,都被最终确定了。

示例场景2——4名受托人错失了插槽

假设有4名受托人,但这一次受托人错失了插槽,结果导致链不能顺畅地确定区块,终结的区块之间出现缺口。

 科普|拜占庭共识算法具备哪些优势?-LISK应用链

4名受托人正在错失插槽

查看上图的数据模拟,可以看出第一个被最终确定的区块高度为6,而区块链高度为11。出现这种情况是因为受托人丢失了插槽,无法对前面的区块预投票以及预提交。因为高度6具有最终性,所有高度6以下的区块都被最终确认了。

示例场景3——5名受托人都被更换

假设5名受托人正在伪造,但到了第三轮之后,5名受托人都被其他受托人取代了。

 科普|拜占庭共识算法具备哪些优势?-LISK应用链

5名受托人都更换了

本次模拟中最需关注的是在高度1与高度15之间,终结性高度是如何保持增长的。而在高度15与高度30之间终结性高度便停止增长了。而受托人仍在给新区块投票,而共识规则规定,此阶段受托人不能预提交区块,因为受托人还没有被激活,于是原来的区块就没有进行预提交。这在预料之中,因为网络的终结性高度增长是在2/3以上的受托人就某一区块达成共识。否则,网络继续增长,但区块却没有被最终确认。

示例场景4——11名受托人,其中一名受托人被替换

示例4更类似于真实的网络情况,受托人列表在好几轮投票中没有改变,最终只有少数受托人更改了自己的立场。同样我们也模拟了数据,还增加了受托人数量,产生了一组难以置信的结果。

 科普|拜占庭共识算法具备哪些优势?-LISK应用链

11名受托人,一名被替换

在示例4中,可以看出网络终结性高度直到高度33才停止增长,之后是暂停了4个区块的时间,之后又开始增长。这种情况更类似真实网络。

为何要进行这些模拟呢?

你可能在想我们为何要做这些数据密集型模型实验呢?因为拜占庭共识已被记录下来了。是的,但是要理解拜占庭共识的逻辑比较困难,而且容易在实现的过程中出现问题。以上数据模拟可以让我们更清晰地了解数据流和可视化拜占庭共识在不同网络情形中的表现。

同时,数据模拟可以帮我们测试拜占庭实现,不仅让实现变得更完善,也给了我们扩展和添加更多测试场景的灵感。

本文只是介绍了拜占庭共识LIP的冰山一角,即预投票和预提交部分。拜占庭LIP还有很多内容,比如分叉选择规则,分叉恢复机制,正是这些才能拜占庭共识更加完整。