Substrate 提供多种 Aura、BABE、PoW 等多种区块生产方法。

原文标题:《波卡的共识(进阶版)》
撰文:Polkadot
翻译:PolkaWorld 社区

区块链节点使用共识引擎在区块链状态上达成统一。本文介绍了区块链系统中共识的基本原理,共识如何与 Substrate 框架中的 runtime 交互,以及框架中可用的共识引擎。

一文了解 Polkadot 共识原理及如何与 Substrate 框架交互

状态机和冲突

区块链 runtime 是一个状态机 [1]。它有一些内部状态和状态转换功能,允许它从当前状态转换到未来状态。在大多数 runtime 中,有些状态具有到多个未来状态的有效转换,但必须选择一个转换。

区块链必须在以下几方面达成一致:

  • 一些初始状态,叫做「创世」
  • 一系列的状态转换,每个都称为「区块」
  • 最终(当前)状态

为了对转换后的结果状态达成一致,区块链的状态转换功能 [2] 中的所有操作都必须是确定性的。

冲突排除

在中心化系统中,中心化的权限通过按照他们看到的顺序记录状态转换,在相互排斥的备选方案中进行选择,并在发生冲突时选择竞争备选方案中的第一个。在去中心化系统中,节点将看到不同顺序的交易,因此它们必须使用更精细的方法来排除交易。更复杂的是,区块链网络力求容错,这意味着即使某些参与者不遵守规则,系统也应继续提供共识的数据。

区块链将交易批处理成区块,并有一些方法来选择哪个参与者有权提交区块。例如,在 PoW 链中,首先找到有效工作证明的节点有权向链提交块。

Substrate 提供多种区块构造算法,还允许你创建自己的:

  • Aura (Round Robin)
  • BABE (基于插槽)
  • PoW

分叉选择的规则

作为一个基元,区块包含一个区块头和一批外部对象 [3]。区块头必须包含对其父块的引用,以便可以跟踪链的起源。当两个区块引用同一父块时,会发生分叉。必须解决分叉,以便只存在一个规范链。

分叉选择规则是一种算法,它获取一个区块链并选择「最佳」链,从而选择应该扩展的链。Substrate 通过 SelectChain 展现了这个概念。

Substrate 允许你编写一个自定义的分叉选择规则,或使用一个现成的。例如:

最长链规则

最长链规则简单地说,最好的链就是最长的链。Substrate 用 LongestChain 结构提供这个链选择规则。GRANDPA 用最长链规则进行投票。

一文了解 Polkadot 共识原理及如何与 Substrate 框架交互

GHOST 规则

GHOST 规则就是,从创世块开始,通过递归地选择在其上构建块最多的分支来解决每个分叉。

一文了解 Polkadot 共识原理及如何与 Substrate 框架交互

区块生产

区块链网络中的某些节点能够生成新的区块,这一过程称为 authoring。具体哪些节点可以编写区块取决于你使用的共识引擎。在一个中心化的网络中,一个节点就可以编写所有的区块,而在完全无权限的网络中,算法必须在每个高度选择区块的生产者。

PoW

在像比特币这样的 PoW 系统中,任何节点都可以在任何时候生成一个块,只要它解决了计算密集的问题。解决这个问题需要 CPU 时间,因此矿工只能根据计算资源的比例生成块。

Substrate 提供了一个 PoW 块生产引擎。

插槽

基于插槽的共识算法必须有一组已知的验证人,这些验证人可以生成块。时间被分配到不同的插槽中,在每个插槽中只有一些验证人可以产生块。在每个插槽中,验证人可以编写块的细节因引擎而异。Substrate 提供 Aura 和 Babe,这两个都是基于插槽的区块生产引擎。

最终性

任何系统中的用户都想知道他们的交易何时完成,区块链也不例外。在一些传统的系统中,最终性发生在收据被移交或文件被签署时。

使用到目前为止描述的区块生产方案和分叉选择规则,交易永远不会完全完成。总有一个机会,一个较长(或较重)的链将出现,并恢复你的交易。然而,在一个特定的块上构建的块越多,它被还原的可能性就越小。这样,块生产和适当的分叉选择规则提供了概率的最终性。

当需要确定的最终性时,可以向区块链的逻辑中添加一个终结性小工具。一个固定权限集的成员铸造最终性的投票,当对某个区块投了足够的票时,该区块被视为最终的。在大多数系统中,这个阈值是 2/3。如果没有外部协调(如硬分叉),由此类小工具完成的块将无法恢复。

一些共识系统将出块和最终性联系在一起,例如,最终性是出块过程的一部分,在块 N 完成之前,不能生成新的块 N+1。然而,Substrate 分离了这两个过程,并可以单独使用任何具有概率终结性的出块引擎,或者将其与最终性小工具耦合以获得确定性的最终性。

在使用最终性小工具的系统中,必须修改分叉选择规则以考虑最终性游戏的结果。例如,节点将选择包含最近完成的块的最长链,而不是选择最长链的周期。

Substrate 中的共识

Substrate 框架附带了几个共识引擎,这些引擎提供了块生产或最终性。本文简要概述了 Substrate 本身自带的产品。欢迎开发者提供自己的定制共识算法。

Aura

Aura[4] 提供基于插槽的块生产机制。在 Aura 中,一个已知的权限集轮流出块。

BABE

BABE[5] 是通过一组已知验证人的基于插槽的块生产共识。在这些方面它类似于 Aura。与 Aura 不同,插槽分配基于可验证随机函数(VRF)的评估。为每个验证人分配一个 epoch 的 weight。这个 epoch 被分成多个插槽,验证人在每个插槽计算它的 VRF。对于验证人的 VRF 输出低于其 weight 的每个插槽,允许生成一个块。

因为多个验证人可能会在同一个插槽中产生一个块,所以分叉在 BABE 中比在 Aura 中更常见,即使在良好的网络条件下也很常见。

当在给定的插槽内没有区块的生产者时,Substrate 的 BABE 实现也有一个后备机制。这些 「次要」 插槽分配允许 BABE 获得恒定的区块时间。

PoW

PoW 块的生产不是基于插槽的,也不需要已知的权限集。在 PoW 中,任何人都可以在任何时候生成一个块,只要他们能够解决一个具有计算挑战性的问题(通常是找出哈希原像)。这个问题的难度可以调整为提供一个统计目标块时间。

GRANDPA

GRANDPA[6] 提供区块的最终性。它有一个像 BABE 一样的已知 weight 的权限集。然而,GRANDPA 并不生产块,它只听取由生产引擎(比如上面三种)生成的块的「八卦」。GRANDPA 验证人在链上投票,而不是在区块上投票,也就是说,他们投票给一个他们认为「最好」的区块,并且他们的投票可以传递地应用到之前的所有区块。一旦超过三分之二的 GRANDPA 权限者投票支持某一特定区块,它就被认为是最终的。

与 Runtime 协调

最简单的静态共识算法完全在 runtime 之外工作,正如我们目前所描述的那样。然而,许多共识游戏通过添加需要与 runtime 协调的功能而变得更加强大。例如,包括 PoW 中的可调难度、权威证明中的权限轮换以及 PoS 网络中的基于 stake 的权重。

为了适应这些共识特征,Substrate 有一个 DigestItem 的概念,一个从节点的外部(共识所在的地方)传递到 runtime 的消息,反之亦然。

了解更多

因为 BABE 和 GRANDPA 都在波卡网络中使用,Web3 基金会提供了研究级别的算法演示。

  • BABE Research[7]
  • GRANDPA Research[8]

所有确定性的最终性算法,包括 GRANDPA,都需要至少 2f + 1 个非故障节点,其中 f 是故障或恶意节点的数量。你可以在有缺陷的情况下达成一致 [9] 的开创性论文或维基百科:拜占庭错误 [10] 中,了解更多关于这个门槛的来源以及为什么它是理想的。

并非所有的共识协议都定义了一个单一的规范链。当具有相同父块的两个块没有冲突的状态更改时,一些协议验证有向无环图 [11](DAG)。

参考链接

[1] 状态机:
https://en.wikipedia.org/wiki/Finite-state_machine

[2] 状态转换功能:
https://substrate.dev/docs/en/knowledgebase/runtime/index

[3] 外部对象:
https://substrate.dev/docs/en/knowledgebase/learn-substrate/extrinsics

[4]Aura:
https://crates.parity.io/sc_consensus_aura/index.html

[5]BABE:
https://crates.parity.io/sc_consensus_babe/index.html

[6]GRANDPA:
https://crates.parity.io/sc_finality_grandpa/index.html

[7]BABE Research:
https://research.web3.foundation/en/latest/polkadot/BABE/Babe.html

[8]GRANDPA Research:
https://research.web3.foundation/en/latest/polkadot/GRANDPA.html

[9] 缺陷的情况下达成一致:
https://lamport.azurewebsites.net/pubs/reaching.pdf

[10] 维基百科:拜占庭错误:
https://en.wikipedia.org/wiki/Byzantine_fault

[11] 有向无环图:
https://en.wikipedia.org/wiki/Directed_acyclic_graph

来源链接:substrate.dev