sVc区块链数字货币资讯|
当前位置:首页 > 币圈学院

币圈学院

探索拜占庭容错共识(BFT)的预投票和预提交

时间:2019-09-05 06:04:28   作者:VcKing   来源:VcKing   阅读:94   评论:0
内容摘要: 自2018年末推出以来,Lisk改进建议(或LIPs)与Lisk社区密切合作,帮助改善了生态系统。我们通过这个过程引入的许多网络特性之一是新的拜占庭容错(BFT)共识系统。在这篇博客文章中,我们已经讨论了Lisk协议共识算法的优点。在Lisk SDK 3.0.0中实现它之前,我......
自2018年末推出以来,Lisk改进建议(或LIPs)与Lisk社区密切合作,帮助改善了生态系统。我们通过这个过程引入的许多网络特性之一是新的拜占庭容错(BFT)共识系统。在这篇博客文章中,我们已经讨论了Lisk协议共识算法的优点。在Lisk SDK 3.0.0中实现它之前,我想关注BFT共识的一个重要方面——计算块终结的过程,即保证某个特定块永远不会被还原。

BFT的主要好处是什么?

在深入讨论这个主题之前,让我们快速浏览一下BFT在区块链上改进的基本关键特性。

1. 安全性:如果网络中超过 2/3 的活动委托诚实地遵循协议,则两个冲突块永远无法在链上最终确定。
2. 活性:即使 1/3 的活动委托脱机,新块仍可在网络上完成。
3. 问责制:如果代表违反议定书,他/她将对此负责。

这是BFT为协议提供的三个高级值。它试图尽快从分叉中恢复过来,以更好地完成网络链的增长。这些特性都需要更广泛的理解。在这里,我们将更多地关注实现细节。

使用BFT共识,每个节点不仅仅维护了区块链。它还在内存中维护额外的元数据,以便根据算法定义的规则验证块。此信息还将部分保存在区块链本身上,以确保节点在崩溃时可以重建内存中的数据集。对于每个块,我们额外保留到区块链的一个属性是委托之前锻造的高度和锻造该块时预投票的最大高度。与此同时,每个节点将保持最终确定的高度,因此在链恢复的情况下,已经确定的块不能被恢复。
让我们进入今天的主题——代表们为块投票。

为块进行民主投票

在Lisk生态系统中,投票并不是什么新鲜事——它是所有授权的权益关系证明(DPoS)协商共识算法的核心。LSK代币持有者可以为代表投票,然后,根据他们的投票,系统选择有资格为特定一轮铸造新区块的最高代表。以前,投票制度只用于为代表投票。随着BFT的引入,这一概念得到了扩展。现在,每个委托者将为每个块投一票,唯一的区别是这些票将由各个节点维护和保存。只有少数计算出来的属性将与网络共享,而不是与整个投票分类账共享。系统中的数学公式和协议检查将确保每个节点投出适当的选票。

与任何投票系统一样,基本规则是,作为一个代表,您只能对特定高度的块投一次票。由于两个块不能在同一高度上存在,所以实际上可以为每个块投一次票。这个过程称为预投票。收集到块⅔以上的选票(多数)有资格获得下一轮的投票。

第二轮投票称为预提交,规则相同 - 一名代表可以预先提交一个块,合格的块即意味着已经获得了超过2/3的所有预投票。最终确定的最高块将被视为链的最终高度。所有高度低于最终确定的块也将被视为最终确定块,在任何情况下都不能还原。

还有一些其他的规则:

1. 代表不能预先投票,也不能预先提交他们没有参与的那轮投票的区块。这样做是为了避免垃圾投票。因此,我们需要跟踪委托何时开始活动。
2. 代表不能提预投票和预提交超过两轮,以提高整个系统的性能。

示例场景#1—四个委托,都是伪造的

为了更好地理解这个概念,让我们举一个小例子。假设网络中有四个活动的委托。完成任何块——至少⅔(三个代表)必须同意。

4名代表-全部锻造
让我们通过一个数据模拟来进一步理解这一点。

1. 应用区块链时,需要检查以下信息: 代表先前伪造的高度、已获得⅔的区块链中最高高度以及上一次委托处于活动状态的轮数

2. 委托检查前预提交和使所有导向块⅔票为止。考虑到规则,该委托不能两次预提交相同的块。委托也不能预先提交未激活的块。此外,由于性能原因,我们不会在链的当前高度之后的超过两轮执行这些预提交。

3.在每个块上,委托将对所有块进行预投票。考虑到委托不能对同一个块进行两次预投票的规则。代表不能在不活跃的时候提前投票。此外,出于性能原因,我们不会从当前链的高度执行超过两轮的预提交。

4. 如图所示,链中的第一个块在高度6处有三个预提交。这意味着该块已经完成,并且永远不会被还原。

5. 链中的其余块显然应用于链。为了解决网络中的分叉问题,可以适当恢复这些分叉。

6. 你可能会注意到的块⅔选票增加前的预提交。拥有更多预投票的块将有更多的预提交,并且有更多的机会被最终确定。

有一个重要的事实需要记住——终结性不是针对单个块的,而是针对特定块的高度。如果完成了一个块,这意味着它下面的所有块也都完成了。由于委托列表(确定锻造顺序的列表)中的更改,最终结果并不总是按顺序递增的。这意味着有可能有几个块没有完成,但是下一个块将会更早完成。在这种情况下,所有先前的块,高度低于刚刚完成的块,也将被视为完成。

示例场景#2—四个委托,缺少插槽

为了进一步理解这个预投票和预提交流程,让我们以具有相同四个代表的模拟为例,但是这一次代表开始丢失他们的插槽。这导致链的最终性没有平稳地增长,而是在最终块之间有间隙。

在这个数据模拟中,您将注意到第一个最终确定的块位于高度6,而链位于高度11。之所以会出现这种情况,是因为代表们错过了名额,无法预投票,也无法预先对之前的区块做出提交。但是由于高度6已经确定,所以在该高度之前的所有块也将被认为是最终确定的。

示例场景#3 -五个委托,全部切换

现在让我们再举一个例子,有五名代表正在伪造,但在第三轮之后,他们都被其他代表取代了。

在这个模拟中需要注意的关键事实是,最终的高度是如何从高度1持续增长到高度15的。然后从15到30保持静止状态。在每个块上,委托仍然为新块投票,但是由于委托不能在非活动期间预先提交任何块,所以它们没有预先提交旧块。网络将会增长,但不会考虑最后确定任何块。

示例场景#4 - 11个委托,一个委托开关

这个用例更类似于一个真实的网络,在这个网络中,委托列表在几轮中保持一致,然后只有少数几个委托交换它们的位置。在这个数据模拟中,我们还增加了委托的数量,这产生了一组令人难以置信的数字。

在这个例子中,我们可以看到这个网络的最终结果是连续增长到33,然后停止一段时间(4个块)。最终结果又开始增长。这种行为更接近实际生活中的网络。

为什么要进行这些模拟呢?

您可能想知道为什么我们要完成并开发所有这些数据密集型的模拟,尽管逻辑已经被记录下来了。但理解逻辑部分是复杂的,可能会在实现过程中导致错误。这些数据模拟使我们对数据流有了清晰的理解,并可视化了BFT共识性在各种情况下的行为。

与此同时,这些数据模拟帮助我们为实现编写测试,这不仅使实现变得合理,而且为我们提供了扩展和添加更多测试场景的方法。

我们希望这些数据模拟也能帮助您更好地理解BFT共识建议。再次重申,本文只涉及BFT LIP的一个方面,即预投票和预提交。在LIP中还有很多,比如分叉的选择规则和分叉的恢复机制,这些结合起来就可以完成拜占庭式的容错共识。


标签:投票  委托  高度  代表  区块  

相关文章

相关评论