感谢 Matheus Franco 的审阅。
抽象的
Holesky 测试网路事件揭示了以太坊共识机制的关键漏洞:当绝大多数验证者因客户端漏洞而错误地验证了无效的链状态时,网路将进入不可恢复的状态,需要透过破坏性的非活跃度泄漏来恢复最终性。本文提出,采用异质运营商的分散式验证者技术 (DVT) 可以提供一种保护机制,以应对此类多数分叉场景。透过在 DVT 丛集层级引入检查点验证,我们展示了多元化的验证者营运商如何选择性地拒绝验证恶意分叉,从而在无需大规模惩罚的情况下阻止最终性确认。该机制以牺牲短期内对错误分叉的合理性为代价,换取了长期的网路安全,最终使诚实的少数验证者能够透过社会共识和非活跃度泄露来取得胜利。
1. 以太坊的根本设计选择:活性优先于安全性
本文概述了以太坊基于「活跃性优先于安全性」的设计理念及其与非活跃资料外泄的关系。已了解相关知识的读者可以直接跳到下一节。
1.1 CAP 定理与区块链共识
以太坊的共识机制设计体现了一种深层的深思熟虑的选择:当网路必须在安全性(防止冲突的最终状态)和活性(持续生成和最终确定区块)之间做出选择时,以太坊优先考虑活性。这意味著它允许不同的分叉方案竞争网路的接受度。
这项选择源自于CAP 定理。 CAP 定理指出,分散式系统无法同时保证一致性(安全性)、可用性(存活性)和分区容错性。以太坊作为一个无需许可的系统,必须容忍网路分区,因此无法同时实现这三项特性。以太坊选择在灾难性故障期间牺牲一致性,以确保网路持续运作。
1.2 理由:不活跃泄露
以太坊透过不活跃泄漏机制正式确立了这个选择。正如以太坊 Gasper 规范中所述,当区块链连续四个 epoch 以上未能完成最终确认时,就会启动不活跃泄漏机制。一旦激活,无论多数分叉是否有效,该机制都会逐步惩罚那些未对多数分叉进行验证的验证者。一个价值 32 ETH 的验证者需要 4986 个 epoch(即 3 周)才会被从系统中移除。
该协定的逻辑是,临时的网路可用性优于永久的安全保障。如果发生网路分裂,且大多数验证者位于其中一方,则不活跃泄漏机制可确保该方最终能够完成合并并恢复网路。另一方的少数诚实验证者将受到惩罚,但他们最终可以透过社会共识(硬分叉)恢复并重新加入网路。
2. 霍尔斯基事件:基于错误假设的共识失败案例研究
2.1 发生了什么
2025年2月25日,以太坊Holesky测试网启动了Pectra升级。数小时内,网路遭遇严重故障:三个主流执行层用户端——Geth、Nethermind和Besu——配置错误,使用了错误的存款合约位址。受影响的客户端无法正确追踪验证者的存款,导致共识出现不一致。最终,执行层和共识层失去同步。大多数验证者开始在无效链上验证区块,无法侦测到底层执行状态的错误。
结果是最终确认失败,且无法挽回。为了恢复网络,那些对错误链进行验证的验证者将面临严厉的惩罚。不活跃泄漏机制必须缓慢地扣除离线验证者的权益,直到正确的链重新获得三分之二的绝对多数——这个过程大约耗时三周。尽管少数客户端(一个执行客户端)仍在持续产生有效区块,但绝对多数的验证者阻止了在正确链上完成最终确认。
2.2 违反诚实多数假设
以太坊共识协议基于一个基本的安全假设:诚实多数假设。 Casper FFG 最终性要求三分之二的验证者对同一检查点进行验证。活性(区块生成)则依赖于分叉选择规则下的简单多数。该协议旨在确保只要拜占庭验证者(恶意或有缺陷的验证者)少于三分之一,就能正确地最终确定状态。
Holesky 事件打破了这个假设。该漏洞导致诚实的验证者对网路表现出对抗行为。客户端多数实际上变成了拜占庭式的,投票支持了一个无效状态。
关键在于,以太坊的安全性依赖拜占庭验证者数量少于三分之一。当三个主流用户端同时发生相同故障时,它们将占网路总数的三分之一以上,从而破坏安全保障。
2.3 为什么不作为造成的资讯外泄具有破坏性
一旦网路进入分叉状态,以太坊为了确保网路的活跃度,不得不牺牲安全性来维持其恢复。不活跃度泄漏机制会逐步降低未验证多数派分叉的验证者的有效余额。这个过程会持续进行,直到这些未验证者的余额降至极低,最终退出验证者集合,从而使剩余的(正确的)验证者达到三分之二的份额。
然而,这种机制在几个方面都具有破坏性:
- 经济损失:多数派(错误)分叉上的验证者将受到惩罚,永久损失 ETH。少数派(正确)分叉上的验证者将因明显的不活跃状态而受到惩罚。
- 分叉风险:如果非活跃泄漏持续足够长的时间,两个分区可能会分别达到三分之二的权益,并最终形成独立的历史记录版本。
- 恢复时间:整个过程持续了数周,在此期间,网路无法完成交易,也无法为使用者和应用程式提供确定性。
3. DVT PBFT 问题:为什么简单的基于法定人数的认证会失败
3.1 简易的深部静脉血栓形成处理方法
分散式验证器技术利用阈值密码学和秘密共享技术,将单一验证器的签章金钥分配给多个独立的运营商。每个运营商持有一个密钥份额,并参与拜占庭容错(BFT)共识机制,以就各自承担的职责达成协议。
在一个简单的DVT设计中,一旦BFT共识就某个操作达成一致,所有操作员都会签署并提交证明。逻辑很简单:如果BFT共识达到法定人数,则该决定是正确的。
然而,这种逻辑可能会让我们陷入多数派分叉陷阱。
3.2 诱捕性能
非正式直觉
一旦验证者投票决定推进某个分叉上的检查点的最终确定,它就会在该时间点被本地锁定到该分叉上。
更具体地说,假设有两个相互冲突的分支(A)和(B),并且分支(A)比分支(B)进展得更远。如果验证者(V)投出一票((s_a,t_a)),该票有助于分支(A)上检查点(a)的最终确定,那么从那时起,(V)就不能对目标纪元为(t_a)或更晚的分支(B)投出任何票,否则将违反 Casper FFG 惩罚规则。
直观地说,验证者透过投票最终确定分支 (a),即承诺在分支 (A) 上使用特定的 epoch 间隔。任何试图透过投票在相同或更晚的 epoch 上设置检查点来「追赶」分支 (B) 的行为,要么会导致:
- 对同一目标纪元进行双重投票,或
- 围绕先前的投票,
这两项都是应被减刑的犯规。
因此,在投票决定最终确定分支 (a) 后,验证者会陷入分支 (B) 的困境:除非分支 (B) 首先将其合理的检查点推进到验证者锁定范围之外的纪元,否则验证者无法帮助分支 (B) 最终确定。在此之前,验证者无法在不违反这种困境的情况下为分支 (B) 的最终确定做出贡献。
为了明确这一点,让我们将其正式化。
卡斯柏 FFG 回顾
首先,快速回顾一下Casper FFG的投票机制:
每次认证都会引发一次目标检查点投票,试图证明某个纪元的合理性,以及一次源检查点投票,试图最终确定该纪元。一个纪元只有获得超过三分之二的目标投票才能被认定为合理。而一个纪元只有在以下情况下才能最终确定:它之前已被认定为合理,获得了超过三分之二的源投票,并且在它正上方的纪元处创建了一个新的、具有相同认证集的、已被认定为合理的检查点。
现在,让我们回顾一下斜线规则:
令(s_a,s_b)表示两个不同的来源投票。
令 (t_a, t_b) 表示两个不同的目标投票。
令 (h(x)) 表示任何投票或检查点的高度(纪元)。
若投票由同一验证者发出,则该投票会因以下任一原因累积罚没违规:
- 重复投票规则:(h(t_a) = h(t_b))
- 环绕投票规则:(h(s_b) < h(s_a))且(h(t_a) < h(t_b))
Casper FFG 的论文正是根据这些规则推导出以下性质:
(iv)至多存在一个高度为(n)的合理检查点。
捕获属性的形式化定义
预赛
令 (a, b) 为不同分支 ((A) 和 (B)) 上的最新合理检查点,它们分别可以通过投票 ((s_a, t_a)) 或 ((s_b, t_b)) 推进到最终阶段,其中 (h(s_a) = h(a)) 且 (h(b) = h(s_b))。
我们注意到,如果 (h(a) = h(b)),则至少 (1/3) 的验证者犯了惩罚违规 (1)。
诱捕属性
不失一般性,如果 (h(a) > h(b)),并且 (V) 是一个验证者,它投票以 ((s_a, t_a)) 投票最终确定 (a),那么 (V) 不能创建任何 ((s_b, t_b)) 投票,使得 (h(t_b) \ge h(t_a)),而不造成惩罚。
从这里很容易看出,现在 (V) 如果不进行斜线操作,就无法对 (B) 上的任何检查点的最终化做出贡献。
证明
如果 V 发出一个 ((s_b, t_b)) 使得 (h(t_b) = h(t_a)),则明显违反了双重投票规则。因此,为了越过分支 (A),V 必须发出一个 (t_b) 使得 (h(t_b) > h(t_a))。由于 (b) 是最新的合理检查点,V 必须对 (s_b) 进行投票。已知 (h(s_b) = h(b) < h(a) = h(s_a)),因此该投票构成了斜杠违规。
3.2 多数派分叉陷阱:范例场景
场景设定:
- DVT 丛集有 4 个运算子:(O_1)、(O_2)、(O_3)、(O_4)。
- 法定人数为 3 位操作员。
- 这个网络在 Epoch (X+1) 上经历了一次分叉:链 (A)(网络的大多数)和链 (B)(少数,正确的链)。
- (A)和(B)都没有足够的验证者来证明检查点的合理性或最终确定性。
- BFT 领导者(透过循环选出)现在是(O_1)。
场景:
- (O_1)位于链(A)(多数分支)。
- (O_1)作为 BFT 领导者,向 DVT 集群提议:「证明链(A):源投票于纪元(X)进行,目标投票于纪元(X+1)进行」。
- (O_2)和(O_3)恰好在链(B)上,但它们只检查提案是否会导致惩罚违规。
- BFT 共识达到法定人数:(O_1)、(O_2)、(O_3) 批准链 (A)、区块 (X) 的证明。
- 该证明由DVT集群签署并提交。
- 在该纪元结束时,链 (B) 上没有建立或完成任何检查点。
- 下一个 Epoch (O_2) 是 BFT 领导者,并向 DVT 集群提议:在链 (B) 上进行验证:源投票在 epoch (X) 上进行,目标投票在 epoch (X+2) 上进行。
- 由于这不是重复投票,也没有包围先前的投票,所以不能被删除,因此予以接受。
- DVT丛集会在链(A)和链(B)之间不断轮换认证,从而获得两个分叉链的奖励。注意:由於单一链上的验证者数量较少,可能会出现认证槽位缺失的情况。这将抵消上述正面影响,因为认证将难以被纳入。
- 经过 4 个 epoch 后,两个分叉链上的不活跃漏洞都被启动。对于每条链,DVT 验证器的不活跃分数在每个不活跃 epoch 时增加 4,在每个活跃 epoch 时减少 1。
- 链 (A) 在链 (B) 之前就开始验证检查点。一旦 DVT 验证器推进来源投票,它实际上就会被困在链 (A) 上。
- DVT 簇不活动分数从 (B) 开始每周期增加 (4)。
- 此时,DVT 簇只有在下列情况下才能逃脱 (A):
a. 它停止对(A)进行认证
b. 它在(B)的非活跃性泄漏中幸存了下来
c. 链(B)证明检查点的高度高于 DVT 目标投票决定的高度(A)。
后果:
DVT集群迫使少数派运营商与多数派运营商保持一致。
如果大多数人诚实,那么这是一种有益的行为。
DVT验证器同时参与两条链的运行,因为它事先并不知道哪条链最终会成为标准链。它将基于率先恢复三分之二多数支持的那条链进行构建。
如果多数派恶意分叉,则 DVT 丛集会被多数派分叉所困。之后,当不活跃泄漏导致网路恢复且链 (B) 成为规范链时,DVT 丛集的验证者将面临因质疑链 (B) 或放弃链 (B)(接受损失)而受到的惩罚。
关键问题在于:即使并非所有操作者都认同多数派的分叉方案,DVT丛集也被迫投票支持该方案。 BFT共识机制其实成为了一种迫使少数派操作者接受多数派选择的手段。
4. 解决方案:检查点验证和丛集级弃权
4.1 引入检查点验证
为了解决多数分支陷阱, DVT 丛集可以在对检查点进行认证之前实现检查点验证。
检查点验证规则:
对于 DVT 集群,要证明其在纪元 (E) 的检查点 (C) 正确:
- 每个操作员都必须验证纪元层级的检查点结构是否有效。
- 每个操作员都必须独立验证来源的历元。
目标检查点与他们的本地视图相符。 - 如果达到法定人数的操作员(例如,2/3)同意,则 DVT 予以证明。
- 如果无法达到法定人数,DVT 将不会出庭作证。
func shouldSignAttestation (own, proposed Attestation) bool { return own.SourceCheckpoint.Epoch == proposed.SourceCheckpoint.Epoch && own.TargetCheckpoint.Epoch == proposed.TargetCheckpoint.Epoch} 4.2 当证明失效时:弃权机制
关键机制在于:如果没有足够的操作员就纪元层级的检查点结构达成一致,丛集将不会进行认证。
与必须进行验证(否则将面临不活跃处罚)的单一验证者不同,DVT 群集可以选择性地退出验证。这是一个关键优势:DVT 丛集的设计目标是容错和冗余,而不是保证参与。
当深部静脉血栓簇停止活动时会发生什么:
- 深部静脉血栓被标记为非活动性。
- 帐户会开始累积不活跃罚款,但不会被大幅削减。
- DVT 之后可以切换回验证正确的叉子。
5. 网路级安全:多元化 DVT 如何防止多数派分叉最终确定
5.1 异质性假设
整个机制依赖于一个关键假设: DVT 聚集体必须是异质的。
如果所有 DVT 丛集都使用相同的执行客户端(例如,都使用 Geth),那么在类似 Holesky 漏洞的事件中,它们都会遇到相同的漏洞。它们都会处于同一个多数分支上,并被迫进行验证(透过 BFT 共识)。在这种情况下,DVT 无法提供任何保护。
但是,如果 DVT 丛集由使用不同客户端的独立各方营运(有些使用 Geth,有些使用 Nethermind,有些使用 Besu),情况就会改变:
一旦分支被证明是合理的,检查点验证就会启动弃权机制。
5.2 关键阈值:防止多数派分叉最终确定
以太坊的最终性规则要求超过三分之二(66.7%)的验证者同意一个检查点才能最终确定。
如果以太坊验证者中有足够比例的验证者是具有异质运营商的分散式验证者,那么:
- 多数派分支上的决策者将弃权(如果他们发现分歧)。
- 多数派方案无法获得三分之二的同意,因此无法最终确定。
计算范例:
让我们以目前SSV网路的渗透率为基础:
- DVs:14%(全部弃权以进行最终表决)。
- 在多数分叉过程中,假设 80% 的网路(错误地)流向了多数分叉。
- 传统验证者:69% 证明多数派分叉,17% 证明少数派分叉。
- 多数派最终达成协议,DVT 未参与其中。
但是,假设以太坊 30% 的验证者是具有异质运营商的分散式验证者。
- 70%是传统验证者。
- 在多数分叉过程中,假设 90% 的网路(错误地)分叉到了多数分叉。
- 操作人员不同的DV:30%的人弃权。
- 传统验证者:63% 证明多数派分叉,7% 证明少数派分叉。
- 尚未最终确定。
5.3 网路稳定性论证
关键洞见:如果深部静脉栓塞人群足够多样化,那么在没有他们的配合下,就很难最终确定一个糟糕的方案。这就形成了一个自然的止步点:
- 多数派分支试图完成最终决策。
- 不同的决策者会侦测出这种不一致之处并予以回避。
- 最终化过程被阻止,从而阻止了规范链的分裂。
- 网路处于「停滞」状态,尚未最终解决。
- 不活跃泄漏机制启动。
- 诚实的社区有时间协调。
至关重要的是,这结果优于霍尔斯基情境:
- 正确链上的验证者不会被罚没。
- 诚实的少数派没有义务接受多数派的分支作为正统版本。
- 社会共识可以决定正确的复苏路径。
- 在此之前,两个分支都保持运作状态。
6. 权衡取舍:无需最终定论即可进行论证
6.1 为什么决策验证可能为糟糕的分叉提供正当理由(但并非最终决定因素)
我们提出的检查点验证机制有意不检查状态根。这是一个关键的设计选择,它造成了一个根本性的限制:即使DVT丛集无法最终确认一个错误的派生,它们仍然可以证明(并因此证明)该派生是合理的。
为何排除状态根检查:
比较 DVT 算子之间的完整状态根需要:
- 所有操作符都已处理并验证了完全相同的区块状态
- 在给定时隙对整个执行层状态达成一致
- 即使状态偏差很小,任何区块都会被拒绝。
这会造成一个致命的问题:由于网路延迟和区块传播延迟,营运商可能无法在同一时刻拥有完全相同的状态根。有些业者会比其他业者略早收到区块 X。如果要求状态根完全一致,则 DVT 丛集几乎永远不会进行认证——这将导致持续的非活跃状态惩罚,并使 DVT 在经济上不可行。在对抗场景下,这个问题会更加严重。
为了解决这个问题,机制有意放宽了验证规则:仅验证检查点的纪元结构,而非完整的执行状态。这样,即使操作者对目前 HEAD 槽的看法略有不同,只要纪元层级的共识结构(来源检查点、目标检查点、已验证的检查点)保持一致,他们仍然可以进行验证。
权衡取舍:
这种设计选择会产生直接后果:由于 DVT 群集不验证状态根,它们将有助于证明分叉的合理性。
在分岔的第一个时期:
- DVT操作员看到2个不同的叉子。
- 每个分支上的纪元层级检查点结构似乎都是有效的。
- BFT 共识很容易达到法定人数,从而对领导者做出的任何决定(很可能是多数人的决定)予以确认。
后果:
依赖验证者可能会因为底层结构表面上正确,就为错误的衍生版本辩护(累积超过三分之一的验证结果)。如果不透过持续的验证失败来损害可用性,就无法阻止他们这样做。
6.2 为什么这是可以接受的
从DVT验证者的角度来看,这是可取的,并且与其激励机制非常契合:
- 网路可用性:透过排除状态根检查,我们保证了DVT的可用性。即使在网路分区或临时状态分歧期间,DVT集群也能继续参与共识,这对于网路的活性至关重要。
- 最终化仍然受到保护:尽管分散式验证程序可能会为糟糕的分叉辩护,但只要它们有多样化的设置,它们就不会最终化它。
- 可逆性:经过论证后,决策者始终可以选择切换到另一个分支而不会受到惩罚,从而最大限度地提高他们可以从任一链中获得的收益。
- 减少不活动泄漏的影响:DV 会根据其在每条链上的群集组成比例进行验证,直到达到合理性阈值。过早停止意味著要承受不活动泄漏的严重后果。
7. 其他验证者的两难:惩罚与最终确认之间的权衡
7.1 非DVT验证者面临的问题
一旦 DVT 丛集确认了多数派分叉,网路上的其他验证者就面临著一个两难的境地:
情况:
- DVs(证明多数人支持分叉)+多数传统验证者 > 66.7%。
- 错误的分支是合理的,导致 DV 在下一个 epoch 中弃权。
- 即使传统验证者无法最终确定分叉,他们也可能因为投票推进源分支而陷入困境。
后果:
被困的验证者无法帮助完成正确的分叉。
7.2 DVT 的机会:迈向更强网路韧性的途径
从网路安全角度来看,这种结果并不理想。尽管如此,DVT丛集仍然有动力避免因在两条链上都进行验证而加速自身的不活跃资讯外泄。对于担心灾难性多数分叉事件的验证者而言,采取积极主动的措施有助于降低风险。
一个关键选择是过渡到分散式验证树(DVT)群集。分散式验证的广泛应用甚至可以解决 客户端多样性问题:面对不同的运营商配置,DVT 验证器可以有效地整合跨多个客户端实现的检查,从而增强整个生态系统。
8. 深部静脉栓塞多数患者的重要性
8.1 关键安全属性
以太坊的最终性机制(Casper FFG)要求三分之二的验证者才能确认并最终确认一个检查点。如果超过三分之一的网路由不同的分散式验证者(DV)组成,那么就能保证任何分叉都不会在没有社会共识的情况下最终确认。
8.2 解除验证者的陷阱
由于在给出理由后弃权可以避免陷阱,因此,一旦达成社会共识,决策者就可以转而证明正确的叉子。
一旦选定的分叉点比错误的分叉点高出足够的高度,被困的传统验证器就可以安全地切换了。
DVT 成员越多,选定的分叉就能越快最终确定,不活跃漏洞也能越快消失。如果这个过程够快,被困的验证者就能在达成社会共识后不久脱离困境。
8.3 实际效果
实际上,这意味著:
- Holesky 事件得以避免:如果在 Holesky 事件期间,40% 的验证节点是来自不同营运商的分散式验证节点 (DV),则多数分支可能无法最终完成。这样,长达三周的不活跃资料外泄也就不可能发生。
- 社会共识窗口:网路获得时间(数天至数周)来协调达成社会共识。不会发生不可逆转的分裂。
9. 限制与假设:当深部静脉血栓保护失效时
9.1 同质性深部静脉血栓形成情景
整个机制依赖异构的DVT运营商。如果DVT丛集由关联方营运或仅使用一种用户端实现,则其提供的保护有限甚至没有保护。
9.2 协同作战攻击
如果 DVT 群集的运作者受到激励而围绕某个特定的分支进行协调(例如,他们出于与正确性无关的经济原因而集体偏好分支 A),则检查点验证机制无法阻止这种情况。
DVT的加密安全性确保任何单一操作员都无法窃取验证器金钥。然而,它并不能强制操作员的行为符合网路利益。如果一定数量的操作员心怀恶意或相互勾结,他们可以强迫丛集对任何分叉进行认证。
9.3 客户绝对多数问题
在 Holesky 事件期间,有三个执行客户端受到影响:Geth、Nethermind 和 Besu。如果这三个用户端占所有验证者(包括独立验证者和分散式验证者)的 66.7% 以上,那么所有使用这些用户端的分散式验证者都将位于多数派分叉上。
9.4 未能避免不活动泄露
验证者会在锁定到陷阱区块之前,在少数链上进行验证,验证频率与其委员会成员中认为该陷阱区块为规范区块的比例成正比。然而,由于大多数验证者并未提议区块,验证结果的注册会有延迟。因此,无论验证者的表现如何,都可能因不活跃而受到资料外泄惩罚。
10. 结论:通往韧性共识之路
分散式验证器技术(DVT)结合异构运维人员提供了一种新颖的解决方案。透过在群集层级实施检查点验证,DVT 可以选择性地避免多数派分叉。如果有足够的验证器采用不同的 DVT,网路将具备以下能力:
- 防止不良分支最终形成,而无需进行大规模的切割。
- 透过阻止不可逆转的分裂来维护社会共识的恢复路径。
- 为诚实的社群提供时间和空间,以便协调硬分叉复原工作。
- 在协议层面创造激励机制,以促进客户和营运商的持续多元化。
这种机制并非万能之策,它需要:
- DVT 的采用率足够高(>33.3% 的验证者)。
- 客户和营运商分布不均。
- DVT操作员之间不存在协调一致的复杂行为。
然而,即使有这些假设,它也代表著比当前状态的重大改进,在当前状态下,客户端的绝对多数故障可能会不受控制地导致网路分叉。
未来的发展方向是积极推广DVT的采用,确保营运商和客户端的广泛参与,并将检查点验证作为DVT共识机制的标准组成部分。随著以太坊的成熟,这一层保护对于网路的长期稳定性将变得日益重要。




