波尔卡多共识主要有三种类型。
NPOS,宝贝,爷爷
接下来,我们将逐一解释这三种共识。
NPOS
什么是NPOS共识?
在Polkadot中,需要将中继链上的验证者分配给每个并行链,为它们提供区块链验证能力,这是Polkadot共享安全的一部分。因此,主干链的验证者对整个Polkadot多链系统的安全性至关重要。
如何公平、安全地选举中继链中的验证者成为保证整个系统共享安全的第一步,也是必不可少的一步。
使用NPOS(指定的利害关系证明)一致性算法来选举验证者集合,使得系统更加安全和高效。与传统的POS一致性相比,NPOS算法结合了Polkadot链自身架构的一些特点,并做了相应的优化。
NPOS是这样工作的。
在解释NPOS之前,我们需要回顾一下波尔卡多特中的两个重要角色。
验证者
中继链的所有节点,中继链会通过在验证者池中随机分组,将验证者分配到不同的并行链上。验证者将接受来自收集者的打包块并验证其有效性,然后结合一致性算法确认收集者提交的块。
提名人
Polkadot中数字货币dot的持有者会选择自己信任的验证者来质押DOT,然后分享验证者的收益。
波尔卡多特的选举模式就是基于这两种角色。要成为验证者,首先要成为验证者。候选人参与选举过程,这个选举过程中的“选民”就是被提名人。
在波尔卡多特的设计中,提名人数理论上可以不设上限。如果能有更多的提名人参与投票阶段,选举涉及的资金量会更大,整个系统会更安全;对于验证者来说,为了区块链的性能,应该不会太多(如果所有节点都可以作为验证者,那就是比特币采用的模式)。验证者的数量是由系统确定的固定值,与POS共识一致。
选举模式
为了阐明选举问题,Polkadot将选举验证者集合问题抽象为一个数学选举问题:
问题:在M个投票者对N个候选人的情况下,选择最后的T为胜者。
(注:被提名者人数不限,审核者人数有限)
问题的描述很简单,但是如何让系统更安全会有不同的策略。在Polkadot的设计理念中,认为选举策略需要满足以下“三个原则”:
平衡:分块释放时验证者的比例是相同的,所以这个策略在Stake中的分配需要尽可能的均匀,以保证网络的安全性;
支持:这个策略需要涉及尽可能多的股份基金。因为提名者只负责投票给哪些候选人,没有决定把多少赌注分配给哪个验证者,这部分是由NPOS算法通过计算决定的。这也是NPOS和普通POS共识的一大区别;
公平表示:堆叠越多的被提名者选择的赌注验证者越有可能出现在验证者集合中。
基于上述问题和要求,这个问题可以转化为以下数学模型:
输入:给定,其中是提名者集、验证者候选集和边集,表示被提名者投票给候选人。同时,给定方向量,它指示每个被提名者各自的堆叠数,这是所选最终验证者集的大小。输出:给定的解决方案,其中是最终选择的验证器,大小为,是提名者分配给最终验证器的股份数。约束:平衡:给定,可以给一个,这样最低支持:给定,可以给一个,这样最大公平代表:比例合理代表(PJR)规则可以给。
任何一个,都不会有被提名者的子集,从而导致以下情况:
用更通俗的话来说,就是不允许出现:有一些提名人的股份超过了总股份的比例,他们支持的候选人有100多个,但是他们支持的验证人不超过100个。
上述问题在数学上是一个优化问题。遗憾的是,这种选举在数学上已被证明是NP完全问题,无法在多项式时间内给出最优解。
所以Polkadot给出了他自己的一套解决方案来解决这个难题。
NPOS过程
在上述数学模型中,由于是NP完全的,也就是说最优解的计算时间复杂度不能在多项式时间内确定。
Polkadot给出了一个相对可行的方案。
在NP完全问题中,通过寻求相对最优解来寻找可行解是非常困难的,但是验证现有解是简单的,并且可以在多项式时间内完成。所以验证可行解的部分被放到了链上。
完整流程如下:
在被提名者给出自己的选票后,每个候选人可以针对上述选举问题给出自己可行的解决方案。
在上述的一组可行方案中,利用链中的方案比较方案,按照前面的“三原则”对这些方案进行比较,选出最佳方案作为最后一个来验证选举结果,从而完成一轮选举。
婴儿
贝贝的全称是区块链延伸盲赋。BABE是一个用于产生块的引擎,类似于Ourobros Praos,一个PoS协议。BABE算法是基于槽的。
在波尔卡多特中,每个时间段大约持续6秒钟。
贝比将在每个时间段选择一个领导者进行阻挡。
《贝比》中领袖的选举是由随机函数(VRF)实现的。在每个时隙阶段,每个节点将通过操作VRF函数获得一个值。如果这个值小于网络中预先设定的阈值,那么节点就会认为自己是这个时间段的领导者,于是节点就会开始屏蔽。
值得注意的是,在上述过程中,由于VRF函数随机产生数字,因此某个时隙可能没有领导者,或者多个节点可能计算出其VRF值小于阈值,从而产生多个领导者。我们依次分析两种情况:
没有领袖时,波尔卡多特规定按顺序决定谁是领袖,这是预先确定的。
当有多个leader时,Polkadot允许多个节点提交块,最终的块确认由爷爷决定。
爷爷
爷爷是用来块确认的。在文章的第二部分,我们提到了贝贝会屏蔽Polkadot的交易,所以这些屏蔽最终由爷爷决定。
和PBFT的其他衍生算法一样,爷爷算法的时间复杂度是O (n)。但是Polkadot收养爷爷是因为爷爷不是一次只确认一个街区,而是会一次确认几个街区。
Idle (24对等),best: #664257 (0x706c…76b7),finalized # 664253(0x E4 ab…4d2a)import # 664258(0x ee71…6321)Idle(24对等),best:#664258(0xee71…6321),FINISHED # 664256 (0x809A … A5D8)以上是Polkadot测试网络的日志。可以看到,一次确认了664253到664256块的高度,所以爷爷一次确认了三块。这样,与一次只确认一个相比,爷爷的效率远远高于PBFT的其他衍生算法。
下面是爷爷的具体过程:
1.主节点广播上一轮确定的块高度;
2.等待网络延时后,每个节点广播自己认为可以确定的最高块(预投票);
3.每个节点计算步骤2中接收到的块集,计算自己认为可以确认的最高块,预提交);结果;
4.当一个节点收到足够的预提交消息来确认该块时,它将形成一个提交消息。一般认为2/3以上可以确认。
这是上面爷爷确认块的主要流程。
我们需要担心的是,在第二步的预投票过程中,一些邪恶的节点可能会投两个块,并进行广播,这可能会导致链的分叉。
Polkadot使用了一种叫做账户安全的方法来防止这种情况发生。
当网络中出现要分叉的提交信息时,Polkadot的节点会立即采用账户安全机制。每个节点会向其他节点询问自己看到的预投票,节点会回复自己收到的信息,这样就很容易查到哪些恶意节点投了两块。这些最终被抓住的邪恶节点将被踢出共识网络,永远不允许进入。
让我们回到贝比。结合贝比和爷爷,我们可以看到波尔卡多特是用贝比来挡的。此时节点之间只需要发送一次块信息,这样时间复杂度只有O(n)。block out后,在节点之间使用爷爷进行block确认。此时,由于确认阶段节点间的二次确认,确保了确认块结果的一致性。时间复杂度为O (n),但由于在O(n时间确认了多个块,所以结合两者的混合共识非常高效,比常见的PBFT共识高效得多。
标签
以上三个就是我们给大家介绍的Polkadot的共识算法。可以看出,NPOS主要用于选择波尔卡多特的共识节点,贝比和爷爷混合用于高效阻断和确认区块链。
这种混合共识比传统的PBFT共识更快,并且在更快速度的基础上不损失安全性。《区块链共识》中值得学习的是,将阻止发布和阻止确认两个阶段分开,并使用不同的算法。
通过这三种算法,Polkadot可以说在一定程度上高效地实现了区块链在Polkadot上的一致性算法。
参考资料:
[1] Ouroboros Praos:一种自适应安全、半同步的利害关系证明区块链贝尔纳多大卫、彼得加齐、阿格洛斯基亚伊斯2017年11月14日