本文介绍了以太坊信标链的LMD-GHOST共识算法存在的平衡攻击问题,并提出了改进方案Goldfish。Goldfish通过两个核心改变——消息缓冲(view-merge)和投票过期——在简化算法的同时提高了安全性。消息缓冲让验证者在投票前同步提议者的视图,投票过期则阻止旧投票被重放。这些改动使得Goldfish比未修补的LMD-GHOST更简单,比修补后的版本更安全。文章还讨论了Goldfish的子采样和乐观快速确认特性,展示了其在可扩展性和最终性延迟方面的优势。
在上一篇文章中,我们解释了 LMD-GHOST 的工作原理。本篇将讨论其存在的问题,以及 Goldfish 如何解决这些问题。
最新消息驱动幽灵协议(LMD-GHOST)是以太坊信标链的分叉选择规则。人们发现了利用该算法固有协调不足的平衡攻击,因此添加了补丁以提高安全性。然而,这也使算法变得更加复杂,导致理解、实现和形式化验证其属性变得困难。
自合并以来,出现了多种新算法,每种都有可能替代 LMD-GHOST。Goldfish 就是其中之一。它源自论文 Goldfish: No More Attacks on Ethereum?!,设计为 LMD-GHOST 的即插即用替代方案:相同的分叉选择树,相同的提议者/委员会结构,仅对消息计数方式做了两处小改动。结果是一个比未经修补的原始协议更简单、且比修补后的版本更安全的协议。
LMD-GHOST 中的一个 Slot 分为两个阶段:Slot 开始时的提议阶段,以及随后的投票阶段。诚实投票者在投票阶段不进行协调;每个人在自己的本地视图上运行分叉选择,并广播结果。如果这些视图不一致,投票就会分裂。
这种缺乏协调为平衡攻击留下了可乘之机。攻击者向不同的诚实验证者传递冲突的投票,将它们分成两组,各占一半,分别支持两个竞争链。由于每一半验证者都看到全网有一半在为它们所在的链投票,它们永远不会切换,导致共识停滞。通过在后续 Slot 中提供更多冲突投票,攻击者可以无限期地维持这种分裂状态。
攻击者在两条链上平衡投票权重,最大化分叉选择的不确定性
该攻击在规范中通过添加提议者提升得以修补。这种提升试图通过临时给当前提议者的区块增加额外的分叉选择权重来提高验证者协调性。然而,提升幅度很大,因此控制提议者 Slot 的攻击者会获得不成比例的权力。在低参与度下,其权重主导分叉选择,提议者可以随意改变网络视图。
修补后的 LMD-GHOST 在生产环境中运行良好。但它难以推理、难以形式化验证、也难以扩展。Goldfish 正是在此背景下诞生。
Goldfish 保留了 GHOST 分叉选择规则以及提议者/委员会结构。它改变了两个地方:投票如何进入验证者的本地视图,以及投票保持有效的时间。
第一个是消息缓冲,也称为视图合并。传入的投票先进入缓冲区,而不是本地区块-投票树。验证者暂时不考虑这些投票,仅在当前 Slot 的提议者广播其区块时才将其合并。每个诚实投票者都会通过提议者区块的正文来采用该提议者的视图,然后再进行投票,这是一种主动协调行为。

第二个是投票过期。在一个 Slot 中,只有上一 Slot 的投票才计入分叉选择。这取代了 LMD-GHOST 的 LMD 特性,使得攻击者无法囤积旧投票并在之后释放,从而影响网络视图。

这两个思路保护验证者免受平衡攻击。消息缓冲让诚实投票者能够团结在提议者视图周围,因此攻击者无法将它们分裂到不同的竞争子树中。投票过期防止攻击者揭示很久之前 Slot 的投票,因为旧投票不计入。
两个简单的思路构成了一个简单的算法。
作为其简单性的证明,我们可以对其有效性进行非正式论证:
当一个诚实验证者提议时,每个诚实投票者都会看到该提案并为该区块投票,因为所有人都共享提议者的视图。在下一个 Slot 中,分叉选择只会统计上一 Slot 的投票,而这些投票全部集中在这个区块的链上。诚实投票者数量超过攻击者,因此该链获胜,下一个 Slot 的诚实投票者将支持其后代区块。后续 Slot 也是如此。一旦诚实投票者为某个区块投票,它们就会持续为其后代投票。
诚实提议者出现的频率很高:在高概率下,每几个 Slot 中至少有一个。它们的区块保持规范状态,使算法能够抵抗重组。由此保证了安全性和活跃性。

Goldfish 的一个 Slot 分为三个阶段:提议、投票和确认。每个验证者维护两部分状态:一个接收消息的缓冲区,以及一个区块-投票树。
在提议阶段,有资格的提议者将其缓冲区合并到区块-投票树中,使用上一 Slot 的投票运行分叉选择来选取父块,然后广播新区块以及来自合并树的投票。
在投票阶段,每个验证者将提议的区块及其投票合并到自己的树中。有资格的投票者随后对合并后的树运行分叉选择(使用上一 Slot 的投票,因为还没有任何人投出当前 Slot 的投票),并广播对结果链头的投票。这正是视图合并/消息缓冲的优势所在:如果提议者是诚实的,那么每个诚实验证者此时都能看到相同的树,并为同一个区块投票。
在确认阶段,每个活跃的验证者再次合并其缓冲区,使用刚投出的当前 Slot 投票运行分叉选择,并输出当前链。我们可以在此处选择一个最终性参数 κ。输出链中除去最后 κ 个 Slot 的部分即为已确认账本。任何超过 κ 个 Slot 的记录都可视为最终确认。
算法的简单性带来了额外的可组合性,允许安全地进行子采样和乐观快速确认。
Goldfish 不要求每个验证者在每个 Slot 都投票。每个 Slot 的投票委员会是验证者集合的一个随机子样本,通过抽签选出。由于委员会规模是验证者集合的一个较小样本,消息复杂度随着验证者集合的增长而保持平稳。子采样还能防御自适应腐败:攻击者无法预先锁定投票目标,因为在有人揭示获胜票之前,没人知道谁是委员会成员。它与投票过期配合良好,因为验证者最多缓冲一个 Slot 的委员会投票,这使得消息缓冲在大规模场景下易于处理。
Goldfish 在投票和确认之间增加了一个可选的第四阶段快速确认。如果一个区块在其自身 Slot 中收集到来自四分之三绝对多数投票者的投票,验证者会立即确认该区块,无需等待 κ 个 Slot。在高参与度且攻击者比例不超过四分之一的情况下,快速确认能在提议后实现恒定延迟的最终性。如果条件恶化,协议会回退到标准的 κ 深度确认规则。
Goldfish 比未经修补的 LMD-GHOST 更简单,比修补后的版本更安全。从清晰的模型出发设计协议带来了这两方面的收益。Goldfish 及其衍生方案正在被考虑用于以太坊和 leanConsensus 的未来,因此预计会看到更多关于它们的进展。
如需进一步了解:
- 原文链接: blog.lambdaclass.com/gol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码