4 V2 n! \# U: C) n* ^& e+ q所有这些都以相同的方式适用于执行客户端。Go-Etherum很可能是合并后的大多数执行客户端,如果它产生无效的块,它可能会最终确定,从而导致场景3中描述的灾难性故障。 3 \7 g5 g! z0 @ A2 s5 B/ u 7 C; k/ t7 S/ [幸运的是,我们现在已经有另外三个执行客户端准备好投入生产--Nethermind、Besu和Erigon。如果你是一名质押者,我强烈建议你运行其中的一个。如果你经营的是少数派客户端,则风险非常低!但如果你经营多数客户端,你就面临着损失所有资金的严重风险。( L# Y ^* S$ K1 N" v# q
% A8 t- h# `2 g2 p
附录 $ ?3 h9 T& d8 b. X2 F# z3 W6 i1 n' `
附录1:为什么不对无效的区块进行大幅削减?+ I' Y: Y+ F& U- q$ Y
! d' o8 i4 I7 d
在场景3中,我们必须依靠二次无活动泄漏来惩罚提出和投票给无效块的验证器。这很奇怪,为什么我们不直接惩罚他们呢?这样看起来会更快,也不会那么痛苦。3 [: x6 V8 X- c+ {6 a4 {( a, Q
& ?2 T6 o8 l L1 O+ r+ M! u
事实上,我们不这么做的原因有两个--一个是我们目前不能这么做,但即使我们可以,我们也很可能不会这么做:6 k: s. b |3 b9 d1 H2 T/ }9 Y
0 s$ l, O; D/ x4 c2 p* N1 ~0 U
1. 目前,几乎不可能对无效数据块引入惩罚(“大幅削减”)。这是因为信标链和执行链目前都不是 “ 无状态 ” ——即为了检查区块是否有效,您需要一个大小为100s MB(信标链)或GB(执行链)的上下文(“状态”)。这意味着没有 “ 简明的证据 ” 来证明区块是无效的。我们需要这样的证据来削减验证器:“削减”验证器的块需要包括验证器已经犯法的证据。在没有无国籍共识的情况下,有一些方法可以绕过这个问题,但它将涉及更复杂的结构,如多轮欺诈证据,如Arbitrum目前用于汇总的证据。0 L" k4 e+ r' I* _! ^+ U
. Z& Y4 \( B) }7 y# U5 W# d! D2. 我们可能不那么急于引入这种类型的削减的第二个原因是,即使我们可以这样做,也是因为产生无效块比目前的削减条件更难防止。目前的条件非常简单,验证器客户端只需几行代码就可以轻松地进行验证。这就是为什么我认为上面的情景1不太可能--到目前为止,可删减的消息只是由运营商的失误产生的,我认为这种情况可能会继续下去。添加用于产生无效区块(或证明它们)的斜切会增加投币者的风险。现在,即使是那些经营少数派客户端的人也可能面临严重处罚。 x3 P& @, \$ a: c
. v9 s, I, |& W6 G
总而言之,在接下来的几年里,我们不太可能看到对无效块和/或对它们的证明进行直接惩罚。 4 S$ d- r$ c* {: m# F6 H0 u+ \ " i; x" o, ^( T& W2 G5 R附录2:为什么有缺陷的客户端在最终确定链A后不能切换到链B? 8 T* ?5 b4 v" j5 s) j1 T7 @' Z. X1 g/ ?
这一节是为那些想要更详细地了解为什么有错误的客户端不能简单地切换回来而不得不遭受可怕的无活动泄漏的人而设计的。为此,我们必须看看Casper FFG最终确定是如何工作的。 7 d2 }: u( E2 I$ o! k( X. z. t' |9 s+ K9 ~! I
每个证明都包含一个源检查点和一个目标检查点。检查站是一个纪元(Epoch)的第一个区块。如果存在从一个纪元到另一个纪元的链接,而该链接的投票总数超过所有利害关系的2/3(即,有如此多的证明,其中第一个检查点为“源”,第二个检查点为“目标”),则我们将其称为“超级多数链接”。7 d3 \' E7 `) _& Y' t n( M, u
; i7 G+ } l, Q' x4 b
一个纪元可以是“合理的”,也可以是“确定的”,它们的定义如下: 6 {; J5 V8 b+ U8 G) Q* |2 s- e0 D0 Z! Z) _& s/ L+ ?9 n5 K
1. 纪元0是对齐的。 * i9 Y+ }; _6 c2 t7 ]9 i! n J! a. \3 l! d: f" x
2. 如果与一个合理的纪元有绝对多数的联系,那么一个纪元就是合理的。 % d; q2 P4 g% X2 t2 K% X+ l, u) D% A: O, {7 J7 B9 x; o+ K
3. 如果(1)纪元X是对齐的,并且(2)下一个纪元也是对齐的,且绝大多数链接的源是纪元X,则纪元X被最终确定。 . w' g! n7 h& Q1 U) G 6 k6 B# l1 a8 a4 V规则3略有简化(有更多的条件可以最终确定一个纪元,但它们对本讨论并不重要)。现在,让我们来看看大幅削减的条件。大幅削减证明有两条规则。两者都比较一对证明V和W: / K/ p$ k1 ?' [6 R" H7 y5 m+ R( u" {& r; f7 c
1. 如果V和W的目标是相同的纪元(即相同的高度),但它们不投票给相同的检查点(双重投票),则它们是可以砍掉的。6 v2 D; Z, S2 d! _
# s) u: f7 E" d' N, m% w/ j" c4 F2. 这意味着(1)V的源早于W的源和(2)V的目标晚于W的目标(环绕投票)。 9 f3 g4 B1 @% p4 v. A5 e* m- n 6 E9 ]8 d' n/ B! K6 U$ U: l& O第一个条件是显而易见的:它防止简单地投票给同一高度的两个不同的链。但是第二个条件有什么作用呢?4 u( m, ~6 Y, \2 r- k F
" `$ P) y W3 I
它的功能是削减参与最终确定两个冲突链的所有验证器(这永远不应该发生)。要了解原因,让我们再次查看我们的场景3,在最糟糕的情况下,有错误的客户端占绝对多数(>2/3的质押)。当它继续投票给有故障的链时,它将最终确定具有无效块的纪元,如下所示:1 P5 }0 J9 k1 E) B R% L2 N
- R/ Q/ k; x! X , O5 G* e- b$ a3 b - S2 ^8 X( R3 f" c# O& g- w这张图片中的圆角方框代表的是纪元,而不是区块。绿色箭头是所有验证器创建的最后一个超级多数链接。红色箭头是仅由有错误的客户端支持的超级多数链接。正常工作的客户端忽略带有无效区块(红色)纪元。第一个红色箭头将证明无效的纪元是正确的,第二个箭头将确定无效纪元。 & `7 J% p2 Y4 A+ t6 b 4 T: s4 ]1 w: ^% A现在让我们假设错误已经修复,并且最终确定无效纪元的验证器想要重新加入正确的链B。为了能够终止链,第一步是调整纪元X: : z% c; z `: W* o; D ( p0 a4 @2 M: ?- k6 r3 I6 f" u( i3 T! n 1 {& b V& \3 b: Q2 |' y' r% U: U7 x 0 k" D$ g) b6 G+ `7 E然而,为了参与纪元X的调整(它需要一个由虚线绿色箭头指示的绝对多数链接),他们将不得不“跳过”第二个红色箭头--那个最终确定无效纪元的箭头。投票支持这两个链接是一种可以砍掉的进攻。5 D1 M: T/ e m6 y
: O4 j# l) c# U9 j! o4 L m+ P4 c对于任何后来的时代来说,这一点都将继续适用。修复它的唯一方法是通过二次无活动泄漏:随着链B的增长,锁定的验证器将泄漏他们的资金,直到链B可以被正常工作的客户端证明合理并最终确定为止。5 G) I% t4 S( ~2 s C; e- X0 A) Z