% [/ h3 p" Y6 ], b' `+ P' \+ P如果有错误的客户端由超过2/3的质押运行,情况2将会更糟。在这种情况下,它将最终确定无效的链。稍后会详细介绍这一点。5 Y! s; L& P* s/ ~) D. E9 ]
9 i( I: @0 P* d5 U& [5 U0 j一些人认为链分裂是如此灾难性,以至于它本身就是单客户端体系结构的一个论点。但请注意,链分裂只是因为客户端中的错误而发生的。对于单个客户端,如果您希望修复此问题并将链恢复到原来的状态,则必须回滚到错误发生之前的块-这与链分裂一样糟糕!因此,尽管链拆分听起来很糟糕,但在客户端存在关键错误的情况下,它实际上是一个功能,而不是一个错误。至少你可以看到有些地方出了严重的问题。 . Q/ m, U1 ~" O" p b2 W- x. o; Z 1 H9 f9 {9 w' F激励客户端多样性:反相关性惩罚8 W M* y' O# k B4 c
. q& p' q3 Q& ~9 z
如果质押分散在多个客户端,最好的情况是每个客户端拥有不到总质押的三分之一,这显然对网络有利。这将使其对任何单个客户端中的错误具有弹性。但质押者为什么会在乎呢?如果网络没有任何激励措施,他们就不太可能承担转向少数派客户端的成本。9 r$ K+ d' H3 o- I
8 v- W5 q. M0 H0 r3 [不幸的是,我们不能让奖励直接依赖于验证器运行的客户端。没有不能被欺骗的客观方法来衡量这一点。# ` E* n7 H; W+ Y3 X5 R
) E& a. Y/ d- S6 ~
然而,当您的客户端有错误时,您无法隐藏。这就是反相关惩罚的用武之地:其思想是,如果您的验证器做了一些不好的事情,那么如果更多的验证器几乎在同一时间犯了错误,那么惩罚就会更高。换句话说,你会因为相关的失败而受到惩罚。2 g, V4 o0 p$ w+ Q' `: k0 J
% |# h- j) [8 U3 H H+ c% s0 J' K
在以太,你目前可能会因为两种行为而被砍掉:# `. o0 K0 Q5 p N2 x" `' z& m$ _- q
, k* W4 \$ A$ p! K
1. 在相同高度的两个区块上签名。 ' h- i2 i+ T. a% {. s3 y {+ M h ' o% r3 W+ t8 O z- F, H N. Z2. 创建一对可删减的证明(环绕投票或双倍投票)。 + i& V6 e3 c) i/ t0 t1 A* F1 j7 B3 s( j. g* |
当你被大幅削减时,你通常不会失去所有的资金。在撰写本文时(Altair Fork),默认惩罚实际上非常小:您只会损失0.5ETH,或您所赌注的以太的1.5%(最终将增加到1ETH或3%)。 4 ]5 X$ P" b$ y* t: [0 w6 s/ G' d+ o
然而,有一个问题:还有一个额外的惩罚,它取决于在您的验证器被砍掉之前和之后的4096个时期(18天)内发生的所有其他砍掉。你被进一步处罚的金额与这段时间内被削减的总金额成比例。6 Q" G* i3 E% M* F
; B" v' _/ p1 V2 I, F# Z这可能是比最初的惩罚要大得多的惩罚,目前(Altair 分叉)它的设置是,如果超过一半的全部质押余额在这段时间内被削减,那么你将失去所有的资金。最终,这将被设置为:如果其他验证者的1/3被砍掉,您将失去所有质押。之所以选择1/3,是因为产生共识失败而必须模棱两可的最小权益数量。, b/ b6 P% ?$ n$ K9 X
* n* K% k7 K( x4 D+ W+ W {) l3 s, y* |* v1 l ~" W
) O5 [7 \. \% U3 t另一个反相关性惩罚:二次无活动泄漏 ) ~7 P' u$ y8 d3 f. q% B, L8 z1 e y: {0 h# J/ A
验证器失败的另一种方式是离线,同样,这是有惩罚的,但其机制非常不同。我们不称之为削减,而且通常很小:在正常操作下,离线的验证器受到的惩罚与他们在完全验证时将获得的惩罚相同。在撰写本文时,这是每年4.8%的增长率。如果您的验证器有几个小时或几天处于离线状态,例如由于临时的互联网中断,那么可能不值得出一身冷汗。 8 c6 ~( l# t) F. Z% o3 I: ]" y2 O9 _; B/ \* `0 {; i/ [ G
当超过1/3的验证器处于离线状态时,情况会变得非常不同。然后,信标链无法最终敲定,这威胁到协商一致议定书的一个基本属性,即活跃性。: ]4 S' V% {' u. r
3 @! f; b6 F9 V# Q+ d: \为了在这样的情况下恢复活力,所谓的 “ 二次无活动泄漏 ” 开始发挥作用。如果验证器在链未完成时继续脱机,则总罚款额随时间呈二次曲线上升。最初是非常低的;大约4.5天后,离线验证者将失去1%的质押。然而,它在~10天后增加到5%,在~21天后增加到20%(这是Altair 的值,未来将翻一番)。 2 u3 A! k6 u/ ^" z5 Z3 t0 I ( G3 j8 n, E' C% S( |. T$ C! R+ w/ Q' i+ p, S4 n% O
8 M# E& \6 j% b
该机制的设计是为了在发生导致大量验证器操作失效的灾难性事件的情况下,链最终能够再次完成。随着离线验证器失去越来越多的质押,他们在总质押中的份额将越来越小,当他们的质押降至1/3以下时,剩余的在线验证器获得所需的2/3多数,从而使他们能够最终确定链。+ k, [' x' k& y2 v
L* f9 F d' E) p: Z
然而,还有另一种情况与此相关:在某些情况下,验证器不能再投票给有效链,因为它们意外地将自己锁定在无效链中,下面是关于这一点的更多信息。+ L; @( V% D& r; |
$ [; y( C, p9 G& h) f, Y0 D
运行多数用户端有多糟糕? 9 _% z7 I0 h- A( @7 L# K % z" b, @, B7 x! z* N. c为了了解危险是什么,让我们来看看三种失败类型: x* ?& Y0 q1 ~; [8 a) u% O/ t. K$ @- _9 a* R0 Y1 C$ v2 E* J
1. 大规模削减事件:由于错误,大多数客户端验证器签署了可大幅削减的证明。 - a$ q( g' Y7 m6 D7 v & A( F+ G$ {* D5 A. h7 k3 q2. 大量离线事件:由于错误,所有多数客户端验证器都离线。 " v0 b- [- E0 x) C, R/ K& s2 U3 o
3. 无效区块事件:由于错误,多数用户端验证器都证明存在无效块。, K; V. j, j2 y- c8 b2 I
{2 \, S& Y; \还可能发生其他类型的大规模失败和砍杀,但我仅限于与客户端错误相关的错误(在选择运行哪个客户端时应该考虑这些错误)。 * ^' X& q2 W# d, K/ }/ U' j6 c( g 6 [/ Q% I e( Y场景1:双重签名4 t2 i B& U* X1 A5 q+ W+ z
4 `+ D9 m; u/ }- ?这可能是大多数验证器操作员最害怕的场景:导致验证器客户端签署可删除证明的错误。一个例子是两个证明人投票给相同的目标时期,但具有不同的有效负载。因为这是一个客户端错误,所以关注的不只是一个质押者,而是运行这个特定客户端的所有质押者。一旦发现这些含糊其辞行为,这将是一场大屠杀:所有相关的质押者都将失去100%的质押资金。这是因为我们正在考虑多个客户端:如果相关客户端的质押比例只有10%,那么“只有”20%的质押比例将被削减(在Altair;30%,并设定最终的处罚参数)。 ( y( f. R0 x, L% r, f% }2 S* n2 B7 D: S& \+ C
在这种情况下,损害显然是极端的,但我也认为极不可能。可删除证明的条件很简单,这就是为什么构建验证器客户端(VCs)来强制执行它们的原因。验证器客户端是一个很小的、经过良好审核的软件,这种规模的漏洞不太可能出现。 4 q' W1 g! R8 S$ c$ ^& L* M0 ]5 W" u
到目前为止,我们已经看到了一些削减,但据我所知,所有这些都是由于操作员故障-几乎所有这些都是由于操作员在几个位置运行相同的验证器造成的。由于这些都不相关,因此削减的金额很小。 ) ^/ E( z! _- E2 }0 S. b# |# O4 s# m) y' ^( e4 |. A5 m9 Q
场景2:大规模离线活动 # @/ T F' l/ n- R6 [, k. Z . h# d% \' z. H2 k' @/ J2 `' X对于此场景,我们假设大多数客户端有一个错误,当触发该错误时,会导致客户端崩溃。有问题的块已经被集成到链中,每当客户端遇到该块时,它就会离线,从而无法进一步参与协商。大多数客户端现在处于离线状态,因此开始出现非活动泄漏。2 L/ B, t$ Q% X t$ g
6 V" z6 ?5 g. X
客户端开发人员将争先恐后地将一切重新组合在一起。现实地说,在几个小时内,最多几天,他们将发布一个错误修复程序,以消除崩溃。 ( y& n; c" S: E+ @, l: a `- f - R$ H0 ^: `9 F与此同时,订货商也可以选择简单地切换到另一个客户端。只要这样做足以让超过2/3的验证器在线,二次无活动泄漏就会停止。在有错误的客户端得到修复之前,这并不是不可能发生。 8 |1 I, L7 I1 a W8 Y h$ F3 X- ]9 Q! J: K9 o. B
这种情况并不是不可能(导致崩溃的错误是最常见的类型之一),但总的惩罚可能不到受影响质押的1%。& a. y/ ]) ]1 Q! S" z! q
4 d7 K- E3 Q% X场景3:无效数据区块 9 i, @) o1 M+ `1 Z7 {+ e+ x" ]3 E `
对于这个场景,我们考虑这样的情况:大多数客户端有一个错误,会产生无效的块,并且也接受它为有效的--也就是说,当使用同一客户端的其他验证器看到无效的块时,它们将认为它是有效的,从而证明它。 ' p ?; S. i+ ]! @9 \) {8 i% c L. W9 V" m
让我们调用包含无效区块链A的链,一旦产生无效区块,就会发生两件事: 4 w. S- h% j3 b! x e. ]: q6 d; I5 u1. 所有正常工作的客户端都将忽略无效块,而是在生成单独链B的最新有效磁头上构建。所有正常工作的客户端都将投票并在链B上构建。 3 ?! J3 b8 k$ k/ B/ G0 v0 j% R& I5 v0 D
2. 故障客户端认为链A和B都有效,因此,它将投票给目前认为最重的两条链中的任何一条。* c5 X' D4 l" ]+ T# _
" Z" j3 x3 l ] D4 y* s" D! U, t8 p& `6 J$ d) }! w- M* J
我们需要区分三种情况:9 h4 S' }* R4 ?' P