第 15 章 共识

  • ethbook
  • 发布于 4天前
  • 阅读 8

本章主要介绍了区块链中共识机制的重要性,以及以太坊如何通过工作量证明(PoW)和权益证明(PoS)达成共识。详细解释了PoS中的LMD-GHOST和Casper FFG算法,以及它们如何保证以太坊的安全性和活跃性。同时,还讨论了共识算法面临的争议和挑战,例如时间游戏和超多数客户端的中心化风险。最后强调了理解共识算法对于把握以太坊网络发展方向的重要性。

第 15 章 共识

在本书中,我们一直在讨论共识规则——每个人都必须同意的规则,以使系统以去中心化但确定的方式运行。在计算机科学中,共识一词早于区块链,并且与分布式系统中状态同步的更广泛问题相关,以便分布式系统中的不同参与者都(最终)对单一的系统范围状态达成一致。这被称为达成共识

当涉及到去中心化记录保存和验证的核心功能时,仅仅依靠信任来确保从状态更新中获取的信息是正确的可能会出现问题。这种相当普遍的挑战在去中心化网络中尤其突出,因为没有中心实体来决定什么是真实的。缺乏中心决策实体是区块链平台的主要吸引力之一,因为它具有抵抗审查的能力,并且无需依赖权威机构的许可即可访问信息。然而,这些好处是有代价的:如果没有可信的仲裁者,任何分歧、欺骗或差异都需要通过其他方式来解决。共识算法是用于协调安全性和去中心化的机制。

在区块链中,共识是系统的一个关键属性。简而言之,存在金钱风险!因此,在区块链的背景下,共识是指在保持去中心化的同时能够达成共同状态。换句话说,共识旨在产生一个没有统治者的严格规则体系。没有一个人、组织或团体 "负责";相反,权力和控制权分散在一个广泛的参与者网络中,他们的自身利益是通过遵守规则和诚实行事来实现的。

在对抗性条件下,跨分布式网络达成共识,而无需中心化控制的能力,是所有开放、公共区块链的核心原则。为了应对这一挑战并保持去中心化的宝贵属性,社区不断尝试不同的共识模型。本章将探讨这些共识模型及其对以太坊等智能合约区块链的预期影响。

注意

虽然共识算法是区块链工作方式的重要组成部分,但它们在基础层运行,远低于智能合约的抽象。换句话说,共识的大部分细节都对智能合约的编写者隐藏了。你不需要知道它们是如何工作的才能使用以太坊,就像你不需要知道路由是如何工作的才能使用互联网一样。

共识的原则

在区块链技术中,特别是以太坊中,理解共识的原则有助于我们理解网络如何维护其完整性并有效地运行。为了更清楚地了解这一切是如何运作的,让我们来看看核心思想。

安全性

在共识机制的背景下,安全性是指确保网络在区块链的当前状态上始终如一地达成一致,且没有错误。这意味着避免诸如双重支付和交易冲突之类的问题,从而在整个网络中保持一致性。在一个安全的系统中,每个节点都具有相同的链历史视图,有效地表现得像一个集中式实现,一次原子地执行操作。

最终性

最终性 是以太坊共识机制中最重要的安全特性之一。它标志着交易被认为是完整且不可逆转的点,确保一旦交易被添加到区块链中,就不能被更改或删除。交易的这种不可逆转性在系统中建立高度的信任,为用户提供对其交易被永久记录的确定性。

基本上,最终性将安全性的概念付诸行动,将其从一个概念转变为实际的东西。它确保即使网络的不同部分可能有自己的局部视图,也存在一个不可撤销的协议点,使链的历史固定且不可更改。

活跃性

虽然安全性确保网络上不会发生任何不好的事情,但活跃性 保证好的事情最终总是会发生。换句话说,以太坊网络将继续处理交易并添加新区块,无论发生什么情况。

从另一个角度来看,活跃性也可以从可用性的角度来理解。在实际操作中,这意味着每当我们向网络中诚实运行的节点提交有效交易时,我们都可以期望该交易被包含在即将到来的区块中,从而有助于区块链的扩展。这种对交易包含和处理的期望对于实现用户信任和以太坊平台的整体效用是必要的。

区块树和分叉

设计一个在任何情况下既安全又活跃的共识协议是不可能的——你必须偏向其中一个。虽然以太坊共识协议在良好的网络条件下同时提供安全性和活跃性,但在情况混乱时,它会优先考虑活跃性。它通过分叉的概念来实现这一点。

在区块链中,每个区块(除了特殊的创世区块)都建立在父区块之上并指向父区块。因此,我们最终得到一个区块链:一个区块链。在实施分叉共识协议的链上,这种线性条件在实践中通常不是这样:在现实世界的条件下,我们最终得到的东西更像是区块树——如图 15-1 所示——而不是区块链,共识协议的目标是让网络上的所有节点对相同的线性区块序列达成一致。

区块树结构

图 15-1. 区块树结构

区块树中的各种分支被称为 分叉。分叉自然而然地发生,因为网络和处理延迟或客户端故障和恶意客户端行为。

如果我们咨询遵循不同分叉的节点,它们会给我们关于系统状态的不同答案。这正是分叉共识协议的弹性所在:它们不会在不利条件下完全停止,而是会分叉。最终,我们希望网络上的每个正确节点都对历史记录有一个相同的线性视图,从而对系统状态有一个共同的视图。协议的 分叉选择规则 的作用是促成这种协议:给定一个区块树和一些决策标准,分叉选择规则旨在从所有可用的分支中选择最有可能最终出现在最终线性、规范链中的分支。分叉协议的缺点是,遵循最终没有进入规范链的分支的节点最终必须回溯它们对现实的看法,反转它们最近处理的任何交易,以便进入正确的分支。这被称为 重组回滚,它具有破坏性,因此协议旨在尽可能地减少它。

现在我们可以理解以太坊共识协议中最终性的力量:分叉是实现活跃性的强大手段,但为了使网络可用,这种灵活性必须通过一些安全保证来平衡。

通过工作量证明达成共识

最初的区块链比特币的创造者发明了一种基于工作量证明 (PoW) 的共识算法。可以说,PoW 是支撑比特币的最重要的发明。PoW 的口语化术语是 挖矿,这会产生对共识的主要目的的误解。通常,人们假设挖矿的目的是创造新的货币,因为现实世界挖矿的目的是提取贵金属或其他资源。相反,挖矿(以及所有其他共识模型)的真正目的是在保持对系统控制的去中心化和尽可能多地扩散到参与者的同时,保护区块链的安全。新铸造货币的奖励是对那些为系统安全做出贡献的人的一种激励:一种达到目的的手段。从这个意义上讲,奖励是手段,而去中心化的安全性是目的。

在 PoW 共识中,还存在相应的 "惩罚",即参与挖矿所需的能源成本。这种巨大的能源消耗不是缺陷,而是深思熟虑的安全和激励设计中的关键。如果参与者不遵守规则并获得奖励,他们将面临已经花费在挖矿电力上的资金的风险。因此,PoW 共识是风险和回报的仔细平衡,它驱使参与者出于自身利益而诚实地行事。

以太坊最初是一个 PoW 区块链,遵循比特币的例子,因为它使用了一种 PoW 算法,该算法具有相同的基本激励系统,旨在实现相同的基本目标:在去中心化控制的同时保护区块链的安全。以太坊的 PoW 算法与比特币的略有不同,被称为 Ethash

Ethash:以太坊的 PoW 算法

在以太坊过渡到 PoS 之前,它依赖于一种名为 Ethash 的 PoW 算法。它使用了 Dagger-Hashimoto 算法的演进版本,该算法是 Vitalik Buterin 的 Dagger 算法和 Thaddeus Dryja 的 Hashimoto 算法的组合。Ethash 依赖于大型数据集的生成和分析,该数据集被称为 有向无环图(或更简单地说,"DAG")。DAG 的初始大小约为 1 GB,并继续缓慢而线性地增长,每 epoch(30,000 个区块,或大约 125 小时)更新一次。

DAG 的目的是使 Ethash PoW 算法依赖于维护一个大型、频繁访问的数据结构。这反过来又旨在使 Ethash 具有抗 ASIC 性,这意味着制造比快速 GPU 快几个数量级的专用集成电路 (ASIC) 挖矿设备更加困难。以太坊的创始人希望避免 PoW 挖矿的中心化,在这种中心化中,那些可以访问专用硅制造工厂和巨额预算的人可以主导挖矿基础设施并破坏共识算法的安全性。

使用消费级 GPU 在以太坊网络上执行 PoW 意味着世界上更多的人可以参与挖矿过程。更多的独立矿工意味着挖矿能力更加去中心化,这意味着可以避免像比特币那样的情况,在比特币中,大部分挖矿能力集中在少数大型工业挖矿运营商手中。使用 GPU 进行挖矿的缺点是,它在 2017 年引发了全球 GPU 短缺,导致其价格飞涨,并引起游戏玩家的强烈抗议。这导致零售商的购买限制,将买家限制为每位客户一两个 GPU。

在 2017 年之前,ASIC 矿工对以太坊网络的威胁在很大程度上是不存在的。将 ASIC 用于以太坊需要设计、制造和分发高度定制的硬件。生产它们需要大量的时间和金钱。以太坊开发者长期以来表达的迁移到 PoS 共识算法的计划,现在已经实现,这很可能使 ASIC 供应商长期以来没有将目标锁定在以太坊网络上。

通过权益证明达成共识

从历史上看,PoW 并不是第一个被提出的共识算法。在此之前,许多研究人员探索了基于金融或声誉权益的想法。甚至更早的时候,一些最早的共识模型是被许可的:验证者是通过权威或身份选择的,而不是公开竞争。例如,实用拜占庭容错(PBFT)需要一组固定的或经过策划的验证者,这种模型至今仍是许多传统分布式系统的基础。

基于 PoW 的共识的主要突破之一是,它使任何人都可以无许可地参与:任何具有可用计算能力的人都可以贡献并获得奖励,而无需获得加入的批准。这对去中心化来说是一个巨大的胜利。从某种意义上说,PoW 的发明是为了替代更封闭的许可模型。

继比特币的成功之后,许多区块链都采用了 PoW。但是对共识的爆炸式研究重新燃起了对 PoS 的兴趣,并导致了重大进展。从一开始,以太坊的创始人就希望最终迁移到 PoS。事实上,以太坊最初的 PoW 链包含了一个内置的障碍,即所谓的 难度炸弹,它旨在随着时间的推移慢慢地使挖矿变得更加困难,从而迫使系统朝着最终的过渡方向发展。以太坊的 PoS 版本虽然是无许可的,但在早期基于权威的系统中具有一些概念上的根源:在这里,身份和参与来自于投入权益。但是由于任何拥有 ETH 的人都可以这样做,因此它保留了中本聪设计的开放访问精神。

一般来说,PoS 算法的工作原理如下。区块链跟踪一组验证者,任何拥有区块链的基础加密货币(以太坊中的以太币)的人都可以通过发送一种特殊的交易来锁定他们的以太币到存款中,从而成为验证者。验证者轮流提议和投票选出下一个有效区块,每个验证者的投票权重取决于其存款(即权益)的大小。当验证者正确参与协议时,他们会获得与其权益成比例的小额奖励。如果他们犯了错误,例如发布不准确或迟到的证明,他们可能会受到小额惩罚,其规模大致与奖励相同。但是,有一种更严重的后果叫做 削减,它只发生在验证者被证明是恶意的情况下——例如,通过发布相互冲突的证明或含糊不清的区块。因此,PoS 通过奖励和惩罚系统迫使验证者诚实行事并遵守共识规则。PoS 和 PoW 之间的主要区别在于,PoS 中的惩罚是区块链固有的(例如,损失质押的以太币),而 PoW 中的惩罚是外在的(例如,损失花费在电力上的资金)。

自 2015 年以太坊推出以来,就打算过渡到 PoS 共识协议。朝这个方向迈出的第一个具体步骤是在 2020 年 12 月 1 日推出的信标链。最初,信标链是一个空的区块链,它允许每个人通过将 32 ETH 存入特定的存款合约来成为验证者,并且仅处理其验证者及其各自余额的内部共识。当时,以太坊区块链仍然使用 Ethash 作为其共识协议。

2022 年 9 月 15 日,发生了合并硬分叉,信标链及其自身的一组验证者将其基于 PoS 的共识协议扩展到以太坊主区块链,从而有效地结束了 Ethash 的使用。但是,仍然存在一些限制,包括验证者无法提取其资本并离开验证者集。这些问题已于 2023 年 4 月 12 日通过 Shapella 更新完全解决,该更新完成了将以太坊从 PoW 过渡到 PoS 共识协议的工作。

以太坊使用的 PoS 共识协议称为 Gasper。在以下部分中,我们将探讨它是如何工作的,从基本术语开始,然后发展到分叉选择规则(LMD-GHOST)和 finality gadget (Casper FFG)。最后,我们将通过一个示例来说明我们讨论的理论概念。

PoS 术语

在本节中,我们将重点关注以太坊 PoS 共识组件和术语。

节点和验证者

节点 构成了以太坊网络的主干。他们彼此通信,并负责验证对共识的遵守情况。验证者 负责提议和投票选出新区块,它们连接到这些节点上,但尽管名称可能暗示,但它们实际上并不验证区块本身。相反,是节点软件检查区块和交易是否遵循协议规则。单个节点可以托管多个验证者,而验证者的职责是通过运行执行客户端和共识客户端来执行的。我们将在后面的章节中看到这些职责到底是什么。

要记住 PoS 的一个特殊属性是,活跃验证者的集合是已知的:这将是实现最终性的关键,因为我们可以确定何时已经达到了参与者的大多数投票。

区块和证明

严格的时间管理是以太坊 PoS 的一个重要属性。PoS 中的两个关键间隔是 slot,它正好是 12 秒,而 epoch,它跨越 32 个 slot。

在每个 slot 中,都会选择一个验证者来提议一个区块。在每个 epoch 期间,每个验证者都会以 证明 的形式分享他们对世界的看法一次。证明包含对链头的投票,这些投票将由 LMD-GHOST 协议使用,以及对将由 Casper FFG 协议使用的检查点的投票,其中 FFG 代表 "Friendly Finality Gadget"。证明共享是带宽密集型的,因此它分布在每个 epoch 中,而不是每个区块中,以分散必要的工作量并使其易于管理。

该协议通过奖励和惩罚验证者的系统来激励区块和证明的生产和准确性,但它容忍空缺的 slot 和证明,这可能是出于有机原因(例如,节点离线)和利润驱动的原因。我们将在后面的 "Timing Games" 章节中对此进行扩展。

LMD-GHOST

LMD-GHOST 是以太坊共识协议的主要部分:它是分叉选择规则算法。它选择节点在其区块链本地视图中应视为有效的最新区块。该区块也称为 链头

要完全理解它是如何工作的,您必须了解以太坊 PoS 协议的一些基本概念。在经典的基于 PoW 的共识协议中,负责创建新区块并将其添加到链中的实体(即矿工)不需要遵守任何特殊要求。如果他们发布一个满足 PoW 的区块,那么它就会被整个网络接受。在以太坊基于 PoS 的共识协议中,验证者必须质押大量的 ETH 作为抵押品——目前至少 32 个 ETH——才能进入验证者集合。

正如我们之前简要提到的那样,验证者有两个主要职责:

区块提议

每个 slot,都会伪随机地选择一个验证者来创建和提议链的下一个区块。

创建证明

每个 slot,都会选择一部分验证者来发布他们对他们认为是最佳链头的区块的投票。然后,这种投票以证明的形式分享给每个验证者。

当验证者在证明中投票支持某个区块时,他们实际上是在为其分配一个分数。该分数完全等于验证者在发布证明时质押的 ETH 金额。但还有更多:这种投票不仅是对该区块的投票,也是对位于该选定区块同一分叉中的所有祖先区块的投票,如图 15-2 所示。

投票传播到祖先

图 15-2. 投票传播到祖先

您可以说对某个区块的投票会传播回其所有祖先。为了使这个概念更加清晰,我们可以为所有分支分配一个分数。分支 是将一个区块与其父区块连接起来的链接,如图 15-3 所示。

分支定义

图 15-3. 分支定义

我们将分支的分数定义为以该分支为根的区块的分数(图 15-3 中的区块 B)加上其所有直接后代分支的分数之和。

图 15-4 显示了一个区块链,其中每个区块的分数等于 1。连接 E 到 D 的分支的分数完全等于区块 E 的分数,因为没有后代区块。要计算分支 D→C 的分数,您需要将区块 D 的分数添加到所有后代分支的分数。在这种情况下,只有一个后代分支:分支 E→D。所以它是 1(区块 D 的分数)+ 1(分支 E→D 的分数)= 2。然后我们有分支 C→B:它的分数是 1(区块 C 的分数)+ 2(分支 D→C 的分数)= 3。在这里,我们有一个带有区块 C' 的小分叉;我们需要为分支 C'→B 分配一个分数。它的分数只有 1(区块 C' 的分数),因为区块 C' 没有直接后代。最后,我们有分支 B→A;要计算它的分数,我们需要将 1(区块 B 的分数)+ 1(分支 C'→B 的分数)+ 3(分支 C→B 的分数)相加 = 5。

分支分数计算示例

图 15-4. 分支分数计算示例

图 15-5 包含一个更复杂的场景,其中有几个分叉,每个区块都有不同的分数。看看它,确保您理解了每个分支的分数是如何计算的。

复杂的分支评分

图 15-5. 复杂的分支评分

在看完上一个示例之后,应该很清楚,一个区块的分数不仅影响了该单个区块,而且还影响了它的所有祖先,因为它会传播回所有先前的分支。这个想法是,如果验证者投票(以证明的形式)支持某个区块成为链头,那么它也会认为它的所有祖先都是有效的,并且是正确链的一部分。

现在,我们终于可以深入了解 LMD-GHOST 真正的工作原理以及它如何选择要视为链头的区块的细节了。让我们从分析它的名称开始。LMD-GHOST 由两个首字母缩写组成:latest message drivengreediest heaviest observed subtree

最新消息驱动

要为每个区块和分支分配一个分数,您需要只考虑每个验证者的最新证明。这意味着,如果您收到来自验证者 V 的两个证明,那么您不必对它们进行两次计数;您需要检查哪一个是最近的,并丢弃另一个。

图 15-6 显示了一个验证者在区块 B 上发布了一个证明,其中他们分享了他们认为区块 B 是链头的事实。然后,稍后在区块 F 期间,该验证者再次被选中发布一个新的证明,其中他们表达了他们对区块 F 作为新链头的偏好。当该验证者在区块 F 上发布新的证明时,其他验证者需要丢弃旧的证明(在区块 B 期间发布),并且只考虑最新的证明。

最新消息驱动示例

图 15-6. 最新消息驱动示例

最贪婪的最重观察子树

GHOST 是分叉选择规则的关键方面。头区块是没有进一步后代的区块,它是具有最高投票的分叉的一部分。

让我们在实践中看看它,以更好地理解 LMD-GHOST 如何在实际场景中工作。图 15-7 表示我们之前使用的相同场景。

LMD-GHOST 场景

图 15-7. LMD-GHOST 场景

LMD-GHOST 始终从被认为是最终链一部分的初始区块开始。最初,那是创世区块,但使用完全基于 PoS 的以太坊共识协议,它会不断地使用上一个经过验证的检查点区块进行更新——这是我们将在 "Casper FFG:最终性小工具" 中探讨的术语。如果您还不知道什么是经过验证的检查点,那并不重要;您只需要知道始终有一个起始区块。

在此示例中,区块 A 是初始区块。假设我们是一个需要发布证明或被选中提议下一个区块的验证者。我们需要运行 LMD-GHOST 以了解哪个区块是链头,以便我们可以相应地发布证明,或者我们可以在正确的前一个头区块之上构建下一个区块。到目前为止,我们已经收集了其他验证者的证明,仅考虑每个验证者的最新证明,遵循协议的 LMD 规则。因此,我们拥有了所有区块的分数,这些分数是由每个验证者给每个区块的分数之和构成的。

此时,LMD-GHOST 分为两个步骤工作:

  1. 它为所有分支分配一个分数,遵循我们之前解释的相同方法,通过向后传播每个区块的分数到所有先前的分支。图 15-8 显示了所有分支的最终分数。

计算出的分支分数

图 15-8. 计算出的分支分数

  1. 然后,从初始区块开始,协议的 GHOST 部分贪婪地选择具有最高分数的区块,直到到达没有后代的区块。这是 LMD-GHOST 分叉选择规则返回的头区块。

让我们在我们的示例中逐步运行此过程。LMD-GHOST 从初始区块 A 开始,立即转到区块 B,因为没有其他分支可供选择,如图 15-9 所示。

LMD-GHOST 步骤 1

图 15-9. LMD-GHOST 步骤 1

现在,有两个分支可供选择:

  • 分支 C→B,分数为 8
  • 分支 D→B,分数为 6

GHOST 贪婪地选择分支 C→B,因为它具有最高分数,如图 15-10 所示。请注意,区块 D 的分数高于区块 C 并不重要,因为 LMD-GHOST 不考虑单个区块的分数,而是考虑区块所在的整个分叉的分数。

LMD-GHOST 步骤 2

图 15-10. LMD-GHOST 步骤 2

我们现在有两个不同的分支可供选择:

  • 分支 E→C,分数为 4
  • 分支 F→C,分数为 3

GHOST 选择分支 E→C,如图 15-11 所示。

LMD-GHOST 步骤 3

图 15-11. LMD-GHOST 步骤 3

此时,我们只有一个分支可供选择,即分支 H→E,因此这是 GHOST 选择的分支,如图 15-12 所示。

LMD-GHOST 步骤 4

图 15-12. LMD-GHOST 步骤 4

区块 H 没有后代。LMD-GHOST 停止并将其作为链的新头区块返回。

激励措施

LMD-GHOST 为严格遵守规则的验证者提供了各种明确的激励措施,并为恶意行为者提供了惩罚。在本节中,我们将探讨它是如何阻止恶意行为者违反规则并奖励仁慈行为者的。

验证者需要执行两个不同的职责:

  • 提议区块
  • 创建证明

对于每一个职责,LMD-GHOST 都包含多种方法来确保每个人都按照规则行事。

提议区块

当验证者被选择向链中提议一个新区块时,它必须只创建一个有效的区块。通过这样做,验证者将获得他们创建的区块中包含的所有交易的优先费用之和,加上一些新铸造的 ETH,如图 15-13 所示。

区块提议奖励

图 15-13. 区块提议奖励

如果验证者试图通过创建多个区块作弊,协议会明确地通过削减一部分他们的质押来惩罚他们。事实上,要成为验证者集合的一部分,您必须质押一些 ETH 作为抵押品(至少 32 ETH)。此质押(也)是必要的,以便协议可以通过削减来惩罚您——即,从中删除一些 ETH,如图 15-14 所示。

区块提议削减

图 15-14. 区块提议削减

注意

这里值得注意的是,明确的惩罚是以太坊 PoS 共识协议和比特币 PoW 之间的巨大差异。如果比特币矿工的区块成为最重链的一部分,他们会获得奖励。如果他们为一个区块号创建了多个区块,则没有明确的惩罚。

您可能想知道为什么。这是因为基于 PoW 的系统需要进行一些工作才能创建一个有效的区块(PoW 本身)。如果矿工创建了多个区块,他们只是在浪费时间和金钱,因为最终只有一个区块会进入最重链,因此他们只会获得其中一个区块的奖励。

以太坊 PoS 协议不需要验证者执行 PoW 才能创建有效的区块。这意味着创建多个区块对于验证者来说几乎是免费的。这就是为什么我们需要对任何试图以这种方式作弊的人进行明确的惩罚。

创建证明

当验证者被选择以证明的形式分享他们对网络的看法时,他们必须只发布一个有效的证明。通过这样做,他们会获得少量费用(远小于区块提议者获得的费用),如图 15-15 所示。

证明奖励

图 15-15. 证明奖励

如果验证者试图通过创建多个证明或矛盾证明来作弊,协议会明确地通过削减一部分他们的质押来惩罚他们,如图 15-16 所示。

证明削减

图 15-16. 证明削减

如果验证者长期以来一直表现出恶意行为,协议有权将他们强制从验证者集合中驱逐出去。

Casper FFG:最终性小工具

Casper FFG 是一种元共识协议。它是一个可以运行在底层共识协议之上的覆盖层,以便为其添加最终性。

在以太坊的 PoS 共识中,底层协议是 LMD-GHOST,它不提供最终性。最终性确保一旦区块在链中得到确认,它们就不能被撤销:它们将永远是链的一部分。因此,本质上,Casper FFG 的功能就像一个最终性小工具,我们使用它为 LMD-GHOST 添加最终性。

Casper FFG 利用了这样一个事实,即在 PoS 协议中,我们知道我们的参与者是谁:管理质押以太币的验证者。这意味着我们可以使用投票计数来判断我们何时已经看到了诚实验证者的大多数投票,或者更准确地说,是来自管理大部分质押的验证者的投票。在接下来的一切中,每个验证者的投票都由他们管理的质押价值加权,但为简单起见,我们不会每次都明确说明这一点。

Casper FFG 像所有经典的拜占廷容错(BFT)协议一样,可以确保最终性,只要少于三分之一的验证者存在故障或对抗。一旦大多数诚实验证者宣布一个区块为最终区块,所有诚实验证者都会同意,使该区块不可逆转。通过要求诚实验证者占总数的超过三分之二,系统确保共识准确地代表了诚实多数的观点。值得注意的是,Casper FFG 通过提供经济最终性(您将在 “负责任的安全和合理的生活性” 中找到更多详细信息)来区分于传统的 BFT 协议,即使超过三分之一的验证者受到损害。

Epochs 和检查点

Casper FFG 通过要求一个 epoch 内超过三分之二的验证者进行投票来确保共识,将投票分散在 32 个 slot 中,以有效地管理大型验证者集合,如图 15-17 所示。一个 epoch 分为 32 个 slot,每个 slot 通常包含一个区块。一个 epoch 的第一个 slot 是它的 检查点

Epochs 和检查点

图 15-17. Epochs 和检查点

验证者每个 epoch 在一个检查点(第一个 slot)上投票一次,以保持统一的投票焦点。此过程包括 Casper FFG 和 LMD-GHOST 投票以提高效率,旨在最终确定检查点,在 Casper FFG 的上下文中,而不是整个 epochs,明确了最终性扩展到检查点及其前面的内容。

正当性和最终确定

Casper FFG 像传统的 BFT 协议一样,分两个阶段确保网络上的协议。最初,验证者广播并收集有关提议的检查点的视图。如果绝大多数同意,则该检查点被 证明是正当的,表明暂时达成协议。在下一轮中,如果验证者确认对经过证明是正当的检查点的广泛支持,则它将实现 最终确定,这意味着它已获得一致同意并且不可逆转。此过程强调了确保网络一致性和安全性的协作努力,旨在在特定时间范围内证明和最终确定检查点,并提高共识机制的可靠性。

来源和目标,链接和冲突

在 Casper FFG 中,投票包括来源和目标检查点,代表验证者在不同时间点对区块链状态的承诺。这些投票以链接对的形式进行,表示验证者当前和提议的共识点。来源投票反映了验证者对检查点广泛支持的确认,而目标投票表示对新检查点的有条件承诺,取决于其他人的类似支持。这种双重投票系统有助于朝着最终确定区块的有组织的进展,从而确保网络完整性和连续性。

超多数链接

在 Casper FFG 中,来源和目标检查点之间的 超多数链接s→t,当超过三分之二的验证者(按质押权重)认可同一链接,并且他们的投票包含在区块链中时,就会建立。该机制通过通过广泛的验证者协议验证检查点序列来确保共识和安全性。

正当理由

在 Casper FFG 中,当节点观察到大多数验证者同意从一个检查点过渡到另一个检查点时,它会证明旧检查点是正当的。这表明该节点已经看到了来自验证者集合的很大一部分的共识证据,如图 15-18 所示,并且承诺除非显示出对替代路径的绝大多数共识,否则不会恢复到以前的状态。

正当化过程

图 15-18. 正当化过程[^1]

[^1]:该节点已经看到了一个超多数链接 CN → CN + 1,因此将 CN + 1 标记为正当的。由于 CN + 1 是检查点树中 CN 的直接子项,因此它也将 CN 标记为最终确定的。最终确定的检查点是交叉阴影并标有 F。

最终确定

当节点观察到从一个经过证明是正当的检查点到其直接子项的共识(超多数链接)时,它将最终确定父检查点,如图 15-19 所示。这表明网络范围内的承诺不会从该点恢复,并得到绝大多数验证者支持的支持。最终确定通过使区块链历史记录不可变地超出该检查点来确保网络稳定性和安全性,从而防止在没有验证者的重大后果的情况下进行逆转。

最终确定过程

图 15-19. 最终确定过程

削减

Casper FFG 实施了一种削减机制,以惩罚违反协议规则的验证者,目的是确保网络共识。这种强制执行阻止了可能破坏区块链完整性的操作,例如最终确定相互冲突的检查点。由于这些漏洞的技术挑战,检测到这些漏洞(尤其是复杂的场景,例如环绕投票 (请参阅 "分叉选择规则"))可能依赖于专门的外部服务。削减的后果与不端行为的严重程度和整体网络健康状况成正比,惩罚会根据特定时间范围内集体行为进行缩放,从而确保验证者行为的公平性和责任制。

分叉选择规则

Casper FFG 修改了传统 LMD-GHOST 分叉选择规则,规定节点优先选择具有最高证明的检查点的链;然后,此检查点有效地成为 LMD-GHOST 协议的起始区块。这种调整是从 LMD-GHOST 协议的方法演变而来的,它确保网络通过承诺由超多数验证者商定的检查点来实现最终确定。它有效地保证了一旦检查点得到证明,网络就无法恢复到该检查点之外,从而增强了区块链的安全性和稳定性。此规则还旨在保持网络的生活力,并与 Casper 的基本目标保持一致。

Casper 戒律

在 Casper FFG 中,检查点对于确保网络共识和安全性至关重要。它们标有随区块链进程增加的 epoch 编号。验证者必须遵守严格的投票规则:他们不能对同一检查点的不同结果进行投票,因此不能进行重复投票,如图 15-20 所示。如果不实施此投票规则,重组的可能性会大大增加,从而导致链高度不稳定。

禁止重复投票

图 15-20. 禁止重复投票

验证者还必须避免创建可以解释为与先前承诺相矛盾的投票(禁止环绕投票)。违反这些原则会导致削减,这是一种旨在维护共识机制的完整性和责任制的惩罚,如图 15-21 所示。

禁止环绕投票

图 15-21. 禁止环绕投票

负责任的安全和合理的生活

Casper FFG 共识协议做出了两个保证,这两个保证类似于但不等同于经典共识中的安全性和生活力的概念:负责任的安全合理的生活

负责任的安全和经济最终性

Casper FFG 对负责任的安全的证明表明,除非超过三分之一的验证者违反协议规则,否则无法最终确定冲突的检查点。该系统确保使用少于三分之一的对抗验证者最终确定的检查点保持不可逆转,从而对不诚实行为强制执行网络安全性和经济处罚。 经济最终性在 Casper FFG 中引入了潜在攻击者的成本,不仅通过协议规则,还通过经济上的不鼓励来加强安全性。试图通过最终确定冲突的检查点来破坏网络的验证者将面临严厉的惩罚,损失其大部分权益。这种方法通过增加一层经济后果,与传统的共识机制形成对比,确保恶意行为者最终确定一个区块的成本很高,从而增强区块链的完整性和抵御攻击的能力。

合理的活跃性

Casper FFG 确保网络保持活跃,并且始终能够在没有任何诚实验证者受到惩罚的情况下达成共识,体现了合理活跃性的概念。这意味着,如果大多数验证者是诚实的,则协议可以继续验证和最终确定新的检查点,从而避免因担心 slashing 而导致进度停止的任何死锁情况。这一原则确保了网络的弹性和持续运行,突显了 Casper 在具有挑战性的条件下保持共识的适应性。

一个实际的例子:检查点的生命周期

让我们一起踏上以太坊 Casper FFG 机制中检查点的生命周期之旅。

以太坊验证者的社区可能非常庞大,可能涉及数十万个。一次性处理所有这些投票是不切实际的。那么我们该如何管理呢?

投票分散在我们称之为 epoch 的时间内,该 epoch 分为 32 个 slots,每个持续 12 秒。这样,每个验证者每个 epoch 投票一次,每个 slot 中大约有 1/32 的验证者集合进行投票。图 15-22 显示了这样一个验证者池。

验证者池

图 15-22. 验证者池

在本例中,验证者的数量当然比实际的以太坊网络要少得多,但我们确实有 64 个节点,它们被分成 32 组。每组将在 epoch 中为一个 slot 投票,如图 15-23 所示。

验证者分成组

图 15-23. 验证者分成组

现在,他们在为什么投票?他们投票给一个检查点:具体来说,是一个 epoch 的第一个 slot[^2]。这个检查点充当了在不同时间投票的验证者的共同目标。

[^2]: 检查点始终是一个 epoch 的第一个 slot,但如果检查点自己的区块丢失,它的区块哈希可能来自较早的区块。

注意

这里有必要澄清一点:虽然我们经常谈论最终确定 epoch,但从技术角度来说,我们实际上是在最终确定检查点,也就是这些第一个 slot。一旦一个检查点被最终确定,包括该 slot 在内的所有内容都将被设定好,安全且不可更改。

一个 epoch 的表示——在本例中是 epoch N——如图 15-24 所示。检查点 N 是 slot 32N;一旦该检查点被最终确定,slot 32N-1 以及之前的所有其他 slot 都将被视为已最终确定。

Epoch 表示

图 15-24. Epoch 表示

实现这种安全性的过程是严格的,类似于传统的 BFT 共识机制。在接下来的章节中,我们将描述它的工作原理。

第一轮:论证

验证者们各自将自己对当前 epoch 检查点的看法广播到网络。然后,他们监听以了解是否网络中的绝大多数人都同意他们的观点。如果同意,那么这个检查点就被“论证”了。在这个阶段,验证者们相信,网络中的大多数人都支持这个检查点被最终确定,尽管他们还不能完全确定所有人都同意。

关键问题是,验证者们还不能确定网络中的恶意行为者是否没有向他们提供关于网络状态的虚假信息——对他们说一套,对其他人说另一套。这是一个经常被忽视的非常重要的点。如果所有参与者总是诚实的,那么论证就意味着最终确定,并且可以避免整个两轮过程。

当一个验证者论证一个检查点时,他们已经收到了来自网络中三分之二的验证者对该特定检查点的批准,如图 15-25 所示,但是这第一轮批准仅对验证者本身有效。特别是在对抗条件下,可能没有足够的验证者达成共识。传统的 PBFT 风格的共识机制——比如 Algorand、Dfinity 和 Cosmos 中使用的那些——会在这个阶段停止并失去活跃性。另一方面,以太坊会继续前进。如果它不能论证一个检查点,没问题——它只需继续前进并尝试论证下一个。这是可行的,因为以太坊依赖 LMD-GHOST 来保持活跃性,而 Casper FFG 只是一个覆盖层——一个“锦上添花”。因此,如果最终性暂时停滞,那也不是一个关键问题。

论证轮

图 15-25. 论证轮

第二轮:最终确定

验证者宣布他们已经从绝大多数人那里听说他们也支持这个检查点。他们再次检查以查看网络的其余部分是否确认这个绝大多数确实存在。如果是这样,验证者就可以“最终确定”检查点,如图 15-26 所示。最终确定是一个强大的步骤——这意味着没有一个诚实的验证者会恢复这个检查点。他们可能还没有在他们的本地视图中将其标记为已最终确定,但至少他们已经将其标记为已论证,并且如果不采取可惩罚的行动,就无法撤销它。

最终确定轮

图 15-26. 最终确定轮

在实践中,每一轮理想情况下跨越一个 epoch,这意味着需要一个 epoch 来论证一个检查点,另一个 epoch 来最终确定它。总共大约需要 12.8 分钟。然而,由于 Casper FFG 的流水线设计,我们可以每 6.4 分钟最终确定一个检查点,即每个 epoch 一次。

注意

值得注意的是,从外部视角来看,我们可能会看到一个检查点很可能在 12.8 分钟结束之前被最终确定的迹象,因为假设没有重大的链重组,投票会随着 epoch 的进行而逐渐累积。然而,论证和最终确定的官方协议内操作仅在 epoch 结束时发生。

在检查点的论证和最终确定过程中,有很多事情可能会出错。让我们分析两个重要的案例,以及这个友好的最终性工具如何处理它们。

冲突的论证

思考一下为什么我们需要检查点的“已论证”和“已最终确定”状态,这很有启发性。为什么一旦有三分之二的绝大多数投票赞成,就立即最终确定一个检查点是不够的?

这里的区别在于:论证是关于本地协议,而最终性是关于全局共识。

论证一个检查点意味着,作为一名验证者,我收到了来自三分之二的验证者的确认,他们批准该检查点。然而,这种批准仅代表我的本地视角。其他验证者可能掌握不同的信息;我无法确定。尽管存在这种不确定性,但作为一名诚实的验证者,我承诺永远不会撤销我已经根据我的本地数据论证过的任何检查点。

另一方面,最终确定一个检查点,更进一步。它发生在我收到来自三分之二的验证者的保证,他们也从他们三分之二的对等方那里听到了确认检查点有效性的消息。这意味着网络的绝大多数人——不仅仅是我的本地视图——承认并承诺这个检查点。正是这种广泛的共识保护了检查点免受全局撤销。因此,一个最终确定的检查点不仅在本地被认可;它在全球范围内都是安全的。

让我们探索一个极端的场景,以更好地理解共识过程。假设我们有四个验证者,A、B、C 和 D,如图 15-27 所示。所有这些都是诚实的,但他们运营的网络可能会遇到无限期的延迟。为了这个示例的目的,假设每个块高度都有一个检查点。

四个验证者场景

图 15-27. 四个验证者场景

场景中的每个验证者都有区块 0,因此可以论证检查点 0;因此 0,source,对所有四个验证者来说都是在本地得到论证的,而 1 是 target(参见“Sources 和 targets, links 和 conflicts”)。

现在让我们假设 A 在网络连接中严重延迟,并且它也被选择来提议一个区块。A 在 epoch 2 中提议一个区块。这个区块包含所有四个投票来论证检查点 1,但是由于其网络连接严重延迟,其他验证者永远看不到它。

A 在源头 0 和目标 1 之间有一个绝大多数链接(参见“Supermajority links”),因此它将最终确定检查点 0 并论证检查点 1。同时,B、C 和 D 在当前 epoch 中没有看到任何投票,因此他们仍然只有论证了检查点 0。他们也将在本 epoch 中投票支持一个空的检查点,即检查点 X,如图 15-28 所示。

网络延迟场景步骤 1

图 15-28. 网络延迟场景步骤 1

在 epoch 3 中,B、C 和 D 中的一个验证者被选择来提议一个区块。

这个区块包含三个投票,源头是检查点 0,目标是检查点 X;因此,在 0 和 X 之间有一个绝大多数链接,允许验证者 B、C 和 D 将检查点 0 视为已最终确定,并将检查点 X 视为已论证,如图 15-29 所示。另一方面,A 认为这个区块是无效的,因为在其本地视图中,1 已被论证,无法撤销。验证者 A 的链继续的唯一解决方案是删除其内存并与网络的其余部分重新同步。

网络延迟场景步骤 2

图 15-29. 网络延迟场景步骤 2

注意

重要的是要记住,在本例中,验证者 B、C 和 D 从未看到 A 提议的区块。由于他们没有观察到区块 2——本应该论证检查点 1 的区块——他们无法同意区块 1,因此无法论证检查点 1。因此,他们投票支持一个空的检查点。

这个例子表明,即使是简单的网络延迟也可能导致节点对论证和最终确定有不同的看法。然而,仅凭这一点并不能证明需要两个独立的阶段:论证,然后是最终确定。这两个阶段背后的原因是非常简单的:如果我们没有论证步骤,A 将最终确定检查点 1,这将对网络的其余部分来说是无效的,如图 15-30 所示。

没有论证步骤

图 15-30. 没有论证步骤

在前面的示例中,A 必须删除其内存并与网络的其余部分重新同步。这是因为正如我们之前所说,论证类似于一个本地步骤,可以被撤销。但是,如果 A 直接最终确定检查点 1,这是不可能的。如果没有这两个阶段,A 将有一个已最终确定的区块被撤销,并且 B、C 和 D 将能够在没有被 slashing 的情况下孤立区块 1。保证安全的唯一方法是双向提交:论证和最终确定。

Gasper:一个真实的例子

到目前为止,我们已经看到了 Casper FFG 和 LMD-GHOST 如何独立工作。现在让我们看看它们是如何组合成 Gasper 并在以太坊 PoS 共识协议中使用的。

充分理解 Gasper 工作原理的最好方法是遵循一个真实的区块链示例,该区块链使用它来对块的历史达成共识。我们不会使用以太坊主网作为我们的示例。相反,我们将创建一个由三个验证者组成的模拟网络,以便更好地描述在共识协议的每个阶段发生的事情,正如您在图 15-31 中看到的那样。

Gasper 模拟网络

图 15-31. Gasper 模拟网络

三个验证者在 stake 中拥有相同数量的 ETH,因此他们的投票能力——也就是说,他们对他们投票的每个区块的分数的贡献——是相同的。此外,每个验证者都会发布一个证明,在每个区块中,而不是像在以太坊主网中那样在一个 epoch 中发布一次。

我们的目标是从一个区块的发布到首先被论证,然后被最终确定,来观察它的生命。

在我们的简化网络中,每个 epoch 由三个 slots 组成,如图 15-32 所示。

简化的 epoch 结构

图 15-32. 简化的 epoch 结构

让我们从 epoch 编号 1 开始我们的示例。这不是真正的第一个 epoch;我们只是为了简单起见而称其为“epoch 1”。验证者 A 是被选择来提议第一个区块的人。我们可以将他们要提议的区块称为区块 1,如图 15-33 所示。

区块 1 提议

图 15-33. 区块 1 提议

验证者 A 发布区块 1,并且立即,该区块开始在网络中传播。发布后不久,验证者 B 和 C 接收到它并将其保存到他们对网络的视图中。

然后,所有验证者都通过投票他们认为的链的最后一个 head block 来进行证明。为此,他们必须在本地视图上运行 LMD-GHOST。结果是区块 1。这些证明将在发布后与所有验证者共享。

现在,验证者 B 被选择来提议下一个 slot 中的区块——slot 2——正如您将在图 15-34 中看到的那样。为此,验证者仍然必须在他们对网络的本地视图上运行 LMD-GHOST,以获得要构建在其之上的最后一个 head block。

区块 2 提议

图 15-34. 区块 2 提议

这是验证者 B 对网络的看法:

  • 验证者 A 证明:head block:区块 1
  • 验证者 B 证明:head block:区块 1
  • 验证者 C 证明:head block:区块 1

因此,验证者 B 的 LMD-GHOST 的结果是区块 1。他们现在可以在区块 1 之上发布区块 2。在区块 2 内部,验证者 B 还保存了他们看到的所有未包含在之前区块中的证明。因此,他们保存了包含区块 1 投票的三个证明。

区块 2 在网络中传播,并且在其发布后不久,验证者 A 和 C 接收到它。请记住,虽然 LMD-GHOST 使用通过 P2P 共享和包含在区块中的投票,但 Casper FFG 仅考虑包含在区块中的投票。因此,虽然将 LMD-GHOST 投票包含在区块中不会影响 LMD-GHOST 的结果(如果验证者已经通过 P2P 网络共享它们),但对于 Casper FFG 来说,这是至关重要的,因为这是验证者了解它们的唯一方式。

同样,所有验证者都通过投票他们认为的链的最后一个 head block 来进行证明。由于他们都在本地视图中有区块 2,因此他们都投票支持它成为链的 head。然后,他们发布这些证明,以便所有验证者都可以看到它们。

现在,验证者 C 被选择来在 slot 3 提议下一个区块。他们在本地视图之上运行 LMD-GHOST 以获取 head block。这是验证者 C 对网络的看法:

  • 验证者 A 证明:head block:区块 2
  • 验证者 B 证明:head block:区块 2
  • 验证者 C 证明:head block:区块 2

结果是区块 2,因此验证者 C 在其之上发布区块 3,如图 15-35 所示。

区块 3 提议

图 15-35. 区块 3 提议

在区块 3 内部,验证者 C 保存了三个投票支持区块 2 的证明,因为它们未包含在先前的区块中。

区块 3 在网络中传播,并且在其发布后不久,验证者 A 和 B 接收到它。然后,验证者对它进行证明投票。

现在,我们回到验证者 A。他们必须提出下一个区块——slot 4——这也是新 epoch 的第一个区块——epoch 2——正如你将在图 15-36 中看到的那样。

区块 4 提议 - 新的 epoch

图 15-36. 区块 4 提议 - 新的 epoch

验证者 A 在他们的本地视图上运行 LMD-GHOST 以获得链的 head。这是验证者 A 对网络的看法:

  • 验证者 A 证明:head block:区块 3
  • 验证者 B 证明:head block:区块 3
  • 验证者 C 证明:head block:区块 3

结果是区块 3,因此验证者 A 在其之上发布区块 4。

在区块 4 内部,验证者 A 保存了三个投票支持区块 3 的证明,因为它们未包含在先前的区块中。

区块 4 在网络中传播,并且,在其发布后不久,验证者 B 和 C 接收到它。验证者必须对它进行新的证明投票,以使其成为链的 head。但是这次,有一些变化。

我们在一个新的 epoch 中,因此验证者必须更新投票的 Casper FFG 部分。事实上,我们之前忽略了证明不仅包括对链的最后一个 head block 的投票——共识协议的 LMD-GHOST 部分——还包括对 Casper-FFG 检查点的投票。特别是,每个证明都包括一个 source 和一个 target 投票。Source 投票是验证者知道的最后一个经过论证的检查点,而 target 投票代表了验证者认为应该成为下一个要论证的区块。

因此,验证者 A、B 和 C 进行的证明如下:

证明

  • Head block: 区块 4
  • Source block: 区块 1
  • Target block: 区块 4

Target block 很容易选择,因为它只是 epoch 的第一个区块(在一些边缘情况下,target block 可能不是 epoch 的第一个区块,但是为了简单起见,我们忽略它们)。Source block 是通过查看验证者的证明并查看是否有超过三分之二验证者投票将其作为 target block 的区块来计算的。我们没有在先前的证明中包含 source 和 target block,但是假设它们都将区块 1 作为 target block。因此,目前,我们已经证明了区块 1,因为从区块 1 到区块 4 有一个绝大多数链接。参见图 15-37。

区块 1 经过论证

图 15-37. 区块 1 经过论证

然后,这些证明将发布并与所有验证者共享,并将包含在接下来的 slotes 中(通常在紧接着的下一 slot 中)。我们可以跳过区块 5 和 6,直接进入区块 7,下一个 epoch 的第一个区块:epoch 3,如图 15-38 所示。

区块 7 提议 - epoch 3

图 15-38. 区块 7 提议 - epoch 3

同样,验证者 A 被选择来提议该区块。他们在他们的本地视图上运行 LMD-GHOST。这是验证者 A 对网络的看法:

  • 验证者 A 证明:head block:区块 6,source block:1,target block:4
  • 验证者 B 证明:head block:区块 6,source block:1,target block:4
  • 验证者 C 证明:head block:区块 6,source block:1,target block:4

结果是区块 6,因此他们在其之上发布区块 7。

区块 7 在网络中传播,并且,在其发布后不久,验证者 B 和 C 接收到它。验证者必须对它进行新的证明投票,以使其成为链的 head。这里又发生了变化。

我们处于下一个 epoch 中——epoch 3——因此证明的 Casper-FFG 部分再次发生变化。事实上,验证者 A、B 和 C 进行的证明如下所示:

证明

  • Head block:区块 7
  • Source block:区块 4
  • Target block:区块 7

正如您所看到的,target block 现在是区块 7,而 source block 是区块 4。这是真的,因为验证者 A、B 和 C 在先前的证明中都投票选择了等于区块 4 的 target block。我们现在已经证明了区块 4,因为我们有一个从区块 4 到区块 7 的新的绝大多数链接,如图 15-39 所示。

区块 4 经过论证,区块 1 最终确定

图 15-39. 区块 4 经过论证,区块 1 最终确定

我们也已经最终确定了区块 1,因为它是一个经过论证的检查点,其直接子项——区块 4——也经过了论证。当验证者认为一个区块已经最终确定时,这意味着验证者已经看到了来自超过三分之二验证者的确认,他们都看到了该区块已经被论证。事实上,如果我们以验证者 A 为例——这也适用于验证者 B 和 C——他们已经看到了 B 和 C 的证明,他们在其中投票支持区块 1 作为 source block。投票支持区块 1 作为 source block 意味着 B 和 C 先前已经看到了三分之二的大多数投票支持区块 1 作为 target block。因此,我们可以肯定的是,为了恢复区块 1,必须 slashing 至少三分之一的验证者,因为他们进行了双重投票。

争议与竞争

此时,您可能想知道为什么我们需要这么多不同的共识算法。哪一个效果更好?这个问题的答案是过去十年中分布式系统中研究最激动人心的领域的中心。这一切都归结为您认为什么是“更好”——这在计算机科学的背景下是关于假设、目标和不可避免的权衡。

可能没有任何一种算法可以在去中心化共识问题的所有维度上进行优化。当有人建议一种共识算法“优于”其他算法时,您应该开始提出澄清问题:在什么方面更好:不可变性?最终性?去中心化?成本?没有明确的答案,至少目前还没有。此外,共识算法的设计是一个价值数十亿美元的行业的中心,并引发了巨大的争议和激烈的争论。最后,可能没有“正确”的答案,就像不同的应用程序可能有不同的答案一样。

整个区块链行业是一个巨大的实验,在其中这些问题将在对抗性条件下进行测试,并涉及巨大的货币价值。最终,历史将回答这场争议。

共识协议中的争议可能有很多,协调网络来解决这些问题是具有挑战性的。协调激励措施至关重要,但并非总是可能。我们将研究以太坊共识算法的两个当前问题。

时间游戏

在以太坊的协议中,时间被结构化为 12 秒的单元,称为 slots。每个 slot 都分配一个验证者在开始时(t = 0)提出区块的角色。然后,一个证明人委员会的任务是验证该区块,目标是在 slot 的四秒内(t = 4)完成验证,这被认为是证明的截止日期。

时间游戏 是一种策略,验证者尽可能长时间地等待,然后提议区块,以最大化他们的 MEV 奖励,如图 15-40 所示。这种做法涉及微妙的平衡,要求验证者推迟他们的提议以捕获更多价值,同时确保他们的区块得到足够多的证明委员会的支持,以留在规范链上。

时间游戏策略

图 15-40. 时间游戏策略

以太坊中的时间游戏创造了一个竞争格局,其中一个验证者的 MEV 收益可能导致其他验证者的劣势。这种竞争可能会通过增加错过的 slots 数量和潜在的区块重组来破坏共识。此外,它还促使证明人推迟验证,从而增加了过程的复杂性。

“共识原则”指出了活跃性对于以太坊共识过程的重要性。但是,时间游戏通过损害网络的可靠性来威胁此关键功能。

什么是时间游戏?这就像等待完美的时机来采取行动,旨在从中获得最大的好处。这就是一些保持网络正常运行的人试图做的事情。他们正在等待正确的时机采取行动以获得最大的回报。但是这种等待游戏可能是有风险的。如果他们的互联网速度很慢或者他们没有太多经验,他们可能会错过自己做贡献的机会。而错过太多的机会可能会使网络变得不太可靠。

时间游戏风险可视化

图 15-41. 时间游戏风险可视化

目前,这并不是一个大问题。大多数作为验证者工作的条目并没有真正参与这些时间游戏,或者根本没有玩它们,如图 15-41 所示。

注意

自 2024 年我们撰写本章以来,情况发生了一些变化。目前,在 Dencun 硬分叉 中添加了一个名为“提议者提升”的解决方案,该解决方案确实会惩罚迟到的区块提议者。提议者提升增加了区块提议者在提议区块的 slot 中的证明的权重。

超多数的中心化

以太坊中超多数客户端风险的概念是关于平衡网络的健康和安全。以太坊决定使用多个客户端来防止任何单一故障点。这是因为所有软件(包括这些客户端)都可能存在错误。真正的麻烦始于出现共识错误时,这可能会导致严重的后果,例如凭空创建无限的以太币。如果只有一个客户端运行整个游戏并且它受到这种错误的攻击,修复它将是一场噩梦。网络可能会在错误处于活动状态的情况下继续运行足够长的时间,以使攻击者造成不可逆转的破坏。

让我们分析一个快速的示例,说明如果多数客户端存在错误会发生什么。请注意,图 15-42 中的每个区块都是一个检查点,而不是区块链中的一个区块。

多数客户端错误场景

图 15-42. 多数客户端错误场景

功能正常的客户端会忽略包含无效区块(标记为“B”)的 epoch。指向区块 B 的箭头用于证明无效的 epoch,而来自它的箭头将其最终确定。

假设该错误已解决,并且最终确定无效 epoch 的验证者希望切换回正确的链 B,则需要采取的初步操作是证明 epoch X,如图 15-43 所示。

从错误中恢复需要证明

图 15-43. 从错误中恢复需要证明

要参与 epoch X 的证明(需要虚线箭头所示的超多数链接),验证者必须绕过来自区块 B 的箭头,该箭头表示无效 epoch 的最终确定。为两个链接投票可能会导致这些验证者受到惩罚。

多客户端方法提供了一个安全网。如果某个客户端中出现一个错误,且该客户端的使用量不到网络的一半,则运行其他客户端的网络的其余部分会简单地忽略该有缺陷的区块。这可以使网络保持正常运行,从而最大程度地减少中断。但是,如果多数客户端(尤其是被超过三分之二验证者使用的客户端)引入了一个错误,则可能会错误地最终确定链,从而导致潜在的分裂。

以太坊鼓励多元化客户端,因为如果每个人都使用相同的客户端并且它失败了,那么整个网络都将面临风险。运行与主流背道而驰的客户端的惩罚旨在阻止我们将所有鸡蛋放在一个篮子里。这样,如果一个客户端确实存在错误,则损坏将被控制,从而影响更少的用户。如果少数客户端引起麻烦,则问题不大,因为多数可以纠正路径并继续最终确定链。

我们在不同的客户端之间分散选择越多,以太坊就越安全。这不仅是避免技术故障的问题,还在于保护以太坊的未来免受任何单一故障点的影响。这种多样性是我们应对网络范围危机的最佳防御措施,可确保以太坊无论发生什么情况都保持强大的弹性和韧性。

当我们第一次撰写本章时,Geth 的使用百分比为 63%,正如我们先前解释的那样,这是一个问题。目前的情况更加健康,但将来仍然需要改善;截至目前,41% 的执行客户端正在使用 Geth,而 38% 正在使用 Nethermind,如图 15-44 所示。

当前执行客户端分布

图 15-44. 当前执行客户端分布

该问题不仅影响执行客户端,还影响共识客户端,尽管共识方面的问题已得到迅速解决,并且目前的情况相对健康和稳定,如图 15-45 所示。

当前共识客户端分布

图 15-45. 当前共识客户端分布

结论

共识算法是以太坊中最复杂(也最精妙)的东西之一。它代表了一个永无止境的创新和改进之旅,不断有提案来增强其功能和效率。诸如单 slot 最终确定以及增加验证者最大有效余额的功能说明了不断努力完善和优化系统。

理解共识的核心原则为欣赏这些进步及其对以太坊网络健壮性和可扩展性的影响奠定了坚实的基础。随着以太坊的发展,它的共识机制也将随之发展,从而推动了这种开创性的区块链技术的能力。

为了进一步阅读,我们推荐:

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
ethbook
ethbook
江湖只有他的大名,没有他的介绍。