イベント概要
太平洋時間2024年11月21日午前1時15分から3時45分の間(東八区時間:2024年11月21日午後5時15分から7時45分)、Suiメインネットは全面的なネットワーク停止を経験しました。すべての検証ノードがクラッシュループに陥り、取引処理が完全に中断されました。
問題の原因
ブロッキング制御コード内のassert!がエラーを引き起こしました:見積もられた実行コストがゼロの場合、検証ノードがクラッシュします。この問題が発生するには、以下のすべての条件を満たす必要があります:
1. ブロッキング制御がTotalGasBudgetWithCapモードに設定されていました:
このモードはプロトコルバージョン63で短期間有効化された後に撤回され、その後プロトコルバージョン68で累積スケジューラーとともに再度有効化されました。
2. ネットワークが同時に以下の条件を含む取引を受信しました:
可変共有オブジェクト入力
ゼロのMoveCall命令
ネットワークがこのような取引を受信すると、すべての検証ノードが即座にクラッシュします。
ブロッキング制御とは何ですか?
Suiネットワークはオブジェクトベースのアーキテクチャに基づいており、異なるユーザー取引を大規模に並行処理することをサポートしていますが、これは他のほとんどのネットワークでは実現できません。しかし、複数の取引が同時に同じ共有オブジェクトに書き込まれる場合、これらの取引は順番に実行される必要があり、その特定のオブジェクトに対する取引処理量には上限があります。
ブロッキング制御システムは、同じ共有オブジェクトへの取引速度を制限することで、ネットワークが実行時間の長いチェックポイントによって過負荷になるのを防ぎます。
私たちは最近、取引の複雑さをより正確に見積もることで共有オブジェクトの利用率を向上させるために、ブロッキング制御システムをアップグレードしました。しかし、新しいモードTotalGasBudgetWithCapのコードにバグが存在し、これが問題を引き起こしました。
問題をどう解決しますか?
問題が確定した後、コード修正は非常に直接的でした(詳細は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ネットワークの迅速な回復を確保しました!