レイヤー1ブロックチェーンのSui(スイ)の開発主体Sui財団は1日、公式ブログにて5月28日・29日にメインネットで発生した連続障害に関する詳細なインシデントレビューを公開した。同レポートでは48時間以内に発生した3つの障害を「Part 1〜3」として整理し、技術的原因と復旧措置を開示。いずれの障害中もユーザー資金は危険にさらされず、コミット済みトランザクションがリバートされることもなかったとしている。
3つの障害の公式タイムライン
公式レポートが示す3つの障害の開始・終了時刻(太平洋時間/PT)は以下のとおり。
- Part 1:5月28日 ~7am PT 〜 ~1:30pm PT(日本時間5月28日 23:00 〜 5月29日 5:30)
- Part 2:5月29日 ~5am PT 〜 ~8:30am PT(日本時間5月29日 21:00 〜 5月30日 0:30)
- Part 3:5月29日 ~1:30pm PT 〜 ~7:20pm PT(日本時間5月30日 5:30 〜 11:20)
最初の2つはいずれもv1.72リリースで導入された「アドレス残高(Address Balances)」機能と既存のガス課金ロジックの相互作用に起因するクラッシュバグ、3つ目はその修正版適用のためのバリデータ再起動が引き起こした別の潜在バグ(ランダム性状態の保持)が原因とされる。
Part 1:Hybrid gasのアンダーフロー
v1.72で導入されたアドレス残高機能により、Suiユーザーはコインオブジェクトを使わずに資金を保管しガス代を支払えるようになった。ガス代支払いはアドレス残高のみ、コインオブジェクトのみ、両者混合(hybrid gas)の3パターンがあり、後者2つではgas smashingで全入力コインを1つにまとめて引き落とす。
根本原因はhybrid gasのエッジケースだった。リザベーションがアドレス残高をオーバードラフトしようとすると「InsufficientFundsForWithdraw」でキャンセルされるが、続くgas smashingで同じリザベーションが再度オーバードラフトを試み、キャンセルされたはずのトランザクションが同じ資金を消費する現象が発生。修正は「InsufficientFundsForWithdrawでキャンセルされたトランザクションではgas smashingを行わない」というシンプルなものだった。
Part 2:暫定修正の制限が顕在化
Suiコアチームは長期解決策と並行して、ネットワーク早期復旧のための暫定修正(interim measure)を28日 ~12pm PTに提案し、~1:30pm PTに復旧した。ただし暫定修正には既知の制限があり、1つのトランザクションが複数のキャンセル理由を持ち別のエラーが「InsufficientFundsForWithdraw」をマスクすると、修正がバイパスされてクラッシュする可能性が残されていた。29日朝、まさにそのシナリオがヒット。長期修正版は ~8am PTに提案され、十分なバリデータの採用を経て~8:30am PTに復旧した。
Part 3:エポック変更時のDKG状態保持バグ
29日 ~1:30pm PTのエポック変更で、3度目の停止が発生した。各エポック開始時、バリデータはオンチェーンランダム性の基盤となる「分散鍵生成(DKG)」を実行するが、通常コンセンサスより高い参加閾値が必要となる。Part 2修正適用のための再起動でバリデータ参加が閾値を下回り、DKGは設計通り自己無効化した。
しかし潜在バグでその失敗判定がディスクに書き込まれず、バリデータが再起動のたびにDKG失敗を「忘れた」状態で立ち上がる事態に。ランダム性依存トランザクションは実行もキャンセルもされず、エポック終了処理は永遠に到来しないDKGの完了を待つことになった。修正はGitHub PR #26846として公開され、DKGステータスの再起動跨ぎ永続化と、スタックエポックの協調的クローズ機構で構成される。
Sui Core Teamが共有した4つの教訓
レポート末尾で、Suiコアチームは①エポック終了の耐障害性(既存「セーフモード」フォールバックの再構成パス全体への拡張と強制クローズ機構の標準化)、②ガス課金ロジック(Move VMやMysticeti合意プロトコルと同等のコード品質と網羅的インバリアントテストへの投資)、③AIエージェント(バリデータログの対話的クエリやクラスタ状態検査が可能なAIツールが障害診断を実質的に加速)、④より良い障害封じ込め(クラッシュ原因の入力をスキップ・再起動できる多層防御)の4点を今後の投資領域として開示している。
関連:L1 Sui、2日連続のメインネット障害──前日の5時間55分を上回る深刻な停止
関連:L1 Sui、今年2度目のメインネット停止──バグでブロック生成が一時中断



