事件概述

太平洋時間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網絡幾乎立刻恢復正常。

預防措施

  1. 改進測試系統: 增加更多類似觸發此次崩潰的對抗性交易類型,以發現潛在問題。

  2. 優化構建流程: 提高調試和發佈二進制文件的生成速度,進一步減少事件響應時間。此次中斷過程中的一部分時間是由於等待構建發佈版本。

感謝社區和驗證節點的支持,共同確保了Sui網絡的快速恢復!