Substrate支持“可插入共识”,因此开发人员可以从几种共识算法中进行选择。它标配有四种算法:
其中一些(例如babe and grandpa)甚至可以在单个节点中一起使用。每个共识算法之间有什么区别,哪些可以或应该一起使用?
最佳答案
为了使区块链能够正常运行(持续增长并添加新交易),必须解决两件事才能解决distributed consensus问题。通常,这些作业由完整的节点执行,就像默认的“基板”节点一样。
让我们看看分别提到的每种算法,看看它们是如何完成这些任务的。
块创作
光环
Aura主要提供块创作。在光环中,允许一组已知的权限生成块。必须在块生产开始之前选择权限,并且所有权限都必须知道整个权限集。时间分为固定长度的“时隙”。在每个时隙中,产生一个块,并且当局轮流顺序地产生块。
在Aura中,仅当分块穿越网络的时间比插槽持续时间长时,才会发生 fork 。因此, fork 在良好的网络条件下并不常见。
贝贝
贝贝还主要提供块创作。像Aura一样,它是一种基于时隙的共识算法,带有一组已知的验证程序。另外,为每个验证器分配了权重,必须在开始生产块之前分配权重。与光环不同,当局不会按顺序进行。取而代之的是,在每个回合期间,每个授权机构都使用VRF生成伪随机数。如果随机数小于它们的权重,则允许它们产生一个块。
由于多个验证程序可能在同一个时隙中产生一个块,因此在Babe中, fork 比在Aura中更常见,即使在良好的网络条件下也很常见。
当在给定的时段内未选择任何权限时,基板的Babe实现也具有备用机制。
工作证明
工作量证明还提供了块创作。与Babe和Aura不同,它不是基于插槽的,并且没有已知的权限集。在工作量证明中,任何人都可以随时生成一个块,只要他们可以解决计算上的难题(通常是preimage search哈希)即可。可以调整此问题的难度以提供统计目标阻止时间。
块定稿
概率方法
我们之前讨论的每种块编写机制都需要知道应该在链上的哪个位置构建下一个块。诸如“最长链规则”,“最重观察到的子树”之类的方法通常在实践中起作用并提供概率确定性。也就是说,随着每个新块添加到链中,将其还原的可能性降低,接近零。当需要真正确定方块是最终的时,可以使用更复杂的游戏。
爷爷
爷爷提供了块定稿。它具有像贝贝一样的已知加权权限集。但是,祖父不会编写块。它只是听闲话,谈论某些创作引擎(如上面讨论的三个)所产生的块。每个机构都参与两轮针对区块的投票。 details of the voting超出了本文的范围。一旦2/3的爷爷当局对某个特定区域进行了投票,则该区域将被视为最终定案。
混合共识
通常,块编写引擎和finality小工具可以在单个链中一起使用,因为问题中链接的代码中有Babe和Grandpa。使用这样的系统时,必须使块编写引擎知道已完成的块,以免浪费时间在永远不会出现在规范链中的块上。
有关权重的说明:贝贝,爷爷和许多其他未与Substrate捆绑在一起的算法都依赖于权重。共识算法本身通常不决定权重的分配方式,而是假设它们以某种方式分配,而将分配留给外部机制。在公共(public)网络中,通常基于放样多少 token 来分配权重。在默认的“底物”节点中,所有权重均设置为
1
,因为phragmen algorithm可使所有验证器保持几乎相等的赌注。