5 · セキュリティ
XChain のセキュリティはチェーン単位ではなく資産単位です。すべての資産が最低セキュリティ・クラスを持ち、高価値の資産はそもそもデータドメインに存在できません。これが「格下げ」攻撃を構造的に不可能にし、価値の安全性を、小さなバリデータ集合への信頼ではなく暗号と資本の上に置きます。
高価値のための 3 つの層
高価値(T0–T1)には 3 つの層が重なります:
- ZK 有効性証明 —— 委員会が完全に乗っ取られても無効な状態を偽造できません。失うのはライブネスであって安全性ではありません。
- グローバルな restaking —— どのチェーン上の不正もグローバルな資本をスラッシュします。
- Watcher / 詐欺証明 —— 検知と異議申し立て。
低価値のデータ(T3–T4)は公開証明(proof-of-publication)だけで守られます。3 つのチェーン・セキュリティ・クラスがこの幅をカバーし、その上に pessimistic proof が障害の隔離を提供します。問題を起こしたチェーンは自分の取り分しか失えません。
| セキュリティ・クラス | 対象 | 何が裏づけるか | 高価値を運べるか? |
|---|---|---|---|
| SOVEREIGN | T3–T4 · データドメイン | 自前のバリデータ + 公開証明 | 不可 —— UAC が構造的に禁止 |
| SHARED | T1–T2 · Execution | Partial Set Security —— 借りたバリデータ集合 | 可(そのクラスの範囲まで) |
| ZK_SECURED | T0–T1 · Settlement / Value | 有効性証明が必須 + グローバル restaking + watchers | 可 —— 最上位クラス |
図 5 — 価値に応じたセキュリティ支出:価値ドメインには 3 層、エッジには公開証明だけ。
検証は実際にいくらかかるのか
「検証する、再実行しない」は誰かが測るまでは主張にすぎません。だから数字を出します。これらは本物の Groth16/BN254 検証経路——master にマージされ devnet ノード上でエンドツーエンドに実証されたもの——から得たものです。⚠️ これは公開テストネットの説明ではありません。 そちらは今もアップグレード前のバイナリと MOCK prover で動いており、その区別は 現状とライブネットワーク で追跡しています。ここでぼかすことはしません。
| 測定項目 | 値 | なぜ重要か |
|---|---|---|
| 状態遷移証明書 1 件の検証 | ~1.19 ミリ秒(BN254 のペアリング 1 回、純 Go、DeliverTx の内部) | ブロック間隔 3,000 ミリ秒 なら、検証がボトルネックになるまでに 1 ブロックあたり約 2,500 件を検証できます |
公開入力 MiMC(prev,tx,new) の計算 | ~14 マイクロ秒 | チェーン自身が導出するので、証明は 1 つの遷移に束縛され、別の遷移に使い回せません |
groth16.Verify のコストと回路規模の関係 | 一定 —— 公開入力の数にも制約数にも依存しない | したがって 1.19 ミリ秒という数字は、現在の仮の回路だけでなく本物の SP1 検証鍵にも当てはまります |
| 証明の生成(SP1 wrap → Groth16) | 約 1,597 万制約、約 21.5 GB のメモリ | 構造上オフチェーン——バリデータ上で動くことは決してありません。 生成には prover ネットワークか 64 GB 以上のマシンが要ります |
この非対称性こそアーキテクチャの要点そのものです。証明の生成は専用インフラを要するほど重く、検証はブロック間隔に無関係なほど軽い。これがあるから、エッジの流量が増えても Root のコストはほぼ一定に保てます——そして同時に、prover の供給が解決済みとして扱われず、未解決の問題 に経済的な難問として率直に挙げられている理由でもあります。
堅牢化は実際にはどういう作業か
3 つの性質が荷重を支えており、どれも主張ではなく確認されています:
決定性。 検証器は浮動小数点も乱数も使いません。これは些細な配慮ではありません。あるバリデータが違う結果を出せば app hash が食い違い、チェーンが停止します。同じ検証を何度も繰り返して同一結果になることに加え、2 つのバリデータがブロック内で本物の証明を検証した後に同じ app hash に達するエンドツーエンドの実行で確認しています。
ゴミを穏やかに拒否する。 トランザクションから来るものはすべて敵意ある入力であり、DeliverTx の中では panic もハングもチェーン停止です。ファジングが本物を 1 つ見つけました。証明のデコーダが信頼できない nbCommitments フィールドを読んでそこから確保していたため、攻撃者がそれを約 40 億に設定すると 約 256 GB の確保を引き起こせました——チェーンを止めうる、トランザクション単位のサービス拒否です。修正は、証明が暗号ライブラリに届く前に決定的な形状ガードをかけること(期待どおりの長さちょうど、コミットメント数はゼロ)。タイムアウトによる対処は決定性を壊すため却下しました。修正後:クリーンなファジング実行 426 万回、かつてハングさせた入力は 1 秒未満で終わる回帰テストとして残り、実ノードでは悪意ある入力を拒否しつつブロックを生成し続けます。
引き起こした仕事の分だけ払う。 より微妙な発見もありました。本物の証明と MOCK のガス差(約 48,191 対約 40,638)は、検証が実際に要する約 1.19 ミリ秒の CPU ではなく、ほぼすべてより大きな証明を保存することから来ていました——ガスはストレージ操作に対して計量され、ハンドラ内部の純粋な計算には計量されないからです。したがって攻撃者は、形式は正しいが無効な証明をばらまくことで本物の CPU を安く買えました。修正は、検証を行う前にその分を明示的に課金し、手数料が課したコストを反映するようにすることです。
どれも設計を眺めて推論して見つかったものではなく、動かして見つかったものです。公開テストネットの存在理由が、これで 1 段落に収まります。
要点: 各資産にセキュリティ・クラスを縛りつけることが要石です——「価値を間違った場所に置くな」を指針から構造的な保証へと変えます。ここまでに挙げたすべての保証——ドメイン境界、READ/WRITE 分離、資産ごとのクラス——は、監査して信頼できるほど小さいどこかで強制されなければなりません。その場所が細い腰、すなわち次に仕様を述べる 7 つの原語です。