以太坊合併:運行多個客戶端有哪些風險?
原文翻譯:Block unicorn
原文翻譯:Block unicorn

特別感謝Vitalik Buterin(V神), Hsiao-Wei Wang、Caspar Schwarz-Schilling的反饋和審查。
一級標題
一級標題
一級標題
為什麼我們需要多個客戶端?
對於為什麼單一客戶端體系的結構更可取是存在爭議的。而開發多個客戶端會產生相當大的開銷,這就是為什麼我們沒有看到任何其他區塊鍊網絡認真地追求多客戶端選項的原因。那麼,為什麼Etherum的目標是成為多客戶端?客戶端是非常複雜的代碼片段,很可能包含錯誤。其中最糟糕的是所謂的“共識錯誤”,即區塊鏈核心狀態轉換邏輯中的錯誤。一個經常被引用的例子是所謂的“無限貨幣供應”漏洞,在這個漏洞中,有漏洞的客戶端接受打印任意數量的以太的交易。如果有人發現了這樣的漏洞,但在他們到達出口之前沒有被阻止(即通過混合器或交易所來利用資金),這將導致Ether的價值大幅崩潰。
1.如果每個人都運行相同的客戶端,停止需要人工幹預,因為鏈、所有智能合約和交易所都將照常運行。即使是幾分鐘的時間也足以執行一次成功的攻擊,並充分分散資金,使其不可能只回滾攻擊者的交易。根據打印的ETH數量,社區可能會協調將鏈回滾到利用漏洞之前(在識別並修復錯誤之後)。現在,讓我們來看看當我們有多個客戶端時會發生什麼。有兩種可能的情況:A。
有漏洞的客戶端只佔不到50%的質押份額
,客戶端將使用利用該錯誤的事務生成一個塊,打印ETH,讓我們稱這條鍊為然而,運行無故障客戶端的大多數質押將忽略此塊,因為它是無效的(對他們來說,打印ETH操作就是無效的)。它們將構建
2.然而,運行無故障客戶端的大多數質押將忽略此塊,因為它是無效的(對他們來說,打印ETH操作就是無效的)。它們將構建不包含無效塊的備用鏈B。由於正確的客戶端佔多數,B鏈將積累更多的證明。因此,即使是有問題的客戶端也會投票給鏈B;結果就是鏈B將積累100%的選票,鏈A將死亡。鏈條將繼續,就像錯誤從未發生過一樣。A大部分質押份額使用的是有問題的用戶端B,在這種情況下,鏈A將積累多數選票。但是,由於B擁有不到50%的所有證明,違規的客戶端將永遠看不到從鏈

切換到鏈
如果有錯誤的客戶端由超過2/3的質押運行,情況2將會更糟。在這種情況下,它將最終確定無效的鏈。稍後會詳細介紹這一點。
一級標題一級標題
一級標題
激勵客戶端多樣性:反相關性懲罰
如果質押分散在多個客戶端,最好的情況是每個客戶端擁有不到總質押的三分之一,這顯然對網絡有利。這將使其對任何單個客戶端中的錯誤具有彈性。但質押者為什麼會在乎呢?如果網絡沒有任何激勵措施,他們就不太可能承擔轉向少數派客戶端的成本。
不幸的是,我們不能讓獎勵直接依賴於驗證器運行的客戶端。沒有不能被欺騙的客觀方法來衡量這一點。
然而,當您的客戶端有錯誤時,您無法隱藏。這就是反相關懲罰的用武之地:其思想是,如果您的驗證器做了一些不好的事情,那麼如果更多的驗證器幾乎在同一時間犯了錯誤,那麼懲罰就會更高。換句話說,你會因為相關的失敗而受到懲罰。
在以太,你目前可能會因為兩種行為而被砍掉:
1.在相同高度的兩個區塊上簽名。
然而,有一個問題:還有一個額外的懲罰,它取決於在您的驗證器被砍掉之前和之後的4096個時期(18天)內發生的所有其他砍掉。你被進一步處罰的金額與這段時間內被削減的總金額成比例。
一級標題
一級標題
一級標題
另一個反相關性懲罰:二次無活動洩漏
驗證器失敗的另一種方式是離線,同樣,這是有懲罰的,但其機制非常不同。我們不稱之為削減,而且通常很小:在正常操作下,離線的驗證器受到的懲罰與他們在完全驗證時將獲得的懲罰相同。在撰寫本文時,這是每年4.8%的增長率。如果您的驗證器有幾個小時或幾天處於離線狀態,例如由於臨時的互聯網中斷,那麼可能不值得出一身冷汗。

該機制的設計是為了在發生導致大量驗證器操作失效的災難性事件的情況下,鏈最終能夠再次完成。隨著離線驗證器失去越來越多的質押,他們在總質押中的份額將越來越小,當他們的質押降至1/3以下時,剩餘的在線驗證器獲得所需的2/3多數,從而使他們能夠最終確定鏈。
一級標題
一級標題
一級標題
運行多數用戶端有多糟糕?
為了了解危險是什麼,讓我們來看看三種失敗類型:
3.無效區塊事件:由於錯誤,多數用戶端驗證器都證明存在無效塊。
一級標題
一級標題
一級標題
在這種情況下,損害顯然是極端的,但我也認為極不可能。可刪除證明的條件很簡單,這就是為什麼構建驗證器客戶端(VCs)來強制執行它們的原因。驗證器客戶端是一個很小的、經過良好審核的軟件,這種規模的漏洞不太可能出現。
一級標題一級標題
一級標題
場景2:大規模離線活動
與此同時,訂貨商也可以選擇簡單地切換到另一個客戶端。只要這樣做足以讓超過2/3的驗證器在線,二次無活動洩漏就會停止。在有錯誤的客戶端得到修復之前,這並不是不可能發生。
一級標題
一級標題
一級標題
場景3:無效數據區塊
對於這個場景,我們考慮這樣的情況:大多數客戶端有一個錯誤,會產生無效的塊,並且也接受它為有效的--也就是說,當使用同一客戶端的其他驗證器看到無效的塊時,它們將認為它是有效的,從而證明它。
讓我們調用包含無效區塊鏈A的鏈,一旦產生無效區塊,就會發生兩件事:

1.所有正常工作的客戶端都將忽略無效塊,而是在生成單獨鏈B的最新有效磁頭上構建。所有正常工作的客戶端都將投票並在鏈B上構建。
1. 2.故障客戶端認為鏈A和B都有效,因此,它將投票給目前認為最重的兩條鏈中的任何一條。我們需要區分三種情況:
2. 有漏洞的客戶端持有的質押不到總質押的一半。在這種情況下,所有正確的客戶端都投票並建立在B鏈上,最終使其成為最重的鏈。在這一點上,即使是有錯誤的客戶端也會切換到鏈B。除了一個或幾個孤立的塊之外,不會發生任何糟糕的事情。這就是令人欣慰的情況,也是為什麼只有多數用戶是很棒的原因。
有漏洞的客戶端持有超過一半但不到三分之二的質押。在這種情況下,有錯誤的客戶端將不只是構建鏈A—它實際上將擁有足夠的質押來“終結” 它。請注意,它將是唯一會認為鏈A已完成的客戶端。最終確定的條件之一是鍊是有效的,而對於所有其他正確操作的客戶端來說,鏈A將無效。然而,由於Casper FFG協議的工作方式,當驗證器最終確定鏈A時,他們永遠不能在不被砍掉的情況下參與與A衝突的另一個鏈,除非該鏈最終確定(對於任何對細節感興趣的人,請參閱附錄2)。因此,一旦鏈A被最終確定,運行有錯誤的客戶端的驗證器就陷入了可怕的困境:他們已經提交了鏈A,但鏈A是無效的。他們不能對B做出貢獻,因為它還沒有最終敲定。即使是他們的驗證器軟件的錯誤修復也幫不了他們-他們已經發送了違規的選票。現在會發生什麼是非常痛苦的:尚未敲定的B鏈將進入二次無活動洩漏。在幾週的時間裡,違規的驗證者將洩露他們的質押,直到損失足夠多的質押,以便B再次敲定。假設他們一開始持有70%的質押--那麼他們將失去79%的質押,因為這是他們需要損失的金額,才能代表不到總質押的三分之一。在這一點上,鏈B將再次敲定,所有質押者都可以切換到它。鏈條將再次恢復健康,但中斷將持續數週,數百萬ETH在此過程中被摧毀。
一級標題
一級標題
一級標題

風險分析
那麼,我們如何評估這些情景呢?典型的風險分析策略是評估事件發生的可能性(1-極不可能,5-非常可能)以及影響(1-非常低,5-災難性)。需要關注的最重要風險是那些在兩個指標上得分都很高的風險,以影響和可能性的乘積為代表。
考慮到這一點,到目前為止最優先的是情景3。當一個客戶端處於三分之二的絕對多數時,影響是相當災難性的,這也是一個相對可能的情景。為了強調這樣的漏洞很容易發生,最近在Kiln Testnet上發生了這樣的錯誤(參見Kiln Testnet阻止提案失敗)。在這種情況下,Prysm在提出後確實檢測到了積木有缺陷,並且沒有證明這一點。如果Prysm認為該阻塞有效,並且這種情況發生在Mainnet上,那麼我們處於場景3的情況3中描述的災難性情況-因為Prysm目前在Mainnet擁有2/3的多數。因此,如果你目前正在運營Prysm,那麼你可能會損失所有資金,這是一個非常真實的風險,你應該考慮更換客戶端。
情景1可能是人們最擔心的,得到的評級相對較低。這樣做的原因是,我認為發生這種情況的可能性相當低,因為我認為Validator客戶端軟件在所有客戶端上都實現得很好,它不太可能生成可傾斜的證明或塊。
我會向任何擔心這一點的人建議另一種選擇。也可以讓您的驗證器設置保持原樣(不需要取出密鑰等),並且只切換信標節點。這是非常低的風險,因為只要驗證器客戶端按預期工作,它就永遠不會重複簽名,因此不能被砍掉。特別是如果您有大型操作,其中更改驗證器客戶端(或遠程簽名者)基礎設施將非常昂貴,並且可能需要審核,這可能是一個很好的選擇。如果設置的性能不如預期,也可以很容易地切換回原始客戶端,或者嘗試其他少數客戶端。
一級標題
一級標題
一級標題
一級標題
二級標題
附錄
附錄
二級標題
附錄1:為什麼不對無效的區塊進行大幅削減?
在場景3中,我們必須依靠二次無活動洩漏來懲罰提出和投票給無效塊的驗證器。這很奇怪,為什麼我們不直接懲罰他們呢?這樣看起來會更快,也不會那麼痛苦。
2. 我們可能不那麼急於引入這種類型的削減的第二個原因是,即使我們可以這樣做,也是因為產生無效塊比目前的削減條件更難防止。目前的條件非常簡單,驗證器客戶端只需幾行代碼就可以輕鬆地進行驗證。這就是為什麼我認為上面的情景1不太可能--到目前為止,可刪減的消息只是由運營商的失誤產生的,我認為這種情況可能會繼續下去。添加用於產生無效區塊(或證明它們)的斜切會增加投幣者的風險。現在,即使是那些經營少數派客戶端的人也可能面臨嚴重處罰。
二級標題
二級標題
二級標題
附錄2:為什麼有缺陷的客戶端在最終確定鏈A後不能切換到鏈B?
這一節是為那些想要更詳細地了解為什麼有錯誤的客戶端不能簡單地切換回來而不得不遭受可怕的無活動洩漏的人而設計的。為此,我們必須看看Casper FFG最終確定是如何工作的。
每個證明都包含一個源檢查點和一個目標檢查點。檢查站是一個紀元(Epoch)的第一個區塊。如果存在從一個紀元到另一個紀元的鏈接,而該鏈接的投票總數超過所有利害關係的2/3(即,有如此多的證明,其中第一個檢查點為“源”,第二個檢查點為“目標”),則我們將其稱為“超級多數鏈接”。
一個紀元可以是“合理的”,也可以是“確定的”,它們的定義如下:
1.紀元0是對齊的。
2.如果與一個合理的紀元有絕對多數的聯繫,那麼一個紀元就是合理的。
3.如果(1)紀元X是對齊的,並且(2)下一個紀元也是對齊的,且絕大多數鏈接的源是紀元X,則紀元X被最終確定。
規則3略有簡化(有更多的條件可以最終確定一個紀元,但它們對本討論並不重要)。現在,讓我們來看看大幅削減的條件。大幅削減證明有兩條規則。兩者都比較一對證明V和W:
1. 如果V和W的目標是相同的紀元(即相同的高度),但它們不投票給相同的檢查點(雙重投票),則它們是可以砍掉的。
2. 這意味著(1)V的源早於W的源和(2)V的目標晚於W的目標(環繞投票)。

第一個條件是顯而易見的:它防止簡單地投票給同一高度的兩個不同的鏈。但是第二個條件有什麼作用呢?
它的功能是削減參與最終確定兩個衝突鏈的所有驗證器(這永遠不應該發生)。要了解原因,讓我們再次查看我們的場景3,在最糟糕的情況下,有錯誤的客戶端佔絕對多數(>2/3的質押)。當它繼續投票給有故障的鏈時,它將最終確定具有無效塊的紀元,如下所示:

這張圖片中的圓角方框代表的是紀元,而不是區塊。綠色箭頭是所有驗證器創建的最後一個超級多數鏈接。紅色箭頭是僅由有錯誤的客戶端支持的超級多數鏈接。正常工作的客戶端忽略帶有無效區塊(紅色)紀元。第一個紅色箭頭將證明無效的紀元是正確的,第二個箭頭將確定無效紀元。
現在讓我們假設錯誤已經修復,並且最終確定無效紀元的驗證器想要重新加入正確的鏈B。為了能夠終止鏈,第一步是調整紀元X:


