要使区块链保持运行(继续增长和添加新的交易),必须解决
分布式共识问题。通常情况下,这些工作由全节点执行,就像默认的 Substrate 节点一样。
1. 区块生成。节点创建新的区块。每个新区块都包含对父区块的引用。
2. 区块最终性。当链中出现分叉时,节点必须选择哪一侧的分叉是真实或“规范”的。一旦区块被最终确认,规范链将永远包含它。
让我们单独看看提到的每个算法,并了解它们如何完成这些任务。
区块生成
Aura
Aura 主要提供区块生成。在 Aura 中,已知的一组授权机构被允许生成区块。在开始区块生产之前,必须选择这些机构,并且所有机构都必须知道整个授权机构集。时间被划分为固定长度的“插槽”。在每个插槽中,会生成一个区块,并且授权机构轮流无限期地生成区块。
在 Aura 中,只有在需要较长时间才能通过网络传输区块时,才会出现分叉。因此,在良好的网络条件下,分叉不常见。
Babe
Babe主要提供块编写。与Aura一样,它是一种基于插槽的共识算法,具有已知的验证器集合。此外,每个验证器被分配一个权重,在块生产开始之前必须分配。不像Aura,当局方不会轮流进行。相反,在每个回合中,每个当局使用
VRF生成一个伪随机数。如果随机数小于其权重,则允许其生成块。
因为在同一插槽中可能有多个验证器能够生成块,所以在Babe中出现分叉比在Aura中更常见,即使在良好的网络条件下也很常见。
Substrate对Babe的实现还具有当给定插槽未选择任何当局时的备用机制。
工作量证明(Proof of Work)也提供块编写。与Babe和Aura不同,它不是基于插槽的,并且没有已知的当局集合。在工作量证明中,任何人都可以在任何时间生成块,只要他们可以解决一个计算上具有挑战性的问题(通常是哈希
preimage search)。这个问题的难度可以调整以提供统计学上的目标块时间。
区块最终化
概率方法
我们之前讨论过的每个块作者机制都需要知道它应该在链的哪个位置构建下一个块。像“最长链规则”、“最重子树”等方法通常在实践中有效,并提供概率确定性。也就是说,每添加一个新块到链上,它被回滚的概率会降低,接近于零。当需要确保块已经最终确定时,可以使用更复杂的游戏。
Grandpa
Grandpa提供块确定性。它有一个已知的加权授权集,类似于Babe。但是,Grandpa不编写块;它只是监听关于由上述三个作者引擎生成的块的流言。每个授权参与两轮投票。投票细节超出了本文的范围。一旦2/3的grandpa授权对特定块进行了投票,该块就被认为是最终确定的。
混合共识
通常情况下,块作者引擎和确定性小工具可以在单个链中一起使用,就像代码中链接的Babe和Grandpa一样。当使用这样的系统时,块作者引擎必须知道已确定的块,以便它们不会浪费时间在永远不会在规范链中的块上进行构建。
关于权重的注意事项:Babe、Grandpa和许多其他未与Substrate捆绑在一起的算法都依赖于权重。共识算法本身通常不规定如何分配权重,而是假定它们以某种方式被分配,将分配留给外部机制。在公共网络中,通常根据抵押代币的数量来分配权重。在默认的Substrate节点中,所有权重都设置为1
,因为phragmen算法使所有验证器保持相等的抵押。