事件概述
太平洋時間2024年11月21日上午大約1:15至3:45之間(東八區時間:2024年11月21日下午5:15至7:45),Sui主網發生了全面網絡停滯。所有驗證節點陷入崩潰循環,導致交易處理完全中斷。
問題原因
阻塞控制代碼中的assert!觸發了錯誤:如果估算的執行成本爲零,則會導致驗證節點崩潰。此問題發生需滿足以下所有條件:
1. 阻塞控制設置爲TotalGasBudgetWithCap模式:
該模式在協議版本63中短暫啓用後被撤銷,隨後在協議版本68中隨累積調度器再次啓用。
2.網絡接收到同時包含以下條件的交易:
可變共享對象輸入
零個MoveCall指令
當網絡接收到此類交易時,所有驗證節點立即崩潰。
什麼是阻塞控制?
Sui網絡基於對象的架構支持大規模並行處理不同的用戶交易,這在大多數其他網絡中無法實現。然而,如果多筆交易同時寫入同一共享對象,則這些交易必須按順序執行,且涉及該特定對象的交易處理量存在上限。
阻塞控制系統通過限制寫入同一共享對象的交易速率,防止網絡因執行時間過長的檢查點而過載。
我們最近升級了阻塞控制系統,以通過更準確地估算交易複雜度來提高共享對象的利用率。但新模式TotalGasBudgetWithCap的代碼中存在一個bug,導致此次問題的發生。
如何解決問題?
在問題確立後,代碼修復十分直接(詳見 PR #20365)。該修復已部署到主網(v1.37.4)和測試網(v1.38.1)。
PR #20365:將bump_object_execution_cost修改爲使用飽和加法,並允許0成本交易。
🌟 主網v1.37.4:
https://github.com/MystenLabs/sui/releases
在驗證節點社區的積極響應下,從修復發佈到Sui網絡恢復正常僅用了15分鐘。
我們學到了什麼?
事件檢測與響應系統運行良好: 自動警報與社區報告幾乎同時觸發,我們迅速調動團隊資源進行診斷和修復。
驗證節點社區表現出色: 修復發佈後,Sui網絡幾乎立刻恢復正常。
預防措施
改進測試系統: 增加更多類似觸發此次崩潰的對抗性交易類型,以發現潛在問題。
優化構建流程: 提高調試和發佈二進制文件的生成速度,進一步減少事件響應時間。此次中斷過程中的一部分時間是由於等待構建發佈版本。
感謝社區和驗證節點的支持,共同確保了Sui網絡的快速恢復!