标题: 以太坊合并:请自行承担运行多个客户端的后果! [打印本页] 作者: lzqandly 时间: 2022-5-31 23:43 标题: 以太坊合并:请自行承担运行多个客户端的后果! 出于安全性和活跃性的考虑,Etherum选择了多客户端架构。为了鼓励质押者将他们的设置多样化,对相关的失败处罚更高。所以,运行少数客户端的质押者通常只会在客户端出现错误的情况下损失适度的金额,但运行多个客户端可能会导致全盘亏损。因此,负责任的质押者应该着眼于客户端环境,而选择一个不太受欢迎的客户端。. S9 `/ w. `( ?) M
+ U, G/ T0 `" w" p2 s0 O( X s
为什么我们需要多个客户端?: k/ [+ F8 W9 r: F
; e2 E( Y3 I( y4 q) a6 ]* l
对于为什么单一客户端体系的结构更可取是存在争议的。而开发多个客户端会产生相当大的开销,这就是为什么我们没有看到任何其他区块链网络认真地追求多客户端选项的原因。 + S0 Z. A1 w2 u! e. s' X& s/ V3 W! I L3 m3 `8 E& A
那么,为什么Etherum的目标是成为多客户端?客户端是非常复杂的代码片段,很可能包含错误。其中最糟糕的是所谓的“共识错误”,即区块链核心状态转换逻辑中的错误。一个经常被引用的例子是所谓的“无限货币供应”漏洞,在这个漏洞中,有漏洞的客户端接受打印任意数量的以太的交易。如果有人发现了这样的漏洞,但在他们到达出口之前没有被阻止(即通过混合器或交易所来利用资金),这将导致Ether的价值大幅崩溃。% W0 I! D7 y9 t, e% N- x$ M
4 W) |. X" N7 K7 |# j6 B
如果每个人都运行相同的客户端,停止需要人工干预,因为链、所有智能合约和交易所都将照常运行。即使是几分钟的时间也足以执行一次成功的攻击,并充分分散资金,使其不可能只回滚攻击者的交易。根据打印的ETH数量,社区可能会协调将链回滚到利用漏洞之前(在识别并修复错误之后)。0 r% B4 h8 S- r2 {$ `; X
- s0 o5 w; q: a* B$ g" Y0 T9 x
现在,让我们来看看当我们有多个客户端时会发生什么。有两种可能的情况: T% R& H# w8 U+ E8 B$ a
6 w! k9 g9 o7 h" t8 b4 m1. 有漏洞的客户端只占不到50%的质押份额,客户端将使用利用该错误的事务生成一个块,打印ETH,让我们称这条链为A。 8 @+ I4 g+ V6 [# x2 J+ y- a% R$ x7 h2 W& `' d1 G
然而,运行无故障客户端的大多数质押将忽略此块,因为它是无效的(对他们来说,打印ETH操作就是无效的)。它们将构建不包含无效块的备用链B。3 `( O4 |. m9 s6 F9 z
7 l9 a( N1 z5 T( E$ ~! [7 n4 @
由于正确的客户端占多数,B链将积累更多的证明。因此,即使是有问题的客户端也会投票给链B;结果就是链B将积累100%的选票,链A将死亡。链条将继续,就像错误从未发生过一样。 ( e5 p* r Y3 k. x6 N- T % ^4 w+ U- }/ t& K! _" O. `1 j2. 大部分质押份额使用的是有问题的用户端,在这种情况下,链A将积累多数选票。但是,由于B拥有不到50%的所有证明,违规的客户端将永远看不到从链A切换到链B的理由。因此,我们将看到链分裂。& M& B; T- I, Y3 E
# s. X' j1 u' q& s! s
" a' k* u# a/ }' c. _
! g$ m( A1 a- M' ~" z& _/ V情况 1 是最理想的情况。因为这很可能会导致一个孤立的块,而大多数用户甚至都不会注意到。开发人员则可以调试客户端,修复错误,一切安好。相反,案例 2 显然不那么理想。但仍然比只有一个客户端的情况要好--大多数人会很快检测到链条分裂(您可以通过运行多个客户端自动完成这一点),交易所会迅速暂停存款,Defi用户可以在分裂解决时谨慎行事。基本上,与单客户端体系结构相比,这仍然给我们提供了一个闪烁的红色警示灯,从而免受最坏结果的影响。 + r, G7 ~! c, P& W/ h4 B8 h; K5 y/ b- p% Y" }! o( T+ {9 S
如果有错误的客户端由超过2/3的质押运行,情况2将会更糟。在这种情况下,它将最终确定无效的链。稍后会详细介绍这一点。, p' C) ^1 g$ j8 S: \' i
4 k) g' Z6 j, i1 b0 U
一些人认为链分裂是如此灾难性,以至于它本身就是单客户端体系结构的一个论点。但请注意,链分裂只是因为客户端中的错误而发生的。对于单个客户端,如果您希望修复此问题并将链恢复到原来的状态,则必须回滚到错误发生之前的块-这与链分裂一样糟糕!因此,尽管链拆分听起来很糟糕,但在客户端存在关键错误的情况下,它实际上是一个功能,而不是一个错误。至少你可以看到有些地方出了严重的问题。 & [; ^. q' c; H8 R 0 Y/ i" V: I* H9 q8 j/ i* ^7 v激励客户端多样性:反相关性惩罚 5 @8 p2 Q' B" Z8 W! c2 H; E! X9 F: @9 V- P/ L' ~- {0 O
如果质押分散在多个客户端,最好的情况是每个客户端拥有不到总质押的三分之一,这显然对网络有利。这将使其对任何单个客户端中的错误具有弹性。但质押者为什么会在乎呢?如果网络没有任何激励措施,他们就不太可能承担转向少数派客户端的成本。 6 U! Q6 M0 U8 M }7 y 9 c5 X# v0 T0 n: F$ C) ^不幸的是,我们不能让奖励直接依赖于验证器运行的客户端。没有不能被欺骗的客观方法来衡量这一点。. b! D {% E. E
r% L& m, ^8 `) T: S* f
然而,当您的客户端有错误时,您无法隐藏。这就是反相关惩罚的用武之地:其思想是,如果您的验证器做了一些不好的事情,那么如果更多的验证器几乎在同一时间犯了错误,那么惩罚就会更高。换句话说,你会因为相关的失败而受到惩罚。 z% s6 { p! ?, _* f7 e% O+ ^, i( j, G1 F# E& t* K+ w
在以太,你目前可能会因为两种行为而被砍掉: 0 @% X9 t% P# s% A+ K7 `; e 1 [( x$ M6 Z# D" Z" l: E5 R" K8 o1. 在相同高度的两个区块上签名。" u9 m2 f/ Y$ v5 e r8 K- |2 E' g
, L) ]2 ^0 \( j5 ^2. 创建一对可删减的证明(环绕投票或双倍投票)。. ~6 _1 |) N% R. X+ F$ I+ j" x
8 T2 J0 j( k' d; l# R; G! W1 @
当你被大幅削减时,你通常不会失去所有的资金。在撰写本文时(Altair Fork),默认惩罚实际上非常小:您只会损失0.5ETH,或您所赌注的以太的1.5%(最终将增加到1ETH或3%)。 , E4 M; I8 T! j- t- S5 N/ D0 ]$ Q* F( {$ X7 `7 C( H
然而,有一个问题:还有一个额外的惩罚,它取决于在您的验证器被砍掉之前和之后的4096个时期(18天)内发生的所有其他砍掉。你被进一步处罚的金额与这段时间内被削减的总金额成比例。4 G6 D. G4 n x8 t7 Q; {
7 W3 y. j+ {4 k' P这可能是比最初的惩罚要大得多的惩罚,目前(Altair 分叉)它的设置是,如果超过一半的全部质押余额在这段时间内被削减,那么你将失去所有的资金。最终,这将被设置为:如果其他验证者的1/3被砍掉,您将失去所有质押。之所以选择1/3,是因为产生共识失败而必须模棱两可的最小权益数量。, M* F% K. Z" @9 X7 `5 }; g1 t, G3 M
9 |. u: Q6 k' `% u! \9 d M& O" z& l3 i4 n/ ~6 r
, {& o( S3 o: @7 h4 r% D d
另一个反相关性惩罚:二次无活动泄漏 ! r \3 c/ u: f' L: B - I' i- L% d* y& K验证器失败的另一种方式是离线,同样,这是有惩罚的,但其机制非常不同。我们不称之为削减,而且通常很小:在正常操作下,离线的验证器受到的惩罚与他们在完全验证时将获得的惩罚相同。在撰写本文时,这是每年4.8%的增长率。如果您的验证器有几个小时或几天处于离线状态,例如由于临时的互联网中断,那么可能不值得出一身冷汗。 * Y% |. i& B s. g: e+ r9 d4 V! Y; l/ `8 ^! @+ Y' l- c
当超过1/3的验证器处于离线状态时,情况会变得非常不同。然后,信标链无法最终敲定,这威胁到协商一致议定书的一个基本属性,即活跃性。* n& b/ [6 M% { y2 e
$ @# h: v) M5 r, g* \为了在这样的情况下恢复活力,所谓的 “ 二次无活动泄漏 ” 开始发挥作用。如果验证器在链未完成时继续脱机,则总罚款额随时间呈二次曲线上升。最初是非常低的;大约4.5天后,离线验证者将失去1%的质押。然而,它在~10天后增加到5%,在~21天后增加到20%(这是Altair 的值,未来将翻一番)。6 R v/ U/ U* Q% x+ Q: H- _
" Q0 N* ~! M* a+ T6 f0 T- C: V; I
/ J/ j' g5 i' F
; p9 c, k& c9 N, |
该机制的设计是为了在发生导致大量验证器操作失效的灾难性事件的情况下,链最终能够再次完成。随着离线验证器失去越来越多的质押,他们在总质押中的份额将越来越小,当他们的质押降至1/3以下时,剩余的在线验证器获得所需的2/3多数,从而使他们能够最终确定链。: x' O9 H4 f% |! k& E
; }: g6 o( G# W" e F( e
然而,还有另一种情况与此相关:在某些情况下,验证器不能再投票给有效链,因为它们意外地将自己锁定在无效链中,下面是关于这一点的更多信息。3 ~, q% [& e5 }& K% n: w: O* ~) g& k
2 u! q& T+ K& O* w z5 a6 {运行多数用户端有多糟糕?& t( B' \( ]5 U. e7 v [
5 y. e/ d1 x/ f为了了解危险是什么,让我们来看看三种失败类型:+ U! c4 F: [0 a [# X q2 j
+ K1 n4 f x$ V0 _8 U/ P- T {
1. 大规模削减事件:由于错误,大多数客户端验证器签署了可大幅削减的证明。 1 i `7 N# S7 k) Z 0 P, I( K2 u, l- m4 |2. 大量离线事件:由于错误,所有多数客户端验证器都离线。: w2 D2 p" i1 \7 N
3 i1 V; {+ j7 b- a! }2 l, g$ c: Z3. 无效区块事件:由于错误,多数用户端验证器都证明存在无效块。9 r5 Y4 O O' _/ o3 [4 m$ O
- M( W5 u6 B# e2 t t- ]3 }
还可能发生其他类型的大规模失败和砍杀,但我仅限于与客户端错误相关的错误(在选择运行哪个客户端时应该考虑这些错误)。; i2 i* Q- N! z6 N" k
7 g& J2 L# P: ~, A2 K2 m, r
场景1:双重签名 6 ^0 `9 l! b" y% H 6 M9 ~; S, }6 f* v9 w; M2 Q( R; d q3 N这可能是大多数验证器操作员最害怕的场景:导致验证器客户端签署可删除证明的错误。一个例子是两个证明人投票给相同的目标时期,但具有不同的有效负载。因为这是一个客户端错误,所以关注的不只是一个质押者,而是运行这个特定客户端的所有质押者。一旦发现这些含糊其辞行为,这将是一场大屠杀:所有相关的质押者都将失去100%的质押资金。这是因为我们正在考虑多个客户端:如果相关客户端的质押比例只有10%,那么“只有”20%的质押比例将被削减(在Altair;30%,并设定最终的处罚参数)。- Y) T( n2 d& M' u3 G5 i- Q! X
' w5 E& O. R8 T在这种情况下,损害显然是极端的,但我也认为极不可能。可删除证明的条件很简单,这就是为什么构建验证器客户端(VCs)来强制执行它们的原因。验证器客户端是一个很小的、经过良好审核的软件,这种规模的漏洞不太可能出现。, n1 ^0 B; F# K+ S8 c
& D: }# H5 Q- g* B* ]7 B! I
到目前为止,我们已经看到了一些削减,但据我所知,所有这些都是由于操作员故障-几乎所有这些都是由于操作员在几个位置运行相同的验证器造成的。由于这些都不相关,因此削减的金额很小。0 v' ]) ~2 F) e5 s& p
2 o6 c6 g% a c总而言之,在接下来的几年里,我们不太可能看到对无效块和/或对它们的证明进行直接惩罚。 7 T2 U, l6 O1 E, E- S7 k$ g4 {/ p 8 ^# V2 o2 {) K. A; b, y7 ?) g附录2:为什么有缺陷的客户端在最终确定链A后不能切换到链B? , b* C9 Z& Q5 \# d+ {+ c t6 c: s P3 ]" N1 o" ^
这一节是为那些想要更详细地了解为什么有错误的客户端不能简单地切换回来而不得不遭受可怕的无活动泄漏的人而设计的。为此,我们必须看看Casper FFG最终确定是如何工作的。 6 R; S! ?8 Y$ { 6 b2 c6 `( i0 E每个证明都包含一个源检查点和一个目标检查点。检查站是一个纪元(Epoch)的第一个区块。如果存在从一个纪元到另一个纪元的链接,而该链接的投票总数超过所有利害关系的2/3(即,有如此多的证明,其中第一个检查点为“源”,第二个检查点为“目标”),则我们将其称为“超级多数链接”。4 |) n- _' U w6 Y5 E
0 h8 z( K" U1 c5 y. ~1 A& \* B一个纪元可以是“合理的”,也可以是“确定的”,它们的定义如下:, k7 `" v$ W: F F6 k& _
0 m3 W, W6 J$ Q( p0 h3 X
1. 纪元0是对齐的。) o; O# R$ d$ T3 c
& j# f) U: ~+ f+ S+ m* G: A2. 如果与一个合理的纪元有绝对多数的联系,那么一个纪元就是合理的。+ x7 O3 z0 ] D# M3 i6 E. z
+ f1 c+ z5 w5 U; [5 z: D Z: M
3. 如果(1)纪元X是对齐的,并且(2)下一个纪元也是对齐的,且绝大多数链接的源是纪元X,则纪元X被最终确定。 ' y' e g9 k8 O9 q% @- Q5 G& L2 q5 k% v6 P
规则3略有简化(有更多的条件可以最终确定一个纪元,但它们对本讨论并不重要)。现在,让我们来看看大幅削减的条件。大幅削减证明有两条规则。两者都比较一对证明V和W:3 c; k: F9 b, {
$ O8 a/ b3 Z0 `8 x
1. 如果V和W的目标是相同的纪元(即相同的高度),但它们不投票给相同的检查点(双重投票),则它们是可以砍掉的。 " Q8 f4 m! a0 P " Y& p! k1 S, p; w2. 这意味着(1)V的源早于W的源和(2)V的目标晚于W的目标(环绕投票)。 ; j+ P+ ~; T% r% R5 Z% @4 O- }0 v( \* d3 k
第一个条件是显而易见的:它防止简单地投票给同一高度的两个不同的链。但是第二个条件有什么作用呢?: _. E. E3 k8 G
8 h% i0 N9 m, W/ I4 f: N它的功能是削减参与最终确定两个冲突链的所有验证器(这永远不应该发生)。要了解原因,让我们再次查看我们的场景3,在最糟糕的情况下,有错误的客户端占绝对多数(>2/3的质押)。当它继续投票给有故障的链时,它将最终确定具有无效块的纪元,如下所示: 4 S, A1 B- K3 x0 ~6 @& Y# b' a2 ?9 t! v4 }8 i
. u. |( X' g; E4 _( n$ }7 d 5 y/ O$ o( A0 t9 K$ v7 Z1 }% y! O这张图片中的圆角方框代表的是纪元,而不是区块。绿色箭头是所有验证器创建的最后一个超级多数链接。红色箭头是仅由有错误的客户端支持的超级多数链接。正常工作的客户端忽略带有无效区块(红色)纪元。第一个红色箭头将证明无效的纪元是正确的,第二个箭头将确定无效纪元。" }7 n( m+ R. p4 H
8 @* A1 J) l0 q. }. P6 t
现在让我们假设错误已经修复,并且最终确定无效纪元的验证器想要重新加入正确的链B。为了能够终止链,第一步是调整纪元X: f3 Y$ I) G) K, \/ }) K/ E
1 t4 ~: N3 I- K) e) Z * `% v/ [' i7 @, o4 H0 T( S% V# e- u# j% j% [* n
然而,为了参与纪元X的调整(它需要一个由虚线绿色箭头指示的绝对多数链接),他们将不得不“跳过”第二个红色箭头--那个最终确定无效纪元的箭头。投票支持这两个链接是一种可以砍掉的进攻。4 |% ] _( S" w i
2 k( H! V4 i1 m S! e9 K$ b, d
对于任何后来的时代来说,这一点都将继续适用。修复它的唯一方法是通过二次无活动泄漏:随着链B的增长,锁定的验证器将泄漏他们的资金,直到链B可以被正常工作的客户端证明合理并最终确定为止。- L/ S/ E8 a H, j$ S' I
; x. M+ n8 e" A) h v