搬运 | 升级以太坊

以下内容来自于这个网站,作者是 Ben Edgington,以太坊社区的知名开发者,以下是他在个人网站上的自我介绍

自 2024 年 2 月以来,我一直在 OP 实验室工作,扩展世界计算机。我是 Consensys Teku 以太坊共识客户端的创始人和前产品负责人。我于 2017 年 10 月加入 Consensys,头两年建立了出色的 PegaSys 研发团队,之后转到产品方面,降生 Teku。我正在撰写一本关于以太坊权益证明协议的权威技术书籍。这本书叫《升级以太坊》,有时也叫 “Eth2 Book”。据统计,我自己写了大约 135000 字,PDF 版本有 367 页。在以太坊合并前的四年中,我写了 100 期双周刊《Eth2 有什么新消息?》。我最好的推特(译注:内容为以太坊合并成功时开发者们的庆祝场景),我最配不上的推特(译注:一个 15 秒的视频,推文内容是“为 Ben 工作是你能为自己的职业生涯所做的最好的事情之一”)。


前言

升级以太坊

欢迎阅读我关于以太坊升级的书籍:以太坊的权益证明及其它。

工作进行中!

我正从后往前撰写这本书。自下而上。从细节入手,逐步走向大图景。

目前,几近完成的是第三部分:规范注解。它们是机器内脏。就像计算机的内部结构,所有组件裸露在外,电线散落:一切都一览无余。但有了这些核心部分,我们就可以围绕它构建其他部分,将内部的杂乱无章干净地隐藏起来。

我正在撰写第二部分:技术概览,这部分旨在为规范注解裹上更易于理解的表层。同样,我自后往前撰写这部分,从协议的构建模块激励机制开始,逐步推进到更高层次的叙述,解释这一切如何被整合在一起。当前的重点是共识这一章。

注意:在1.0版本发布之前,任何内容都可能发生变化。我会尽量避免更改规范注解部分的URL和锚点,但不做保证。其他内容,包括一整个章节和一整个部分,都应被看作是不稳定的。

将要呈现给你的

这本书适合那些希望从技术层面理解以太坊2.0——基于权益证明的以太坊——的读者。它做了什么?如何运作?为什么它是现在这样?

这本书是为谁而写呢?为像我这样的人!那些喜欢理解事物运行原理的人。不仅如此,也是为那些还喜欢了解事物 为何 如此的人。这本书并非学术作品;我更关注洞察力而非严谨性。但我会尽量在适当的地方链接到相关的学术论文和正式分析。

虽然我是以太坊的质押者和用户,但我的主要目标读者并非这类人。与质押有关的通用内容可能也会有所帮助(待我完成后),但你可以在EthStaker等优秀社区中获得更实用的支持。

本书的范围主要围绕(我认为的)以太坊2.0协议展开。近年来,以太坊2.0的定义逐渐变得模糊,但在我看来,它大致涵盖以下内容:

  • 所有与权益证明(PoS)和信标链相关的技术,
  • 以太坊通过“合并(Then Merge)”从转向权益证明的过程,
  • 协议内的数据分片机制,以及
  • 一系列潜在的未来升级和改进。

除非与“合并”直接相关,否则我不会涉及以太坊1.0协议的历史内容。如果你想了解以太坊1.0,可以参考《精通以太坊》Mastering Ethereum book这本书,尽管它已有些过时。此外,虽然卷叠(Rollups)和其他被称为二层网络(layer 2)的解决方案已迅速融入以太坊2.0生态系统,但由于它们本质上不在协议内部,因此本书不会涉及这些内容。同样,我也不会讨论DeFi、DAO、NFT或其他基于以太坊技术构建的精彩应用。

尽管已排除许多,但以太坊2.0协议本身仍有大量值得深入探讨的内容。

版本

当前版本是基于已被部署的Capella以太坊2.0共识层。信标链于2020年12月1日随Phase 0上线。随后分别于2021年10月27日升级至Altair,2022年9月6日升级至Bellatrix,以及2023年4月12日升级至Capella

除非另有说明,本书中所有关于共识规范的引用均基于v1.3.0版本(即Gamlum)。

《升级以太坊》的历史版本和当前版本均可在线获取:

我最初编写的Phase 0版本注释规范同样可被获取,不过主要是为了历史参考,而且已被本书涵盖。

为"Eth2"辩护

当我开始这个写作项目时,基于权益证明的以太坊被普遍称为以太坊2.0,简称Eth2,这个称呼从2014年就开始使用了。这反映了以太坊2.0的愿景在许多方面与最初的以太坊1.0实现有所不同。2016年的以太坊2.0紫皮书(Ethereum.org 2.0 Mauve Paper)很好地捕捉到了这个发展方向。虽然我们最终的实现细节与那里描述的有所不同,但所有的要素在当时就已经具备了。Eth2不仅要实现权益证明,还要带来新的密码学、新的点对点网络、新的加密经济学以及可扩展性的新方向等其他内容。这就是我们已经实现的。

2022年,以太坊基金会宣布我们必须通过将以太坊2.0重新品牌化为以太坊来强调连续性而非断裂性。考虑到合并(The Merge)的进展方式,从以太坊用户的角度来看,这确实有一定道理。用户和开发者的使用体验几乎不会因为转向权益证明而改变。

然而,我写作时的身份主要不是作为以太坊的用户或开发者。从一个_协议工程师_的角度来看,合并是一个深刻的断裂时刻。基于权益证明的以太坊与基于工作量证明的以太坊完全不同——这本书的规模和复杂性就是充分的证据。通过以太坊的新架构,我们实现了多年前紫皮书中规划的大部分内容。

这就是为什么我经常继续将基于权益证明的以太坊称为以太坊2.0或Eth21,对此我不会道歉。我相信你们能理解我的意思,这会让事情更清晰而非混淆。

说到这里,另一件我不会道歉的事是使用英式英语的拼写、标点符号和独特的习语表达。这是特色,不是报错。

致谢

首先,要感谢我的雇主Consensys。虽然我大部分写作是在业余时间完成的,但Consensys越来越支持我在工作期间进行这项工作。特别是在2023年第二季度,公司给了我三个月的写作假期,让我能够全职投入到这本书的写作中。他们还允许我为所有内容采用开放许可。这些都很酷,我也非常感激。Consensys是很棒的公司,是生态系统中向善的重要力量,也是一个让人难以置信的工作场所。

我所做的很多都涉及去描述他人的工作,这本书中几乎所有内容都是其他人的劳动成果。我非常看重以太坊社区的开放性和慷慨。对我来说,这是它的定义性特征。本书引用了许多人的贡献,我要感谢她们所有人。能够成为Eth2开发者社区的一员是我人生中最好的经历。

感谢众多GitCoin资助者为最初的规范注解和我定期发布的“Eth2新动态(What’s New in Eth2)”通讯提供的支持。也要感谢慷慨的加密朋友们(无论是匿名还是实名)多年来的馈赠。在我与规范的细节搏斗时,你们的支持给了我莫大的鼓励。我真的太爱这个社区了。

向EthStaker社区致敬:你们太棒了!

最后,说回Consensys:每天能与如此优秀、有才华、慷慨和博学的人一起工作是一种享受。Protocols组(PegaSys)在过去五年多的时间里一直是我的家。在这里,我参与建立了出色的Protocols研发团队,后来还发起了最终成为Teku的项目。感谢所有的支持和鼓励。我很享受与你们这群优秀的人一起工作。

[1] 这么做还因为我是个顽固的保守派,不喜欢被中心化权威告知该做什么、该说什么。以太坊基金会的声称"从2021年末开始,核心开发者停止使用这个术语"简直令人发笑。

2.3 共识

这是一篇与对以太坊 2.0 共识协议的攻击相关的论文的开篇句:

以太坊的权益证明(PoS)共识协议是通过在分叉选择规则 LMD GHOST 之上应用最终确定性小工具 Casper FFG 来构建的,LMD GHOST 是贪婪的、最重的可观察子树(Greedy Heaviest-Observed Sub-Tree, GHOST)规则的一种变体,它只考虑每个参与者的最近一次投票(最新消息驱动,Latest Message Driven, LMD)。

如果以上内容对你来说完全没问题,那么你可以跳过这一整章。否则,往下读吧!

我们的目标是理解这句话的所有部分。这里有很多东西要拆解,但我们会慢慢来。我们将从一些初步的内容开始,涵盖一些不限于以太坊的共识基础。

在对整个共识协议如何组合在一起的高层次概述之后,我们将深入探讨它的组成部分,首先是 LMD GHOST,然后是 Casper FFG。在 Gasper 部分,我们将看到这两者是如何结合在一起的。

由于 LMD GHOST 和 Casper FFG 协议之间的互操作方式导致很多微妙之处和边缘情况,我专门在这一章的结尾部分讨论了这些问题。

2.3.1 基础知识

  • 共识是一种通过不可靠的组件构建可靠的分布式系统的方法。
  • 基于区块链的分布式系统旨在就单一的交易历史达成一致。
  • 工作量证明和权益证明本身不是共识协议,而是使共识协议成为可能。
  • 许多区块链共识协议是“可分叉”的。
  • 可分叉的链使用分叉选择规则,有时也会发生重组。
  • 在“安全”的协议中,永不发生坏事。
  • 在“活跃”的协议中,总会发生好事。
  • 现实中不存在始终既保持安全又活跃的协议。

介绍

本节介绍与共识、分叉选择和最终确定性相关的基础知识。其中大部分内容并不特定于以太坊,而是为提供一般的背景理解。

共识协议试图解决的挑战是在不可靠的基础设施之上构建可靠的分布式系统。对共识协议的研究可以追溯到 20 世纪 70 年代甚至更早,但我们在以太坊中所寻求解决的挑战的规模要大得多。

我们在以太坊共识层的目标是使全球数万个独立节点能够完全同步运行。每个节点维护一个包含每个账户状态的账本,而每个账本必须与其他所有账本相匹配。不能有任何差异;节点必须达成一致,迅速地达成一致。这就是我所说的“可靠的分布式系统”。

这些节点通常运行在消费级的硬件上。它们通过互联网这样一个可能有着低带宽、高延迟、丢包、或无限期中断的不可靠的异步网络进行通信。节点运营者有时会错误配置他们的软件,或者不及时更新。而且,更刺激的是,有可能有大量的攻击者为了获得利益而运行恶意节点或者篡改通信。这就是我所说的“不可靠的基础设施”。

以太坊的一个明确的设计目标是,它不仅仅在每个节点稳定运行且通信顺畅时才表现良好。我们已经尽力设计了一个系统,即使其下的世界崩溃了,它也能尽力维持运行。

达成共识

以太坊网络由大量的单个节点组成。每个节点独立行动,节点之间通过不可靠的异步网络,即互联网进行通信。任一单个节点可能是诚实的——始终正确行动;或者以各种方式出错,简单的错误如停机或无法通信,或者是遵循了不同版本的协议、主动试图误导其他节点、发布矛盾的消息、以及任何其他形式的故障。

用户提交交易至节点网络后,共识协议确保所有正确节点就交易历史(即交易处理的顺序及结果)达成一致。例如,如果我拥有 1 个以太币并尝试同时发送给 Alice 和 Bob,我们会期待网络最终确认只有 Alice 或 Bob 其中一方收到这个以太币。若两人都收到或均未收到,则交易失败。

共识协议是就交易的排序达成一致的过程。

实际上,以太坊的共识协议”拧和“了 LMD GHOST 和 Casper FFG 两种协议,这一组合即 Gasper。我们将在后续内容中详细探讨这两种协议。

拜占庭将军

在 1982 年的一篇论文中,Leslie Lamport 相当诙谐地描述了共识系统试图解决的基本问题——构建可靠的分布式系统。

让我们想象拜占庭军队的几个军团分别扎营在敌方城市外,每个军团由自己的将军指挥。将军们只能通过信使去相互通信。观察敌情后,他们需要制定统一的行动计划。

这一表述说的很清楚——没有全局的整体视角,没有上帝模式,无法”一览众山小“并做出决定。我们只是将军中的一个,关于其他将军的唯一信息来源是所收到的消息——它们可能是真实的,也可能是虚假的,或者是基于有限信息的误解,又或者是在传递过程中被延误或篡改。我们的视野非常有限,但必须尽可能全面理解整个系统的状态。

需要时刻记住这一点。当我们绘制区块链和区块树时,往往假设这就是整个系统的某种“状态(the state)”。但这些图只能代表系统中单个参与者的局部视角。我的节点对系统的理解可能与你的不同,哪怕只是暂时的,因为我们都在不可靠的网络中运行。例如,我俩会在不同的时间,或者以不同的顺序看到同样的区块,更有甚者,我们所见的区块也许彼此大相径庭。

Lamport 用下面的话捕捉到系统的缺陷:

然而,一些将军可能是叛徒,试图阻止忠诚的将军达成协议。

这些变节的将军象征着我们所称的“拜占庭行为”或“拜占庭故障”。他们可以以任意方式行事:拖延消息、对消息重新排序、径直撒谎、向不同收件人发送矛盾的消息、完全不作回应、或任何我们能想到的其他行为。

忠诚的将军需要一种方法,以能够可靠地带来如下结果:

A. 所有忠诚的将军决定采取相同的行动计划(如“进攻”或“撤退”),以及

B. 少数叛徒无法使忠诚的将军们采取糟糕的计划。

在这种拜占庭分布式系统中达成共识并非易事,但多年来已有一些相当成功的方法。

第一种主流的解决方案是 1999 年 Liskov 和 Castro 发表的实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)算法。这种算法依赖于相对较小和有限的已知共识参与者(被称为副本,replicas)集合。在下面讨论的语境中,PBFT 总是“安全的”,且不会产生分叉。

中本聪共识——由中本聪为比特币发明于 2008 年——采取了截然不同的方法。它不是将参与者限制在某个已知集合中,而是使用工作量证明来无需许可地选择临时领导者建立共识。与 PBFT 不同,中本聪共识允许分叉,且在形式上是不“安全的”。

自此以后,这些方法和其他的新颖替代方案(如 Avalanche 系列协议)的变体已大量涌现。Avalanche 白皮书的第 7 节“相关工作(Related Work)”对目前在区块链世界中使用的各种共识协议进行过很好的概述。

权益证明和工作量证明

在此,我们不妨指出,工作量证明和权益证明本身都不是共识协议。它们经常被(懒散地)称为共识协议,但都只是共识协议的辅助工具。

大多数情况下,工作量证明和权益证明都是抵抗女巫攻击的机制,它们为参与协议设定一种成本,而这可以防止攻击者以低成本或零成本压垮协议 [1]

尽管如此,通过分叉选择规则,工作量证明和权益证明通常都与它们所支持的共识机制紧密耦合。它们提供了一种有用的方法来为区块链分配权重或分数:在工作量证明中,是已完成的总工作量;在权益证明中,是支持特定区块链的价值量。

除了这些基本因素外,工作量证明和权益证明都支持在其基础上建立多种不同的共识协议,而每种协议都有自己的动态和权衡。同样,Avalanche 白皮书第 7 节“相关工作”中的概述很有启发性。

区块的链

区块链技术背后的基础原语当然是区块。

一个区块由一位领导者(区块提议者,block proposer)所收集的一组交易组成。一个区块的内容(有效载荷,payload)可能因协议而异。

  • 以太坊执行层链上的区块有效载荷是用户交易的列表。
  • 以太坊合并前的权益证明信标链上的区块有效载荷(大部分)是由其他验证者做出的一系列认证。
  • 合并后的信标链区块也包含了执行层的有效载荷(用户交易)。
  • 当 EIP-4844 在以太坊上实现时,区块中将包含对不透明的二进制大对象(Binary Large Object,blob)数据的承诺,以及用户交易的有序列表。

除了特殊的创世区块外,每个区块都建立在父母区块之上,并指向父母区块。这样,我们就得到了一个由区块组成的链条:区块链。无论区块的内容如何,协议的目标都是让网络上的所有节点对区块链的历史达成一致。

当节点将它们的区块添加到链顶端时,链就会增长。这是通过临时选择一个“领导者”来实现的,“领导者”是有权扩展链的单个节点。在工作量证明中,领导者是首先为其区块解决工作量证明难题的矿工。在以太坊的权益证明中,“领导者”是从活跃的质押者池中随机选出的。

领导者(通常被称为区块提议者)向链上添加一个单独的区块,并全权负责选择和排序该区块的内容,但其区块必须符合协议规则,否则网络的其他部分将直接忽略它。

使用区块是一种优化。原则上,我们可以将单个交易逐个添加到链上,但这会增加巨大的共识开销。因此,区块是成批的交易,有时人们会争论这些区块应该有多大。在比特币中,区块大小受区块中数据字节数的限制。在以太坊的执行层链中,区块大小受区块的燃料限制(gas limit,即运行区块中的交易所需的工作量)。信标区块大小由硬编码常数限制。

区块树

我们最初绘制的整洁线性链条大多数情况下可以反映实践中的情况,但不总是如此。有时,可能由于网络延迟、不诚实的区块提议者或客户端问题,任何特定节点都可能会看到类似下面的情况。

在实际的网络中,我们可能会得到更像区块树而不是区块链的东西。在这个例子中,很少有区块建立在“明显”的父母区块上。

为什么区块 C 的提议者接在 A 区块后,而非 B 的后面?

  • 可能是 C 的提议者在提议时还没有接收到区块 B。
  • 可能是 C 的提议者特意要将 B 从自己从自己的链中排除出去,例如为了窃取 B 中的交易,或审查 B 中的某些交易。
  • 可能是由于某些原因,C 的提议者认为 B 区块无效。

对于整个网络来说,至少前两个原因是无法区分的。我们只知道 C 建立在 A 之上,但永远无法确定为什么。

同样,为什么区块 D 的提议者构建在区块 B 之上,而不是 C?上述的原因仍然适用,而且我们还可以添加另一个:

  • D 的提议者可能基于某些理由,认为更广泛的网络最终纳入 B 的可能性大于纳入 C。因此,在 B 之上构建 D 比在 C 之上构建 D 更有机会进入最终的区块链。

区块树中的各种分支被称为“分叉(forks)”。在网络和处理延迟的情况下会自然产生分叉。但也可能是由于客户端故障、客户端恶意行为或协议升级改变了规则,使得过去的区块在新规则下失效。后者通常被称为“硬分叉”。

共识协议中分叉的存在是将活性置于安全性之上的结果,这一点在下文中会讨论:如果你去问那些遵循不同分叉的节点,它们会就系统状态给出不同的答案。存在不产生分叉的共识协议,例如古典共识世界中的 PBFT 和区块链世界的 Tendermint。这些协议总是产生单一的线性链,因此在形式上是“安全的”。不过,在互联网等异步网络上,它们牺牲了活性:与其分叉,而是彻底停止运转。

分叉选择规则

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

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

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

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

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

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

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

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

重组(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)

安全性

非正式地说,如果“永远不会发生坏事” [3],某算法就被认为是安全的。

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

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

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

活性

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

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

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

二者不可兼得!

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

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

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

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

以太坊优先考虑活性

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

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

最终确定性(Finality

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

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

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

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

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

一般原则是你想给予用户“尽可能多的共识”:如果达成共识的节点 > 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)一文中探讨了这些问题。

注释

[1] 在工作量证明中,你提供的”证明”是一个使区块哈希成为特定值的数字。这证明了你确实做了计算工作。在权益证明中,你的证明则是与区块链上的质押存款相关联的私钥。还有其他可用的证明机制,比如时空证明。

[2] 与流行的看法相反,以太坊的工作量证明协议并没有在其分叉选择中使用任何形式的 GHOST。这是个非常顽固的误解,可能是因为以太坊白皮书的缘故。我最终询问了 Vitalik,他向我确认,尽管曾计划在 PoW 中使用 GHOST,但由于担心一些未被指明的攻击,它从未被实施。最重链规则更简单,也经过良好测试。它干的很棒。

[3] 我所引用的关于安全性和活性的有用且直观的定义,最早以简短的形式出现在 Lamport 1977年的论文《多进程程序正确性的证明》(Proving the Correctness of Multiprocess Programs)中,Gilbert 和 Lynch 在 2012 年的论文《关于 CAP 定理的观点》(Perspectives on the CAP Theorem)中也这样定义它们。

[4] CAP 定理与 Fisher、Lynch 和 Paterson 在 1985 年的论文《故障进程中分布式共识的不可能性》(Impossibility of Distributed Consensus with One Faulty Process)中描述的另一个著名结果有关,通常称为 FLP 定理。这证明了,即使在一个可靠的异步网络中(即,消息传递所需时间没有限制),只要有一个故障节点,就可以阻止系统达成共识。也就是说,即使这个未分区的系统也不能同时具备活性和安全性。Gilbert 和 Lynch 在论文第 3.2 节讨论了 FLP 定理。

[5] 值得注意的是,最终确定性从来都不是绝对的。无论任何协议怎样声称,如果绝对多数节点同意(例如通过软件升级)回滚一堆已经最终确定的区块,那么这就会发生。归根结底,就像所有事物一样,最终确定性的概念服从于社会共识。有关进一步讨论,请参见《关于结算的最终确定性》(On Settlement Finality)。 [6] 在撰写本文时,至少有一个交易所要求从以太坊经典网络的存款中获得 40000 个确认。这意味着在包含存款交易的区块之上必须建立四万个区块,交易所才会处理它,这大约需要六天时间。这一要求反映了对 ETC低哈希率工作量证明链易受 51% 攻击的脆弱性的担忧——对于攻击者来说,随意回滚区块相对容易。事实上,面对一个精心设计的 51% 攻击,无论多少确认次数都无法达到真正安全。 [7] 这一点的价值在 2023 年 5 月 12 日信标链在大约一个小时中停止最终确定(stopped finalising)时显现。在此期间,参与共识的验证者从超过99% 下降到大约 40%。然而,普通的以太坊用户和应用程序几乎没有察觉。区块继续被生产(尽管少于正常情况),交易继续被执行。

2.3.2 概述

  • 节点和验证者是共识系统中的行动者。
  • 时隙和时段调节“共识时间”
  • 区块和认证是共识的通货。
  • 以太坊的共识协议结合了两个独立的共识协议。
  • “LMD GHOST”本质上提供活性。
  • “Casper FFG”提供最终确定性。
  • 它们有时被合称为“Gasper”。

引言

上一节描述了区块链共识的大致情况;在本节中,我们将聚焦于以太坊的权益证明共识。我试图遵循这样的路径:通过提供足够的信息以理解事物,而不深入两侧技术细节的杂草。所有这些细节都将在规范注解和其他章节中被深入探讨。我也加了一些链接,以供那些想要去分支探索的人使用。

首先必须介绍的是我们将在整个过程中使用的、以太坊特定的术语。

节点和验证者

以太坊网络的主要参与者是节点(nodes)。节点的角色是验证共识并与其他节点形成通信的主干。

**验证者(validators)**形成共识,而“验证者”(符合以太坊的一贯作风)是一个可怕的误称,它们实际上并不验证任何东西——验证是由节点完成的。每个验证者代表最初质押的 32 个以太币。它有自己的私钥(secret key),以及作为其在协议中身份的相关公钥。验证者附在节点上,一个节点可以托管从零到数百数千个验证者。附到同一个节点的验证者们不会独立行动,它们共享着对世界的同一视图 [1]

使权益证明不同于工作量证明的一个有趣特点是,在权益证明中,我们知道我们的验证者集(validator set)。我们有一份完整的列表,上面有我们预计会在任意时刻活跃的所有公钥。知道验证者集使我们能够实现最终确定性(finality),因为我们可以识别出在何时获得了参与者的多数票 [2]

时隙和时段

在以太坊的权益证明共识中,时间被严格规定,这与工作量证明相比是一个重大变化,工作量证明与时间只有松散的关系——它试图保持平均区块间隔的恒定,但仅此而已。

最重要的两种时间间隔是时隙(slot,12 秒)时段(epoch,32 个时隙或 6.4 分钟)。无论网络上发生什么,时隙和时段都会有规律地持续进行。

区块和认证

每个时隙中都会选择出一个验证者去提议一个区块(block)。区块包含对信标状态(beacon state)的更新,这些更新包括提议者所知道的认证,还有以太坊用户交易的执行载荷(execution payload)。通过广播协议(gossip protocol),提议者与整个网络共享其区块。

时隙可以是空的:区块提议者可能离线,或提出一个无效的区块,或其区块随后被重组出链。在一条运行良好的信标链中,这些事情不应该经常发生,但协议意在出现空时隙时保持稳健。

每个时段,每个验证者都会通过认证(attestation)的形式分享一次它对世界的视图。认证包含对**链头(head of the chain)的投票(LMD GHOST 协议将会使用)和对检查点(checkpoints)**的投票(Casper FFG 协议将会使用)。认证也会被广播至整个网络。与区块一样,认证也可能因各种原因缺失,而协议可以在不同程度上容忍这种情况——粗略地说,随着认证者参与率的降低,共识的质量也会下降 [3]

时隙的功能是将处理所有这些验证的工作量分散化。通过认证,每个验证者都会将自己对世界的视图告知其他验证者,如果一次性完成,可能会导致巨大的网络流量和处理负载。将认证的工作量分散到一个时段中的所有 32 个时段,可以保持低资源使用率。在每个时隙中,仅由1/32的验证者组成的委员会(committees)进行证明。

通过对验证者的奖惩系统,协议激励区块和认证的生产和准确性。我们当下不需要深入探讨这些;会有完整单独的一章来阐述所有这些问题。

罚没

在工作量证明中,生产一个区块的成本很高。这极大地激励了矿工,使他们按照协议的目标正确行事,以确保自己的区块被纳入。

在权益证明中,创建区块和证明几乎是免费的 [4]。我们需要一种方法来防止攻击者利用这一点破坏网络。这就是**罚没(slashing)**的作用。对区块或认证模棱两可的验证者将被罚没,这意味着他们会被移除出验证者集,并被剥夺部分质押。简单地说,模棱两可(equivocation)就是说出两件相互矛盾的事情。它可能是为同一个时隙提出两个不同的区块,或者做出两个相互矛盾的认证,而任何诚实遵守协议的验证者都不会如此行事。

机器中的幽灵

了解了一些术语之后,让我们开始概述以太坊实际的共识机制。

以太坊的权益证明共识协议实际上是两个独立共识协议的结合,它们分别被称为 LMD GHOST 和 Casper FFG。这两个协议已经被“拧和在一起”,形成了我们为 Eth2 实现的共识协议——这个组合协议有时被称为 “Gasper”。

在 Gasper 中将这两者结合是为了在活性和安全性两个方面都获得最佳效果。本质上,LMD GHOST 为每个时隙依次提供活性(它让链保持运行),而 Casper FFG 提供安全性(它保护链免受大规模回滚)。LMD GHOST 使我们继续在彼此之上产出区块,但是这种产出是可分叉的,因此从理论上说并不安全。Casper FFG 修改 LMD GHOST 的分叉选择规则,定期赋予链最终确定性。尽管如此,如前所述,以太坊优先考虑活性。因此,在 Casper FFG 无法赋予最终确定性的情况下,链仍然会通过 LMD GHOST 机制继续增长。

这种拧和在一起的共识机制并不总是那么好。有时我们会看到接合处,两种共识机制之间的互动导致了一些我们稍后将讨论的微妙问题。然而,本着以太坊的精神,它是一个实用的工程解决方案,在实践中运行良好。

历史

Gasper 的详细历史与其组件 LMD GHOST 和 Casper FFG 的发展密切相关,我们将在它们各自的部分中进行回顾。但我们要在这里指出,Casper FFG 从未被设计为一个独立的共识机制。

正如 Casper FFG 论文中所述:

友好的最终确定性小工具 Casper 是一个建立在**提议机制(proposal mechanism,提议区块的机制)**之上的覆盖层。

因此,有一个底层区块提议机制——这意味着有一个提供某种元共识的底层共识机制,为区块链赋予最终确定性——而 Casper FFG 建立于其上。

最初的计划是将 Casper FFG 作为权益证明覆盖层,叠加在以太坊的工作量证明共识之上。Casper FFG 将在链上定期赋予(如,每 100 个区块)最终确定性——这是工作证明链所缺乏的属性。这被视作是让以太坊摆脱工作量证明的第一步。有了最终确定性的保证,我们可以减少工作量证明的区块奖励,从而减少总的哈希算力。这是一个过渡步骤,在未来某个日期最终会用完全的权益证明替代挖矿。

到 2017 年底,这个计划已经相当成熟。EIP-1011,混合 Casper FFG (Hybrid Casper FFG),详细描述了该架构,且在 2017 年 12 月 31 日甚至有一个测试网上线

然而,在 2018 年初,该计划被取代。以太坊虚拟机的有限带宽限制了EIP-1011 能支持的验证者集的大小,进而导致最低质押量为 1500 个以太币,这被视作是不可取的。大约在同一时间,通向一个完整的、更具可扩展性的权益证明协议的路径变得更加清晰,我们开始着手设计,也就是后来的以太坊 2.0。

由于其通用性,Casper FFG 能够在重新设计中幸存下来,并被以太坊 2.0 采用——不是作为工作量证明,而是作为新的权益证明协议 LMD GHOST 的覆盖层。

最终确定性小工具

当说到 Casper FFG 覆盖在现有的区块提议机制之上时,我们的意思是它采用了一个现有的区块树并以特定方式对其进行了修剪。通过使底层区块树的某些分支无法访问,Casper FFG 修改了这些区块树的分叉选择。

请将这个区块树看作是由某种底层共识机制产生的,无论是工作量证明还是权益证明中的 LMD GHOST。

在上图情形中,我有三个候选的头块:I, E, M。在工作量证明的最长链规则下,头块的选择显而易见:我必须选择 M,因为它具有最大的区块高度,或者(几乎)等同于完成了做多的工作量。在 LMD GHOST 下,我们不能仅凭这一信息去选择头块,还需要看到其他验证者的投票才能做出选择。

挑战在于,从区块 J 到 M 的链可能来自于攻击者。攻击者可能秘密挖掘了该链,然后在所谓的 51% 攻击中使用它。工作量证明节点别无选择,只能进行重组以使 M 成为头部,从而偏向攻击者的链,可能受到双花攻击。

当区块 D 被最终确定,分叉选择必须忽略以区块 F 和区块 J 打头的分支。我们最后只保留了一个候选头块:E。

从根本上说,Casper FFG 所提供的最终确定性可以防止长时间的重组(回滚)。任何已获得最终确定性的区块或已获得最终确定性的区块的祖先都永远不会被回滚。在以太坊的 Casper FFG 实现中,我们必须对”永远”加以限定,即“不会烧掉至少 1/3 的被质押以太币”的前提下。这就是权益证明区块链所提供的经济最终确定性。

结论

回过头来,这是那句我们尝试理解其所有部分的话。

以太坊的权益证明(PoS)共识协议是通过在分叉选择规则 LMD GHOST 之上应用最终确定性小工具 Casper FFG 来构建的,LMD GHOST 是贪婪的、最重的被观察子树(Greedy Heaviest-Observed Sub-Tree, GHOST)规则的一种变体,它只考虑每个参与者的最近一次投票(最新消息驱动,Latest Message Driven, LMD)。

我们花了一些时间来讨论什么是共识协议,以及它做了什么,并简单了解了权益证明。我们讨论了最终确定性,并在较高层面上说明了 Casper FFG 如何形成了一个“最终确定性小工具”,应用于作为区块提议机制 LMD GHOST 之上。

但还有很多工作要做。在接下来的章节中,我们将更深入地探讨 LMD GHOST, Casper FFG,以及它们如何结合而成 Gasper 协议。

另见

关于这一切是如何汇聚在一起的历史,Vitalik 发起过一场精彩的推文风暴。可以在这里这里找到整理后的版本。他稍微讨论了一下弱主观性,我们后面会处理这个问题。

《权益证明常见问题》(Proof of Stake FAQ)依然是对我们将要讨论的许多话题的极好入门读物。

在 Devconnect 2022 的 ETHconomics 上,Joachim Neu 的演讲《以太坊权益证明的共识问题的缘由与解决方案》(The Why and How of PoS Ethereum’s Consensus Problem)对于可用性与最终确定性之间的权衡以及以太坊如何处理这一问题提供了非常易懂的见解。讨论到 Gasper 协议时,我们将再次提到“嵌套账本(nested ledgers)”的概念。

[1] 谈到以太坊的去中心化时,牢记这一点非常有益。比如说,网络上有 60 万个活跃的验证者,这与有 60 万个独立行动者相比还相去甚远。观察节点的数量以及验证者在节点间的分布,将为以太坊的去中心化提供更有用的衡量指标。
[2] 按照共识术语中的说法,我们能够拥有“可问责的安全性(accountable safety)”。
[3] Beaconcha.in 网站按时段呈现认证的参与率(也被称为投票参与)。这是衡量网络健康程度的好方法。该比率通常超过 99%,对于一个大规模分布式共识协议,这非常出色。
[4] 这有时被称为“无利害关系问题(nothing at stake problem)”。
[5] “最新消息驱动的,贪婪的、最重的可被观察子树(Latest Message Driven, Greedy Heaviest Observed Subtree)”。我将在LMD GHOST 章节中具体解释这个命名。
[6] “友好的最终确定性小工具 Casper(Casper the Friendly Finality Gadget)”。同样,我将在进入特定的 Casper FFG 章节时解释这个略显奇怪的命名。

1 个赞

这些资料都好好啊。我在寻找一个什么位置呢?还在了解大的图景。

暂停搬运这本书,因为对于目前的我们来说好像不太实用。

网上看到 Marc Garreau 也是“以太坊核心开发者(大概一个宽泛的词汇,通常会指那些积极参与以太坊底层协议工作的开发者)”的一员,他也写过一些科普文章,俺在看关于助记词的。