文章基本信息
《Upgrading Ethereum—— A technical handbook on Ethereum's move to proof of stake and beyond》
原文作者:Ben Edgington
原文链接:
https://eth2book.info/capella/
编译:tiao
译者的话
下面是作者 Ben Edgington 在个人网站上的自我介绍[1]:
自 2024 年 2 月以来,我一直在 OP 实验室工作,扩展世界计算机。我是 Consensys Teku 以太坊共识客户端的创始人和前产品负责人。我于 2017 年 10 月加入 Consensys,头两年建立了出色的 PegaSys 研发团队,之后转到产品方面,降生 Teku。我正在撰写一本关于以太坊权益证明协议的权威技术书籍。这本书叫《升级以太坊》,有时也叫 "Eth2 Book"。据统计,我自己写了大约 135000 字,PDF 版本有 367 页。在以太坊合并前的四年中,我写了 100 期双周刊《Eth2 有什么新消息?》。我最好的推特(译注:内容为以太坊合并成功时开发者们的庆祝场景),我最配不上的推特[2]。
正文
本文一共有 5500字,共计 7 个部分,阅读完本文预计需要 15 分钟。
-
前言
-
介绍
-
达成共识
-
拜占庭将军
-
权益证明和工作量证明
-
区块的链
-
区块树
前言
这是一篇关于攻击以太坊 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 协议之间的互操作方式导致很多微妙之处和边缘情况,我专门在这一章的结尾部分讨论了这些问题。
-
共识是一种通过不可靠的组件构建可靠的分布式系统的方法。
-
基于区块链的分布式系统旨在就单一的交易历史达成一致。
-
工作量证明和权益证明不是共识协议,而是使共识协议成为可能。
-
许多区块链共识协议是“可分叉”的。
-
可分叉的链使用分叉选择规则,有时也会发生重组。
-
在一个“安全”的协议中,永远不会发生坏事。
-
在一个“活跃”的协议中,总会发生好事。
-
现实中不存在始终保持安全和活跃的协议。
介绍
本节介绍与共识、分叉选择和最终确定性相关的基础知识。其中大部分内容并不特定于以太坊,而是为提供一般的背景理解。
共识协议试图解决的挑战是在不可靠的基础设施之上构建可靠的分布式系统。对共识协议的研究可以追溯到 20 世纪 70 年代甚至更早,但我们在以太坊中所寻求解决的挑战的规模要大得多。
我们在以太坊共识层的目标是使全球数万个独立节点能够完全同步运行。每个节点维护一个包含每个账户状态的账本,而每个账本必须与其他所有账本相匹配。不能有任何差异;节点必须达成一致,迅速地达成一致。这就是我所说的“可靠的分布式系统”。
这些节点通常运行在消费级的硬件上。它们通过互联网这样一个可能有着低带宽、高延迟、丢包、或无限期中断的不可靠的异步网络进行通信。节点运营者有时会错误配置他们的软件,或者不及时更新。而且,更刺激的是,有可能有大量的攻击者为了获得利益而运行恶意节点或者篡改通信。这就是我所说的“不可靠的基础设施”。
以太坊的一个明确的设计目标是,它不仅仅在每个节点稳定运行和通信时运行良好。我们已经尽力设计了一个系统,即使在其下的世界崩溃了,它也会尽可能继续运行。
达成共识
以太坊网络由大量的单个节点组成。每个节点独立行动,节点之间通过不可靠的异步网络,即互联网进行通信。任一单个节点可能是诚实的——始终正确行动;或者以各种方式出错,简单如停机或无法通信,或者是遵循了不同版本的协议、主动试图误导其他节点、发布矛盾的消息、以及任何其他形式的故障。
用户提交交易至节点网络后,共识协议确保所有正确节点就交易历史(即交易顺序及结果)达成一致。例如,如果我拥有 1 ETH 并尝试同时发送给 Alice 和 Bob,我们会预期网络最终确认只有 Alice 或 Bob 其中一方收到这 1 ETH。若两者都收到或均未收到,则交易失败。
共识协议是就交易顺序达成一致的过程。
实际上,以太坊的共识协议”拧和“了 LMD GHOST 和 Casper FFG 两种协议,这一组合即 Gasper。我们将在后续内容中详细探讨这两种协议。
拜占庭将军
在 1982 年的一篇论文中,Leslie Lamport 用相当诙谐的方式描述了共识系统试图解决的基本问题——构建可靠的分布式系统。
让我们想象拜占庭军队的几个军团分别扎营在敌方城市外,每个军团由自己的将军指挥。将军们只能通过信使相互通信。观察敌情后,他们需要制定统一的行动计划。
这一表述说的很清楚——没有全局的整体视角,没有上帝模式,我们无法”一览众山小“并做出决定。我们只是将军中的一个,关于其他将军的唯一信息来源是所收到的消息——它们可能是真实的,也可能是虚假的,或者是基于有限信息的误解,又或者是在传递过程中被延误或篡改。我们的视角非常有限,但我们必须尽可能全面理解整个系统的状态。
需要时刻记住这一点。当我们绘制区块链和区块树时,往往假设这就是整个系统的某种“状态(the state)”。但这些图只能代表系统中单个参与者的局部视角。我的节点对系统的理解可能与你的不同,哪怕只是暂时的,因为我们都在不可靠的网络中运行。例如,我俩会在不同的时间,或者以不同的顺序看到同样的区块,更有甚者,我们所见的区块也许彼此大相径庭。
Lamport 用下面的话捕捉到系统的缺陷:
然而,部分将军可能是叛徒,试图阻止忠诚的将军达成协议。
这些变节的将军象征着我们所称的“拜占庭行为”或“拜占庭故障”。他们可以以任意方式行事:拖延消息、对消息重新排序、径直撒谎、向不同收件人发送矛盾的消息、完全不作回应、或任何我们能想到的其他行为。
忠诚的将军需要一种方法,以能够可靠地产生如下结果:
A. 所有忠诚的将军决定采取相同的行动计划(例如“进攻”或“撤退”),以及——
B. 少数叛徒无法致使忠诚的将军们采用错误计划。
在这种拜占庭分布式系统中达成共识并非易事,但多年来已有一些相当成功的方法。
第一种主流的解决方案是 1999 年 Liskov 和 Castro 发表的实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)算法。这种算法依赖于相对较小和有限的已知共识参与者(被称为副本)集合。在下面讨论的语境中,PBFT 总是“安全的”,且不会产生分叉。
中本聪共识——由中本聪为比特币发明于 2008 年——采取了截然不同的方法。它不是将参与者限制在某个已知集合中,而是使用工作量证明来无许可地选择临时领导者进行共识。与 PBFT 不同,中本聪共识允许分叉,且在形式上是不“安全的”。
自此以后,这些方法和其他的新颖替代方案(如 Avalanche 系列协议)的许多变体已大量涌现。Avalanche 白皮书的第 7 节“相关工作(Related Work)”对目前在区块链世界中使用的各种共识协议进行了很好的概述。
权益证明和工作量证明
在此,我们不妨指出,工作量证明和权益证明本身都不是共识协议。它们经常被(懒散地)称为共识协议,但都只是共识协议的辅助工具。
大多数情况下,工作量证明和权益证明都是抵抗女巫攻击[3]的机制,它们为参与协议设定一种成本,而这可以防止攻击者以低成本或零成本压垮协议 [4]。
尽管如此,通过分叉选择规则,工作量证明和权益证明通常都与它们所支持的共识机制紧密耦合。它们提供了一种有用的方法来为区块链分配权重或分数:在工作量证明中,是已完成的总工作量;在权益证明中,是支持特定区块链的价值量。
除了这些基本因素外,工作量证明和权益证明都支持在其基础上建立多种不同的共识协议,而每种协议都有自己的动态和权衡。同样,Avalanche 白皮书第 7 节“相关工作”中的概述很有启发性。
区块的链
区块链技术背后的基本原语当然是区块。
一个区块由一个领导者(区块提议者)收集的一组交易组成。一个区块的内容(有效负荷)可能因协议而异。
-
以太坊执行层链上的区块有效负荷是用户交易列表。
-
合并前的权益证明信标链上的区块有效负荷(大部分)是由其他验证者做出的一系列证明。
-
合并后的信标链区块也包含了执行层的有效负荷(用户交易)。
-
当 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 更有机会进入最终的区块链。
区块树中的各种分支被称为“分叉”。在网络和处理延迟的情况下会自然产生分叉。但也可能是由于客户端故障、客户端恶意行为或协议升级改变了规则,使得旧的区块在新规则下失效。后者通常被称为“硬分叉”。
共识协议中分叉的存在是将活性置于安全性之上的结果,这一点在下文中会讨论:如果你去问那些遵循不同分叉的节点,它们会就系统状态给出不同的答案。存在不产生分叉的共识协议,例如古典共识世界中的 PBFT 和区块链世界的 Tendermint。这些协议总是产生单一的线性链,因此在形式上是“安全的”。不过,在互联网等异步网络上,它们牺牲了活性:与其分叉,它们彻底停止运转。
注释
[1]作者 Ben Edgington 在个人网站上的自我介绍:https://benjaminion.xyz/
[2] 译注:一个 15 秒的视频,推文是“为 Ben 工作是你能为自己的职业生涯所做的最好的事情之一”
[2] 抵抗女巫攻击的机制,详见原文《1.1 Introduction》:https://eth2book.info/capella/part2/incentives/staking/#introduction
[3] 工作量证明中,你提供的”证明”是一个使区块哈希成为特定值的数字。这证明了你确实做了计算工作。在权益证明中,你的证明则是与区块链上的质押存款相关联的私钥。还有其他可用的证明机制,比如时空证明。
[4]分叉选择的规则,详见原文《3.7 Fork Choice》:https://eth2book.info/capella/part2/consensus/preliminaries/#fork-choice-rules