BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

以太坊2.0 主網事故回顧

ECN以太坊中国
特邀专栏作者
本文約6639字,閱讀全文需要約10分鐘
該回顧詳細介紹了事故的時間線;分析了根本原因以及列出了Eth2 質押者和參與者需要注意的問題。
AI總結
展開
該回顧詳細介紹了事故的時間線;分析了根本原因以及列出了Eth2 質押者和參與者需要注意的問題。

事故概要

二級標題

https://beaconcha.in/epoch/32302

事故概要

從epoch 32302 開始,信標鏈丟失了大量區塊提議。由於Prysm 是Eth2 客戶端中用戶最多的,因此問題最有可能出現在Prysm 上。一段時間之後,我們在本地重現了該錯誤。這其實是我們已知的一個與eth1 數據投票和驗證者存款相關的問題。儘管之前已經有人向我們報告過此問題了,但是我們無法重現這個bug 並將其視為孤立事件。而且這個問題從未在任何測試網或者主網中廣泛傳播過。這是該問題首次導致區塊提議失敗事故。

影響

影響

該回顧詳細介紹了事故的時間線;分析了根本原因以及列出了Eth2 質押者和參與者需要注意的問題。

影響

一些初步數據表明,第一次事故中,每個受影響的驗證者平均損失122950 gwei (按文章攥寫時的價格計算為0.3 美元)。而該次事故發生的24 小時內,又發生了第二次相同的事故,每個受影響的驗證者損失約為0.22 美元。

一些關鍵事實:

➤ 沒有驗證者被罰沒

➤ 對信標鏈的敲定沒有影響

➤ 參與率還是很高(最低點也有84.8%) (編者註,此數據與Ben Edgington 編寫的最新一期《Eth2 進展更新》有出入。 )

➤ 大多數驗證者丟失2 到3 個證明,不管哪個客戶端類型

二級標題

二級標題

問題解答

成為驗證者的捷徑

此事故是否會削弱大家對Eth2 的信心?

不會。該事故並沒有造成共識失敗,並且該事件的影響範圍與Eth2 主網的規模相比非常小(在第一次事故中,每個受影響的驗證者平均損失約0.3 美元)。自創世以來,Eth2 一直都非常強大,驗證者參與率非常高,並且每個epoch 都完成了敲定。從我們的角度來看,故障解決了之後,網絡有能力恢復到完美運行的狀態,反而增強了社區對以太坊的複原能力的信心。

此事故是否會削弱大家對Prysmatic Labs 團隊的信心?

二級標題

二級標題

事故根本原因總結

Eth2 和Eth1 鏈鬆散地連接著,Eth2 僅在驗證者存款驗證時需要用到Eth1。也就是說,即使驗證者對垃圾數據進行了投票,Eth2 PoS 鏈也可以繼續運行。而唯一會影響到的事就是,新的驗證者存款無法添加,直到PoS 鏈再次對正確的Eth1 數據進行投票。此“投票”是在“投票週期”中完成的,目前主網上將該週期設置為64 epochs (大約6.8 小時)。

投票的方式為一個簡單的“絕對多數”原則,Eth2 驗證者規範中有解釋其運作方式。不幸的是,Prysm 在實行該原則(按照絕對多數原則投票) 時,丟失了一些驗證。該事故中,由於Prysm 出現了bug,導致一名區塊提議者創建了一個完全無效的Eth1 存款樹根,而其他Prysm 節點首先發現了該區塊提議。隨後,他們對此投了有效票,因為Prysm 客戶端遵循的是簡單的“絕對多數投票”原則,而沒有做明確的驗證。

二級標題

二級標題

事件時間線

注意,下面是技術細節!大家可以跳到下一部分,閱讀解決方案以及該次事故帶來的經驗教訓。

區塊提議失敗

Epoch 32302 開始出現區塊提議丟失的問題。


Nishant 通知了團隊,並召開了全體會議。然後,我們通過本地的主網信標節點重現事故,並開始了調查。

排除法

正文

排除法

最初的懷疑是關於Prysm 如何在驗證者提議代碼路徑中處理eth1 數據投票。尤其是,我們試圖排除一些問題:

1.打包存款進區塊這裡有問題嗎?

2.存款日誌信息獲取和eth1 信息混了或者不確定嗎?

3.我們的存款默克爾樹出現問題了嗎?

在接下來的16 個小時左右,我們花費了大量的時間共同努力診斷潛在的問題。我們梳理了代碼行,試圖通過單元測試來重現故障過程,並嘗試了各種方法。儘管我們已經有了一個潛在的解決方案,我們也因缺乏信心而對發布修復版本而緊張。

較合理的根本原因

此前在處理Eth2 測試網中的bug 時,我們得到了一些經驗教訓,光對根本原因有信心是不夠的。在高風險的情況下,在向用戶公佈解決方案之前,我們需要有100% 的信心。在事故發生後28 小時,我們坐下來並問自己:”我們還有什麼是不知道的呢?我們還可以問什麼問題來讓我們更接近發生故障的根本原因呢?”然後我們知道了以下幾點:

1.我們的稀疏默克爾樹(sparse merkle tree) 實現並沒有嚴重的bug,因為它使用主網和Prater 測試網的存款,與Lighthouse 和Protolambda 的Eth2 zrnt 實現相匹配。

2.我們用於從Eth1 節點檢索Eth1 數據的代碼路徑沒有bug,也沒有返回不正確的數據。

我們不知道的有:

1.無效的存款樹根是如何產生的

2.為什麼這個問題在一些節點中是可以重現的,而其他節點不可以

3.為什麼Prysm 節點在確定區塊中的存款數量時,出現了”off-by-one“錯誤

修復問題

為了回答這些問題,我們看了初始化我們的存款樹的代碼路徑。結果發現,在早期添加了一個緩存層以避免質押者每次啟動他們的節點時都必須下載所有驗證者存款記錄。此外,我們添加了一個新功能——在客戶端內部可以從一個內嵌的創世狀態中啟動Prysm。在填充緩存時,我們存款樹的一個錯誤預設導致信息的訛誤:

問題根源

二級標題

二級標題

問題解決

根本原因總結

➤ Prysm 把eth1 數據保存在磁盤上,以防止用戶在每次重啟進程時都必須對驗證者存款合約日誌發出請求。

➤ 如果一個節點重啟並把eth1 數據保存在磁盤上,我們會從這些數據初始化我們的存款緩存,但由於我們的稀疏默克爾樹(sparse merkle tree,SMT) 協助程序包的工作方式與從磁盤上的數據初始化此緩存的代碼路徑不相同,我們會跳過把第0 筆存款嵌入存款樹,造成無效存款樹根。這個代碼路徑只影響那些創世以來還沒有數據庫的節點,後來被修復了。

➤ 在官方規範裡,Prysm 節點遵循“絕對多數”的原則執行一個eth1 數據投票算法,但是,Prysm 並沒有完全實現該算法的一些有效條件。 Prysm 節點隨絕對多數eth1數據投票進行投票,該投票數據引用的是一個現存的區塊根,這可能導致Prysm 節點投票給一個由有問題的存款樹生成的存款樹哈希值,因為這些存款是未被驗證的。

解決方案

解決方案

解決方案

在北京時間4 月25 日週日13:00,在不確定性中煎熬了多個小時後,我們發布了對該問題的修復。我們對這個解決方案有十足的把握,並非常有信心在節點升級後,該問題在Eth2 中不會再出現。

吸取教訓

➤ 在事件中,對我們的解決方案有信心和與外界的謹慎溝通是至關重要的

當我們遭遇Eth2 的Medalla 測試網事故時,我們上了關於良好溝通的價值的重要一課。每個公共評論和語言的精確表達都會對事件的結果產生嚴重影響。在測試網的事件裡,我們以為一個立即的解決方案是通過公共渠道告訴大家“重啟你們的節點”。這個草率的決定導致網絡上大部分的節點都掉線了,然後爭先恐後在一堆壞的對等節點裡找好的,以實現與區塊鏈的同步。此外,我們很快發布了一個沒有100% 信心能解決問題的軟件升級熱補丁。這給系統帶來更多的混亂,並造成節點運行商對解決方案的疑慮。

相較之下,在這次主網新事故的整個過程裡,我們一直注意慎重與精確的溝通。另外,在我們對問題的根源和解決方法有100% 的信心之前我們沒有發布熱補丁。

➤ 保持耐心與冷靜有助於解決問題

我們團隊經過了過去幾年構建Eth2 ,學到瞭如何在面對逆境時保持冷靜。我們相信在解決問題過程中,保持冷靜、頻繁交流狀態報告、確保團隊感受到支持和正面的反饋是非常重要的。我們能夠花時間收集盡可能多的證據,並與我們的用戶進行細緻的合作,我們將成功解決這個問題。更重要的是,我們在開始時就花時間對事件影響進行量化,以減少質押者與因缺乏信息而產生的憂慮。這個教訓對在高度緊張與睡眠不足的情況下工作非常重要。慢下來,用適當的方法解決它,並不惜一切代價避免把問題弄得更糟。

➤ Eth2 測試網不等於主網

二級標題

二級標題

質押者應該思考什麼

為什麼使用Prysm 客戶端做質押

https://launchpad.ethereum.org

人們選擇運行Prysm 時因為從一開始我們團隊已經專注於使他們參與以太坊質押的體驗更簡單。我與我們的用戶溝通過很多次,很多人選擇一個客戶端不是因為微觀上的優化或與其他客戶端相比相對小的收益差別,而是因為我們使得他們的體驗更簡單——良好的文檔資料,一直給所有的社區成員提供重要的幫助。對於新手來說Eth2 是可怕的,質押也充滿不確定性和風險。我們團隊的使命是讓用戶知道我們在他們身邊,以及無論他們的問題多小都會得到我們的支持。特別地,我們一直關注那些可能對命令行不太熟悉、不太了解UNIX 操作系統的普通質押者。

在未來,你可以對我們團隊有以下期待:

➤ 提高實現規範條件的準確性,確保預設和有效條件在任何代碼被寫入前都被充分審核和質疑

➤ 我們不因要提高這個體驗,還要加倍努力,使Prysm 比今天提升很多倍,使使用我們客戶端的質押者更容易參與網絡,包括網頁界面的改進。

➤ Prysm 將在研發方面加倍努力,在eth1<>eth2 的合併前提供關鍵的功能與改進。

➤ 我們相信健康的競爭能形成一個強大的激勵機制,推動ETH 的權益證明能有更多人參與,也因此更安全,因為所有客戶端團隊都不斷改善他們的軟件

➤ 我們團隊致力於以最高的專業水準來解決和質押者可能會遇到的問題。我們相信我們做好處理我們路上會遇到的任何問題,並向我們的社區保證我們會把質押者體驗作為我們的最高優先級。

二級標題

二級標題

回顧客戶端多樣性的對話

自Eth2 創世以來,我們一直聽到的一個共同主題是客戶端多樣性。 Eth2 是一個有世界各地的人作為驗證者參與的分佈式系統。不同人用不同的軟件參與到區塊鏈的共識裡,如果某個軟件出現嚴重問題,如果運行網絡的客戶端實現由一個平衡分佈的話,影響會更小。

Leonardo Bautista-Gomez 早在一月的時候公佈了一份數據分析,結果現實Prysm 節點佔網絡的65%,此次事件也顯示Prysm 驗證者在今天佔了大多數。

https://github.com/leobago/BSC-ETH2/tree/master/armiarma

參考

參考

參考

• 事件的溝通https://www.reddit.com/r/ethstaker/comments/mxpz57/regarding_the_recent_beacon_chain_incident/

• 事後檢討報告https://docs.google.com/document/d/1nJr6_bd-UnLBxvhT8lcRYdAZr69QdVQ3zJNUr3LgW-0/edit?usp=sharing

• Medalla 測試網事件https://medium.com/prysmatic-labs/eth2-medalla-testnet-incident-f7fbc3cc934a

https://medium.com/prysmatic-labs/tagged/blockchain)

原文鏈接:https://medium.com/prysmatic-labs/eth2-mainnet-incident-retrospective-f0338814340c

ETH
歡迎加入Odaily官方社群