* J& E3 Q' s6 `1 t! D& R4 }9 E" a现在,让我们来看看当我们有多个客户端时会发生什么。有两种可能的情况: ! y! T2 C4 B- G/ B8 _( e/ t + w- P9 |& x7 Y5 z/ Y1. 有漏洞的客户端只占不到50%的质押份额,客户端将使用利用该错误的事务生成一个块,打印ETH,让我们称这条链为A。 / J6 a) W/ y- z. R2 Q 5 U3 u- B9 f' D, i然而,运行无故障客户端的大多数质押将忽略此块,因为它是无效的(对他们来说,打印ETH操作就是无效的)。它们将构建不包含无效块的备用链B。" i2 ?# W0 E5 t' o V, t
/ V5 u X4 P4 a7 [! ?; X1 n由于正确的客户端占多数,B链将积累更多的证明。因此,即使是有问题的客户端也会投票给链B;结果就是链B将积累100%的选票,链A将死亡。链条将继续,就像错误从未发生过一样。; x1 Q: F% S1 K
0 s( j4 y* N2 t$ b# F: |- @! u9 H
2. 大部分质押份额使用的是有问题的用户端,在这种情况下,链A将积累多数选票。但是,由于B拥有不到50%的所有证明,违规的客户端将永远看不到从链A切换到链B的理由。因此,我们将看到链分裂。* |, ~4 F& ~+ F
" @* u) ^$ m. H( e( K o3 I
. z, W# J8 R% b; v
5 Z, P& v1 c0 O# k* ?& p* i2 E情况 1 是最理想的情况。因为这很可能会导致一个孤立的块,而大多数用户甚至都不会注意到。开发人员则可以调试客户端,修复错误,一切安好。相反,案例 2 显然不那么理想。但仍然比只有一个客户端的情况要好--大多数人会很快检测到链条分裂(您可以通过运行多个客户端自动完成这一点),交易所会迅速暂停存款,Defi用户可以在分裂解决时谨慎行事。基本上,与单客户端体系结构相比,这仍然给我们提供了一个闪烁的红色警示灯,从而免受最坏结果的影响。 4 ]0 i( z) f* f- u ' @0 d( b" t3 w8 i& k如果有错误的客户端由超过2/3的质押运行,情况2将会更糟。在这种情况下,它将最终确定无效的链。稍后会详细介绍这一点。 ) H1 i. w) [$ m; U- Y! b1 R1 C8 J; ~4 x, x% u/ t: `1 \5 H
一些人认为链分裂是如此灾难性,以至于它本身就是单客户端体系结构的一个论点。但请注意,链分裂只是因为客户端中的错误而发生的。对于单个客户端,如果您希望修复此问题并将链恢复到原来的状态,则必须回滚到错误发生之前的块-这与链分裂一样糟糕!因此,尽管链拆分听起来很糟糕,但在客户端存在关键错误的情况下,它实际上是一个功能,而不是一个错误。至少你可以看到有些地方出了严重的问题。 : h1 }* E) g6 H6 U y2 t 0 E; j" ?" K, D激励客户端多样性:反相关性惩罚6 @% W) d& R( {( V* I! i
5 \( e' X" J6 L如果质押分散在多个客户端,最好的情况是每个客户端拥有不到总质押的三分之一,这显然对网络有利。这将使其对任何单个客户端中的错误具有弹性。但质押者为什么会在乎呢?如果网络没有任何激励措施,他们就不太可能承担转向少数派客户端的成本。+ [! _8 _, R: Z. T+ O" {, m
; H [( p5 N9 P该机制的设计是为了在发生导致大量验证器操作失效的灾难性事件的情况下,链最终能够再次完成。随着离线验证器失去越来越多的质押,他们在总质押中的份额将越来越小,当他们的质押降至1/3以下时,剩余的在线验证器获得所需的2/3多数,从而使他们能够最终确定链。3 ?+ {% m" }9 L
5 Y3 B7 M( t, t. l6 ?; {: x1 C
然而,还有另一种情况与此相关:在某些情况下,验证器不能再投票给有效链,因为它们意外地将自己锁定在无效链中,下面是关于这一点的更多信息。7 N( J7 N' I) G$ S! a. a
/ p: @4 P2 l! `% L3 G# ^2 t运行多数用户端有多糟糕?* p/ U7 q' z$ `
7 P) R/ x* F! j( y# |- b0 ^
为了了解危险是什么,让我们来看看三种失败类型:, z& \/ g& {3 S) U& j
; z# e( Z6 B, i7 C
1. 大规模削减事件:由于错误,大多数客户端验证器签署了可大幅削减的证明。 ( l7 P2 U' f, n7 O , G9 D) j" I/ k$ P( p. h$ C2. 大量离线事件:由于错误,所有多数客户端验证器都离线。" H7 j5 U7 g' E" U! v
6 F7 g- S& W. j, F7 H+ [9 b& u
3. 无效区块事件:由于错误,多数用户端验证器都证明存在无效块。 % _7 p5 N0 p" e& k ) X: d8 P f! ?# H" @还可能发生其他类型的大规模失败和砍杀,但我仅限于与客户端错误相关的错误(在选择运行哪个客户端时应该考虑这些错误)。 M2 j9 V$ m' ?* V. o% @" w
; w" W* Y, P* r& P8 z
场景1:双重签名 2 x* d' X$ i7 R6 Q& i! x4 {+ O 0 o$ N6 Q, \+ L这可能是大多数验证器操作员最害怕的场景:导致验证器客户端签署可删除证明的错误。一个例子是两个证明人投票给相同的目标时期,但具有不同的有效负载。因为这是一个客户端错误,所以关注的不只是一个质押者,而是运行这个特定客户端的所有质押者。一旦发现这些含糊其辞行为,这将是一场大屠杀:所有相关的质押者都将失去100%的质押资金。这是因为我们正在考虑多个客户端:如果相关客户端的质押比例只有10%,那么“只有”20%的质押比例将被削减(在Altair;30%,并设定最终的处罚参数)。1 O9 H8 ~! \) [3 p( [8 d
2 j x. ^$ p9 S* W4 A. C* r1 `+ u在这种情况下,损害显然是极端的,但我也认为极不可能。可删除证明的条件很简单,这就是为什么构建验证器客户端(VCs)来强制执行它们的原因。验证器客户端是一个很小的、经过良好审核的软件,这种规模的漏洞不太可能出现。 / u! H: \: [( E3 a - G. ]- d% d# y/ d到目前为止,我们已经看到了一些削减,但据我所知,所有这些都是由于操作员故障-几乎所有这些都是由于操作员在几个位置运行相同的验证器造成的。由于这些都不相关,因此削减的金额很小。$ q0 ?( d, y+ D! Y) b9 f
9 ]" o" v0 T3 ?5 N) j a
场景2:大规模离线活动% x6 P+ _4 P) o: o) [! z: V/ y( t2 ]
$ t6 P3 \/ q6 G
对于此场景,我们假设大多数客户端有一个错误,当触发该错误时,会导致客户端崩溃。有问题的块已经被集成到链中,每当客户端遇到该块时,它就会离线,从而无法进一步参与协商。大多数客户端现在处于离线状态,因此开始出现非活动泄漏。) J7 e. ]$ }4 G/ ]! p
. \0 S4 P; ]' h3 k) p0 f+ G
客户端开发人员将争先恐后地将一切重新组合在一起。现实地说,在几个小时内,最多几天,他们将发布一个错误修复程序,以消除崩溃。 * I1 X$ w5 W ~- ?5 z " x, K7 B3 O. O8 H& X3 c与此同时,订货商也可以选择简单地切换到另一个客户端。只要这样做足以让超过2/3的验证器在线,二次无活动泄漏就会停止。在有错误的客户端得到修复之前,这并不是不可能发生。 - i! [+ K* r0 o: |0 S! N 9 P+ z) f: J5 l# {. t+ o这种情况并不是不可能(导致崩溃的错误是最常见的类型之一),但总的惩罚可能不到受影响质押的1%。; P% h# Y/ C$ i: J2 g. b7 m
& E# e6 e; h/ U) s3 t% b N- ]4 }
场景3:无效数据区块! F9 i* N/ ]& V8 V
; F' B# z" ^. s" T3 d& n R9 d- m7 @# T, i4 m" p7 A
考虑到这一点,到目前为止最优先的是情景3。当一个客户端处于三分之二的绝对多数时,影响是相当灾难性的,这也是一个相对可能的情景。为了强调这样的漏洞很容易发生,最近在Kiln Testnet上发生了这样的错误(参见Kiln Testnet阻止提案失败)。在这种情况下,Prysm在提出后确实检测到了积木有缺陷,并且没有证明这一点。如果Prysm认为该阻塞有效,并且这种情况发生在Mainnet上,那么我们处于场景3的情况3中描述的灾难性情况-因为Prysm目前在Mainnet拥有2/3的多数。因此,如果你目前正在运营Prysm,那么你可能会损失所有资金,这是一个非常真实的风险,你应该考虑更换客户端。, U& N( W' B. }/ m. B/ q, P/ j: ^
8 `1 D, |) v* V/ o- J) m情景1可能是人们最担心的,得到的评级相对较低。这样做的原因是,我认为发生这种情况的可能性相当低,因为我认为Validator客户端软件在所有客户端上都实现得很好,它不太可能生成可倾斜的证明或块。4 [: B: O2 u1 o- L& Y1 j
+ E: k1 w! s% N" Q& v
如果我目前运行的是多个客户端,并且我担心切换,我还有什么选择?$ ?. n J6 D5 H
; \: R8 h( b+ g+ \; X, `
更换客户端可能是一项重大任务,这也伴随着一些风险。如果斜切数据库未正确迁移到新设置,该怎么办?可能会有被砍掉的风险,这完全违背了目的。5 n/ w5 y* q; H F. s( U
3 a: s q0 T4 T- i
我会向任何担心这一点的人建议另一种选择。也可以让您的验证器设置保持原样(不需要取出密钥等),并且只切换信标节点。这是非常低的风险,因为只要验证器客户端按预期工作,它就永远不会重复签名,因此不能被砍掉。特别是如果您有大型操作,其中更改验证器客户端(或远程签名者)基础设施将非常昂贵,并且可能需要审核,这可能是一个很好的选择。如果设置的性能不如预期,也可以很容易地切换回原始客户端,或者尝试其他少数客户端。 : y, l2 D" G2 c i8 K * x9 t2 {8 c' W* @好消息是,在切换信标节点时,您几乎不用担心:它对您造成的最坏影响就是暂时脱机。这是因为信标节点本身永远不能自己产生可切削消息。如果您运行的是少数派客户端,则不可能最终进入场景3,因为即使您投票支持无效的区块,该区块也不会获得足够的票数来最终确定。. q9 j% K7 L! W( o# r
5 T1 ^. Y6 c- ?2 L8 w5 P" @/ J那被惩罚客户端的呢? X& i' B. y! x2 F5 F
: c% K7 S v9 W事实上,我们不这么做的原因有两个--一个是我们目前不能这么做,但即使我们可以,我们也很可能不会这么做: 6 I9 K1 }+ ~, Z- r/ U ! w8 P9 @6 G% j1. 目前,几乎不可能对无效数据块引入惩罚(“大幅削减”)。这是因为信标链和执行链目前都不是 “ 无状态 ” ——即为了检查区块是否有效,您需要一个大小为100s MB(信标链)或GB(执行链)的上下文(“状态”)。这意味着没有 “ 简明的证据 ” 来证明区块是无效的。我们需要这样的证据来削减验证器:“削减”验证器的块需要包括验证器已经犯法的证据。在没有无国籍共识的情况下,有一些方法可以绕过这个问题,但它将涉及更复杂的结构,如多轮欺诈证据,如Arbitrum目前用于汇总的证据。 i6 k, | j u$ m+ Q( ^% B5 T/ Y- Z7 M. c% K1 r7 c
2. 我们可能不那么急于引入这种类型的削减的第二个原因是,即使我们可以这样做,也是因为产生无效块比目前的削减条件更难防止。目前的条件非常简单,验证器客户端只需几行代码就可以轻松地进行验证。这就是为什么我认为上面的情景1不太可能--到目前为止,可删减的消息只是由运营商的失误产生的,我认为这种情况可能会继续下去。添加用于产生无效区块(或证明它们)的斜切会增加投币者的风险。现在,即使是那些经营少数派客户端的人也可能面临严重处罚。 ' M; ?8 j+ H; i* }$ d: T0 J& h- y+ E9 s4 W1 E4 P% n2 G+ a
总而言之,在接下来的几年里,我们不太可能看到对无效块和/或对它们的证明进行直接惩罚。 + E' T0 |" g! `1 n( l ( P% z$ M4 S, ]! t- f/ [附录2:为什么有缺陷的客户端在最终确定链A后不能切换到链B? 4 P! ?$ E8 T; M7 F O/ }0 \/ p+ b2 _' N
这一节是为那些想要更详细地了解为什么有错误的客户端不能简单地切换回来而不得不遭受可怕的无活动泄漏的人而设计的。为此,我们必须看看Casper FFG最终确定是如何工作的。 " r' B4 A# Q& _- \+ ` C0 f B* j: n3 P' K8 u: G
每个证明都包含一个源检查点和一个目标检查点。检查站是一个纪元(Epoch)的第一个区块。如果存在从一个纪元到另一个纪元的链接,而该链接的投票总数超过所有利害关系的2/3(即,有如此多的证明,其中第一个检查点为“源”,第二个检查点为“目标”),则我们将其称为“超级多数链接”。0 J5 p) Q: E8 n& _
& M( ^" L# f3 `, x一个纪元可以是“合理的”,也可以是“确定的”,它们的定义如下:& M9 F( ?: F7 m# \2 j- g
|* B% n3 p N( i+ ^0 F0 l0 `9 g
1. 纪元0是对齐的。5 Y7 w. D9 C0 |+ ]5 B7 j, d
$ u( v/ D x3 ~7 n2 N2. 如果与一个合理的纪元有绝对多数的联系,那么一个纪元就是合理的。0 L* y1 R( m* G2 @* M i
6 ]3 `) p9 `2 X0 F# D
3. 如果(1)纪元X是对齐的,并且(2)下一个纪元也是对齐的,且绝大多数链接的源是纪元X,则纪元X被最终确定。 6 w" |6 t. b9 r 6 E' N) Z' o' K4 |6 ]! b& S规则3略有简化(有更多的条件可以最终确定一个纪元,但它们对本讨论并不重要)。现在,让我们来看看大幅削减的条件。大幅削减证明有两条规则。两者都比较一对证明V和W:7 r! j9 y: F. F
8 I, P0 y/ U9 g! K K: k3 B( Y1. 如果V和W的目标是相同的纪元(即相同的高度),但它们不投票给相同的检查点(双重投票),则它们是可以砍掉的。. U& k0 y' M" D7 L2 Q8 H
, \4 K' C6 D) ^; n
2. 这意味着(1)V的源早于W的源和(2)V的目标晚于W的目标(环绕投票)。$ E2 o: d* K* a8 p, V
. X, {0 k/ x8 Y0 F7 |
第一个条件是显而易见的:它防止简单地投票给同一高度的两个不同的链。但是第二个条件有什么作用呢?9 A* S) E, z2 h7 } N8 \* J* R R
: W) ~2 f9 x ^2 Z
它的功能是削减参与最终确定两个冲突链的所有验证器(这永远不应该发生)。要了解原因,让我们再次查看我们的场景3,在最糟糕的情况下,有错误的客户端占绝对多数(>2/3的质押)。当它继续投票给有故障的链时,它将最终确定具有无效块的纪元,如下所示:( Z1 I9 q" ^/ F
+ \) d! \8 h1 g I2 f3 C, @. p. u6 [# B7 k5 Y2 y8 n0 `
* R d' V, [. k) d$ N5 M2 c
这张图片中的圆角方框代表的是纪元,而不是区块。绿色箭头是所有验证器创建的最后一个超级多数链接。红色箭头是仅由有错误的客户端支持的超级多数链接。正常工作的客户端忽略带有无效区块(红色)纪元。第一个红色箭头将证明无效的纪元是正确的,第二个箭头将确定无效纪元。: g M1 M" m* L4 C6 l/ o
3 _) ~5 s% |4 j0 L0 S! W! s0 f
现在让我们假设错误已经修复,并且最终确定无效纪元的验证器想要重新加入正确的链B。为了能够终止链,第一步是调整纪元X:, l) g- l% w }- Q3 ~0 t
& ^4 M @ F9 ]! T( m
4 q$ V0 d& W( E
# |( i$ ], R; [4 F; P
然而,为了参与纪元X的调整(它需要一个由虚线绿色箭头指示的绝对多数链接),他们将不得不“跳过”第二个红色箭头--那个最终确定无效纪元的箭头。投票支持这两个链接是一种可以砍掉的进攻。 : x0 B3 V6 J2 J$ U: Z ) K# v8 }/ q. N$ }/ w6 y" P对于任何后来的时代来说,这一点都将继续适用。修复它的唯一方法是通过二次无活动泄漏:随着链B的增长,锁定的验证器将泄漏他们的资金,直到链B可以被正常工作的客户端证明合理并最终确定为止。2 N$ f7 ^5 a& } Q: {2 a