如以上提到的,每个分片和DS委员会需要分别在微块和终块上跑一个共识协议。在这一块,我们将展示在每一个分片和DS委员会中定义的共识协议的共识层。在讨论中,我们将分片和DS委员会代指为共识组。
实用拜占庭容错
ZILLIQA共识协议的核心依赖于实用拜占庭容错(PBFT)协议。然而我们通过在PBFT中使用EC-Schnorr多签名来提升效率。EC-Schnorr多重签名的使用将正常情况下的通信延迟从O(n*n)降低为O(n),并将签名大小从O(n)减小到O(1),其中n是共识组的大小。 在这个部分,我们提供PBFT的概述。
在PBFT中,共识组内的所有节点都按顺序排列,它有一个主节点(或领导者),其他节点称为备份节点。 每轮PBFT都有三个阶段,如下所述:
- 预准备阶段: 在这个阶段,领导者宣布该小组将应该达成一致共识的下一个记录(在我们的案例中是TX-Block)
- 准备阶段:在接收到预先准备消息后,每个节点验证其正确性并将准备消息多播给所有其他节点
- 提交阶段:在收到超过2/3*n准备消息时,节点向组播组发送提交消息。最后,节点等待超过2/3*n的提交消息,以确保有足够数量的节点做出相同的决定。 因此,所有诚实的节点都接受相同的有效记录。
PBFT依靠正确的领导者开始每个阶段,并在足够多节点存在时继续进行。 如果领导是拜占庭,它可能会拖延整个共识协议。 为了应对这一挑战,PBFT提供了视图更改协议来使用另一个取代拜占庭领袖。 如果节点在有限的时间内没有看到任何进展,他们可以独立宣布改变领导者的愿望。 如果超过2/3*n个节点的法定人数决定领导者有问题,那么在已知计划中的下一个领导者就会接管。
由于在准备/提交阶段每个节点的多播,正常情况下PBFT的通信复杂度为O(n*n)
提高效率
经典的PBFT使用消息认证码(MAC)进行节点之间的认证通信。 由于MAC需要在每两个节点之间共享密钥,所以一个共识组中的节点可以在同一个记录上达成一致,其中每个节点的通信复杂度为O(n*n)。 由于二次复杂性,当委员会有20多个节点时,PBFT变得不切实际。
为了提高效率,我们使用来源于ByzCoin的想法:
- 我们用数字签名替换MAC来有效地减少O(n)的通信开销。
- 与此同时,为了让其他节点能够验证协议,一种典型的方法是从诚实的多数收集签名并将它们附加到协议中,从而导致协商规模与协商组的大小成线性关系。 为了改善这一点,我们使用EC-Schnorr多重签名来将几个签名聚合成O(1) - 大小多重签名
然而,我们不能直接在PBFT设置中使用经典的EC-Schnorr多重签名方案。 这是因为在古典设置中,所有签名者都同意签署给定的消息,并且签名只有在所有签名者都签名后才有效。 在PBFT设置中,我们只需要在共识组中超过2/3*n个节点签署消息。 所需的主要修改之一是为参与签名过程的签名者维护位图B. 如果第i个节点参与该过程,则B [i] = 1,否则为0。位图由领导者构建。 位图可以被任何验证者用来验证签名。 最终的协议留在附录B中。
Zilliqa共识
在ZILLIQA中,我们使用PBFT作为基础共识协议,并采用两轮EC-Schnorr多重签名来替换PBFT中的准备阶段和提交阶段。 下面将解释对PBFT阶段的不同修改。
- 预准备阶段: 与标准PBFT中一样,领导者将TX-Block或声明(由领导者签名)分发给共识组中的所有节点。
- 准备阶段:所有诚实的节点检查TX块的有效性,并且领导者收集来自超过2/3*n个节点的响应。 这保证领导者提出的陈述是安全的并且与以前的所有历史一致。 签名是使用EC-Schnorr多重签名生成的。 领导者还构建签署TX块的节点的位图
- 提交阶段:为了确保超过2/3*n的节点知道超过2/3*n节点验证了TX-Block的事实。我们进行第二轮EC-Schnorr多重签名。 正在签署的声明是上一轮生成的多重签名。
在三个阶段结束时,就领导者提出的TX-Block将达成共识。
领导者改变
在我们的共识协议中,如果领导者是诚实的,它可以不断的推动共识小组中的节点就新的交易达成协议。 但是,如果领导是拜占庭,它可以有意地延迟或丢弃来自诚实节点的消息,并减慢协议。 为了惩罚这些恶意领导者,我们的协议会定期更改每个分片的领导和DS委员会。 这可以防止拜占庭领袖在无限期的时间内拖延共识协议。 由于所有节点都是有序的,下一个领导者将以循环方式选择。
事实上,每一个微块后分片的领导者都会改变,并且在每个最后一个区块之后DS委员会的领导者也会更改。 让我们假设共识组的大小为n,那么在一个DS-epoch时期内,我们允许的最终块的最大值为n,每个最终块最多在1个分片聚合1个微块。
如有错误,还请指出,及时纠正