1. 星空财经BlockGlobe首页
  2. 星空荐读

以太坊升级:关于共识的基础知识

这是一本关于以太坊权益证明协议的权威技术书籍。将从一些初步的内容开始,涵盖一些不限于以太坊的共识基础。

以太坊升级:关于共识的基础知识

原文作者:Ben Edgington

原文编译:tiao, LXDAO

分叉选择规则

正如我们所见,由于各种原因——网络延迟、网络中断、消息接收顺序错误、对等节点的恶意行为——网络上的节点最终会对网络状态有不同的视图(view)。最终,我们希望网络上的每个正确节点都能对历史达成一致的线性视图,从而对系统状态形成共同的视图。协议的分叉选择规则(fork choice rule)就是为了达成这种一致。

当给定一个区块树,以及一些基于节点对网络的本地视图的决策标准时,分叉选择规则的设计初衷是从所有可用的分支中,选择最有可能成为最终的线性的规范的链的那一个。也就是说,当节点试图向规范视图靠拢时,它将选择最不可能被修剪出区块树的分支。

分叉选择规则通过选择一个分支顶端的区块(被称为头块)来隐含地选择一个分支。

对于任何正确的节点,任何分叉选择规则的第一标准是:它选择的区块必须是有效的,遵守了协议的规则,并且它的所有祖先也必须是有效的。任何无效的区块都会被忽略,而建立在无效区块上的任何区块自身也是无效的。

鉴于此,有许多不同的关于分叉选择规则的例子。

  • 以太坊和比特币中的工作量证明协议使用「最重链规则」 [4](有时称为「最长链」,尽管这并不完全准确)。头块是在工作量证明下完成最多累积「工作」的链的顶端。
  • 以太坊的权益证明 Casper FFG 协议中的分叉选择规则是「跟随包含最高的合理检查点的链」,并且永远不会回滚一个已经最终确定的区块。
  • 以太坊的权益证明 LMD GHOST 协议中的分叉选择规则在其名称中有所体现:采用「最贪婪、最重的被观察子树」。它涉及去计算验证者对区块及其后代区块的累积投票。它也适用与 Casper FFG 相同的规则。

我们将在它们各自的章节中详细解释第二和第三个例子。

你可能已经看出来了,这些分叉选择规则都是为一个区块分配数字分数的方法。获胜的区块——头块——有最高的分数。背后的想法是,当所有正确的节点最终看到某个区块时,将毫不含糊地认同它是头块,并选择跟随其分支,无论自己对网络有什么其它视图。因此,所有正确的节点最终都会就一个被追溯到创世纪的单一规范链的共同视图达成一致。

重组(Reorgs)和回滚(reversions)

当一个节点接收到新的区块(和在权益证明中对区块的新投票)时,它将根据新信息重新评估分叉选择规则。最常见的情况是,新区块将是节点当前视为头块的区块的子区块,并将成为头块。

然而,有时新区块可能是区块树中某个其他区块的后代(请注意,如果节点还没有新区块的父区块,它需要询问其对等节点以获得父区块,对于它知道自己所缺失的任何其它区块也是如此)。

无论在何种情况下,在更新的区块树上运行分叉选择规则可能会指向一个与先前头块不同分支上的头块。当这种情况发生时,节点必须执行重组(reorg,是 reorganisation 的简写),这也被称为回滚。它将踢出(回滚)之前已经包含在其链中的区块,并将采用新的头块分支上的区块。

在以下图表中,节点评估区块 F 为头块,因此其链由区块 A, B, D, E, F 组成。节点知道区块 C,但它不在节点的链的视图中;区块 C 在一个侧分支上。

一段时间后,节点接收到区块 G,它不是建立在节点当前的头块 F 上 ,而是建立在区块 C 的分支上。根据分叉选择规则的细节,节点可能仍然评估 F 为比 G 更好的头块,因此忽略 G。但在当前情形中,我们将假设分叉选择规则表明 G 是更好的头块。

区块 D, E, 和 F 不是区块 G 的祖先,所以它们需要从节点的规范链中移除。这些区块包含的任何交易或信息都将被回滚,就好像它们从未被接收过一样。节点必须完全倒回处理区块 B 之后的状态。

倒回区块 B 后,节点可以将区块 C 和 G 和添加到其链中并相应地处理它们。一旦结束,节点就完成了其链的重组。

稍后,可能会出现一个建立在区块 F 之上的区块 H。如果分叉选择规则表明新的头块应当是 H,那么节点将再次执行重组,回滚区块到 B,并重新建立分支 H 上的区块。

在工作量证明和以太坊的权益证明协议中,由于区块传播的网络延迟,短暂的一两个区块的重组并不罕见。除非链遭到攻击、分叉选择规则的制定或分叉选择规则客户端的实现存在漏洞,否则非常长的重组应该极为罕见。

安全性与活性

在讨论共识机制时,经常蹦出来两个重要概念:安全性(safety)和活性(liveness)

安全性

非正式地说,如果「没有坏事发生」 [5],则某算法就被认为是安全的。

在区块链环境中可能发生的坏事情的例子包括加密货币的双花(double-spend),或者两个彼此冲突的检查点的最终确定。

分布式系统中安全性的一个重要方面是「一致性」。也就是说,如果我们询问不同的(诚实的)节点在链的某个进展点上的状态,例如在特定区块高度时某个账户的余额,那么无论我们询问哪个节点,我们应该总是得到相同的答案。在一个安全的系统中,每个节点对链的历史都有一个永不改变的相同视图。

实际上,安全性意味着我们的分布式系统「表现得像一个中心化实例,一次只执行一个原子化的操作。」(引用 Castro 和 Liskov)。在 Vitalik 的中心化分类中,一个安全的系统是在逻辑上是中心化的。

活性

再次非正式地说,如果「最终会发生一些好事」,那么某种算法就被认为具有活性。

在区块链环境中,我们通常认为这意味着链总是可以添加一个新区块;它永远不会陷入无法产生包含交易的新区块的僵局。

「可用性(Availability)」是看待这个问题的另一种方式。我希望链是可用的,这意味着如果我向一个诚实的节点发送一个有效的交易,它最终会被包含在一个扩展了这条链的区块中。

二者不可兼得!

CAP 定理是分布式系统理论中的一个著名结果,它指出没有分布式系统可以同时提供(1)一致性(consistency),(2)可用性(availability)和(3)分区容错性(partition tolerance)。分区容错性是指节点之间的通信不可靠时仍能正常运行的能力。例如,网络故障可能将节点分成两个或多个无法相互通信的群组。

在区块链的语境中很容易证明 CAP 定理。假如亚马逊网络服务(AWS)下线,使得所有由 AWS 托管的节点可以相互通信,但没有一个节点可以与外界通信;或者一个国家阻止所有进出的连接,使得没有任何 gossip 流量可以通过。这两种情况都将节点分成两个不相干的组,如 A 与 B。

假设连接到 A 组网络的某账户发送了一个交易。如果 A 组中的节点处理了该交易,那么他们最终的状态就与 B 组中的没有看到该交易的节点们不同。因此,总的来说,我们失去了所有节点之间的一致性,因此失去了安全性。避免这种情况的唯一方法是 A 组中的节点拒绝处理交易,在这种情况下我们失去了可用性,以及活性。

总之,CAP 定理意味着,我们无法指望设计出一个在任何情况下都既安全又具有活性的共识协议,因为我们别无选择,只能在一个不可靠的网络上运行,即互联网 [6]。

以太坊优先考虑活性

在网络状况良好的情况下,以太坊共识协议可同时提供安全性和活性,但在网络运行不太顺畅时,则优先考虑活性。在网络分区的情况下,分区两侧的节点将继续产生区块。不过,最终确定性(finality,安全性的一种属性)将不再在分区两侧一起发生。根据两侧管理的质押比例,要么一侧继续获得最终确定性,要么两侧都不会继续获得最终确定性。

最终,除非分区得到解决,否则双方都会因新颖的怠惰惩罚(inactivity leak)机制而重新获得最终确定性。但这也最终会导致安全故障。每条链将最终确定不同的历史,两条链将永远变得不可调和和独立。

最终确定性(Finality)

我们将在接下来的章节中大量讨论最终确定性,这是链的安全性的属性。

最终确定性是指有些区块永远不会被回滚。当一个区块被最终确定时,网络上的所有诚实节点都同意该区块将永远保留在链的历史中,因此它的所有祖先也将保留在链的历史中。最终确定性让你对比萨饼的支付不可撤销,就像用现金一样。这是对双花的终极保护 [7]。

一些共识协议,如经典的 PBFT 或 Tendermint,每轮(每个区块)都会最终确定。一旦一轮交易被包含在链上,所有节点都同意它将永远存在。一方面,这些协议非常「安全」:一旦交易被包含在链上,它将永远不会被回滚。另一方面,它们容易发生活性故障:如果节点无法达成一致——例如,如果超过三分之一的节点关闭或不可用——那么就没有交易可以被添加到链上,链将停止运行。

其他共识协议,如比特币的中本聪共识,根本没有任何最终确定性机制。总是存在有人呈现出一个更重的替代链的可能性。当这种情况发生时,所有诚实的节点必须相应地重组他们的链,回滚他们之前处理的任何交易。诸如你的区块有多少确认之类的启发式方法只是对最终确定性的近似值,而无法保证 [8]。

以太坊的共识层优先考虑活性,但也努力在有利的情况下以最终确定性的方式提供安全保证。这是试图两全其美的尝试。Vitalik 这样辩护 [9]:

一般原则是你想给予用户「尽可能多的共识」:如果达成共识的节点 > 2/3,那么我们就会得到常规的共识。但如果 < 2/3,那也不需要停下来什么也不做,显然,尽管新区块的安全性暂时降低,链仍然可能继续增长。如果个别应用不满意较低的安全级别,它可以自由地忽略那些区块,直到它们被最终确定。

在以太坊的共识层中,最终确定性是由 Casper FFG 机制提供的,我们很快就会探讨这一机制。其原理是,所有诚实的验证者定期就最近的检查点区块达成一致,他们永远不会撤销这些区块。然后,该区块及其所有祖先区块就是「最终确定的」区块——它们永远不会改变,如果你向网络中的任何诚实节点询问它们或其祖先区块的情况,你总会得到相同的答案。

以太坊的最终确定性是「经济最终确定性」。理论上,协议可能会最终确定两个相冲突的检查点,即对链的历史的两个矛盾视图。然而,这只有在巨大且可量化的成本下才可能出现。除了最极端的攻击或失败情景外,最终确定就是最终确定。

Casper FFG 部分深入探讨了这种最终确定性机制的工作原理。

另见

Leslie Lamport 参与的任何内容总是值得一读,他与 Shostak 和 Pease 合著的 1982 年原始论文《拜占庭将军问题》( The Byzantine Generals Problem)包含了许多洞见。虽然他们提出的算法在当今条件下已经效率极低,但该论文对推理一般共识协议是很好的引入。Castro 和 Liskov 在 1999 年发表的开创性论文《实用拜占庭容错》(Practical Byzantine Fault Tolerance)也是如此,它对以太坊的 Casper FFG 协议的设计产生了重大影响。但是,你可能会想将这些「经典」方法与中本聪在 2008 年比特币白皮书中描述的工作证明优雅的简洁性相对比。如果说工作量证明有什么优点的话,那就是它的简洁。

上文中我们提到了 Gilbert 和 Lynch 在 2012 年的论文《CAP 定理的视角》(Perspectives on the CAP Theorem)。这篇论文对一致性和可用性(或我们语境中的安全性和有效性)概念进行了深入探讨,有很强的可读性。

由于分叉选择规则的客户端实现之间存在差异,以太坊信标链在 2022 年 5 月经历了七个区块的重组。这些差异在当时是众所周知的,并且被认为是无害的。事实证明并非如此。巴纳贝 – 蒙诺(Barnabé Monnot)对这一事件的描述非常有启发性。

Vitalik 的博客文章《关于结算的最终确定性》(On Settlement Finality)提供了对最终确定性概念更深入、更细致的探索。

对于我们正在构建的系统,我们的理想是它们是政治去中心化的(以实现无许可和抗审查),架构去中心化的(以实现无单点故障的抗逆力),但在逻辑上是中心化的(以实现一致的结果)。这些标准对我们如何设计共识协议有很大影响。Vitalik 在《去中心化的意义》(The Meaning of Decentralization)一文中探讨了这些问题。

本文来自LXDAO,经授权后发布,本文观点不代表星空财经BlockGlobe立场,转载请联系原作者。