【Zcash Ironwood】直すのに5日、証明するのに60日
バグは6月に直っています。それでも$1.7Bのプールを封鎖したのは、「悪用されたか」が誰にも分からないからです。
目次
おはようございます。
今日は「Zcash の新シールドプール Ironwood」をリサーチしました。
TL;DR
- 2026年5月29日、Zcash の Orchard シールドプールに「無制限かつ検出不能な偽造 ZEC を作れる」健全性バグが見つかりました。ZK回路の制約が1本抜けていただけで、修正は5日後の6月3日に完了しています。
- 開発陣はさらに約60日かけ、7月28日の NU6.3 で新プール Ironwood を稼働。稼働時点で366万 ZEC(約$1.7B)あった Orchard を出金専用にしました。狙いは「直る前に悪用されていなかった」ことを、ユーザー自身に検証させることです。
- 効いたのは、プールごとの入出金会計(ターンスタイル)という素朴な制約でした。移行では金額とブロック高が公開されますが、それでも8月17日時点で79.1%が新プールへ移っています。
概要|Ironwood とは?
Ironwood は、2026年7月28日のアップグレード NU6.3 で稼働した Zcash の4つ目のシールドプール(shielded pool=残高も送金先も暗号で隠される領域)です。残高ゼロから始まり、以後の新規シールド出力はすべてここに入ります。同時に、唯一の現役プールだった Orchard は出金専用になりました。
Ironwood はバグを修正するためのものではありません。バグは6月3日の NU6.2 で塞がっています。解こうとしているのは次の問題、「塞ぐ前に誰かが使っていたか、どう確かめるのか」です。
1行の書き間違いで、供給量が守れなくなった
見つかったのは、Shielded Labs の言う「Orchard 回路の制約不足(under-constrained)な要素」でした。ゼロ知識証明(zero-knowledge proof)の回路は計算の正しさを検算する等式の集まりですが、その等式が1本足りていませんでした。halo2 の ECC ガジェットで、等式制約を張る copy_advice() を使うべき箇所に、値を書くだけの assign_advice() が使われていたのです(BlockSec の解析)。
壊れていた場所が悪すぎました。Zcash の二重支払い防止は、ノート(=コインの単位)ごとに使用済み印(nullifier)が1つしか作れない前提に立ちます。この束縛が緩むと、同じノートから毎回違う使用済み印を作れてしまいます。コンセンサスは印の重複しか見ないので、同じお金を何度でも使えて、しかも完全に不可視になります。
発見者の Taylor Hornby は実際に exploit を書き、隔離したテスト環境(regtest)で「無制限かつ検出不能な偽 ZEC」を生成しました。存在期間は NU5(2022年5月31日)から約4年。Orchard は2021年に QEDIT と NCC Group のレビューも通っています。
対応の途中で一度プールごと止めているのが目を引きます。回路に直接パッチを当てると差分から脆弱性が逆算されるので、6月2日の緊急ソフトフォークで全トランザクションをまとめて拒否し、裏で修正を仕上げました。発見から修正まで5日、公開開示まで6日です。

「悪用されたか」を、暗号ではなく足し算で確かめる
では4年のうちに誰かが使っていたのか。Zooko Wilcox らの連名声明はこう書いています。
there is no definitive way to determine using only cryptography whether such exploitation occurred
(暗号だけを使って、そうした悪用が起きたかどうかを確定的に判定する方法は存在しない)
透明な台帳なら供給量を足せば偽造は事後に見つかります。シールドプールでは足す対象が隠れているので、原理的に分かりません。Shielded Labs の見立ても「ありそうにないが、確実には否定できない」止まりでした。そのうえで、「供給の健全性については、ユーザーが我々の判断を信用しなければならない状態にすべきではない」と書きます。
効いたのは、プールの出入りを数える改札(ターンスタイル/turnstile)です。Zcash が2019年から持つ ZIP 209 の会計制約で、「各プールは、公に入った総額を超えて払い出せない」というだけのルール。ブロック受理後に残高がマイナスになるなら、そのブロックは無効になります。ただの足し算です。
Orchard を出金専用にすると、これが検証装置に変わります。偽コインが眠っているだけなら誰も使えず、外へ出そうとした瞬間に「入った以上に出ている」ことがブロックの無効として表に出るからです。各プールの残高を足すだけで流通供給を検証できる状態は稼働直後から成立していて、移行の完了を待つ必要はありません。
Ironwood の中身は3つ
1. 同じ暗号のまま、残高ゼロでやり直す
Ironwood は Orchard と同じ Halo 2、同じ Pallas 曲線です。新しい証明系でも曲線でもなく、差分は「修正済みの回路で残高ゼロから始め直す」こと。旧プールへの新規流入を止めるのが ZIP 2006 です。
2. Lean 4 による形式検証
Sean Bowe と Tal Derei を著者に、Lean 4 で2,700本超の定理による機械検査済みの証明が組まれました。示されたのは残高の健全性(balance integrity)、「プールが、公に入った以上の価値を払い出せないこと」。ただし対象はプロトコル仕様で、実装とプライバシー特性は対象外だと開発陣自身が明記しています。
3. 量子回復可能性(quantum recoverability)
ZIP 2005 が明記する通り、これは量子耐性ではありません。将来、楕円曲線離散対数問題(ECDLP)が破られて現行プロトコルを止めるとき、Ironwood の資金だけは救出できるという意味です。旧3プールの資金は、停止後アクセス不能になります。
移行にはプライバシーの代金がかかる
最大のコストがこれです。ZIP 318 は「プール横断の移転は、プール間を渡る純額をオンチェーンに必ず露出させる」と正直に書いています。送信元の Orchard ノートも受け取り側の Ironwood アドレスも隠れたままですが、金額とブロック高は公開されます。ネットワーク層で IPアドレスと Orchard 残高が紐づく余地も残ります。
ZIP 318 は正準額面(100 / 10 / 1 ZEC など)への分割と、事前署名した移行トランザクションのランダムな放流でこれを薄めます。問題は実装側で、Basic(1本の可視トランザクションで全額露出)/Private(独自の額面分割)/ZIP 318(標準仕様)の3段階に割れていること。8月1日時点で ZIP 318 完全対応は Vizor・NozyWallet・Cake Wallet、最大手の Zodl 3.8.1(旧 Zashi)は Basic 止まりで、Ywallet は Ironwood 対応をしないと明言しています。
If maximum privacy is essential to you, do not move funds in Zodl until they update to support the safe migration flow.
(最大限のプライバシーが不可欠なら、安全な移行フローに対応するまで Zodl で資金を動かさないでください)
期限はありません。ただし「出口容量は有限」として、丸い額面に割って数日かけて動かすよう勧めています。

変遷|4つ目のプールと、8年前の同じ事件
Zcash が4つ目のプールに来るまで
シールドプールは、証明系を乗り換えるたびに増えてきました。2016年の Sprout(BCTV14)、2018年10月の Sapling(Groth16)、2022年5月の Orchard(Halo 2 / Pallas)、そして Ironwood。前の3回は「証明系が良くなったから移る」でしたが、今回だけ移る理由が供給の検証にあります。
旧プールの末路にも実例があります。Sprout は約8年経ったいまも 22,621 ZEC が取り残されたまま。CoinDesk Research はこれを、出口容量が枯渇していない=Sprout での偽造は起きていなかった事後証拠として前向きに読みます。裏を返せば、Orchard も完全には空にならないということです。

2018年、同じプロジェクトは11か月黙っていた
ほぼ同じ事件が8年前に起きています。Sprout の偽造脆弱性(counterfeiting vulnerability)です。バグの中身は違って、2018年のそれは BCTV14 論文の鍵生成手順そのものの欠陥。証明者(prover)が使わないはずの要素が誤って含まれ、不正な証明者が整合性チェックを回避できました。漏れていたのは回路の制約ではなく、その手前のセットアップです。
決定的に違うのは開示の速度です。2018年3月1日に Ariel Gabizon が発見、知るのは当初4人だけ。10月28日の Sapling でこっそり修正され、公開開示は2019年2月5日。約11か月の秘匿でした。今回は6日です。
移行方式も進歩しました。Sprout → Sapling は透明アドレス(transparent address)をいったん経由する方式で金額が完全に露出しましたが(ZIP 308)、その直系の子孫である ZIP 318 はプール間を直接渡れます。要は8年ぶりに同じ手口を洗練させて再演したわけです。

対応した5組織と、使われないブロック報酬
「ECC・Zcash Foundation・Shielded Labs の3者体制」という理解はもう通用しません。2026年1月7日、ECC のエンジニアリングとプロダクトのチームが全員退職しています。CEO の Josh Swihart が職務の遂行は不可能になったと表明したガバナンス紛争が原因で、Ironwood を実施したのは、その後に組み直された5組織の連合でした。
- ZODL: Josh Swihart が設立。2026年3月に Paradigm・a16z crypto らから $25M超のシードを調達。バグ通報を最初に受け、緊急対応を実行
- Shielded Labs: スイス拠点の寄付ベース組織。バグを発見し Ironwood を提案。創業者の Zooko Wilcox は現在ここの CPO
- Project Tachyon: Sean Bowe が率いる。形式検証の主体
- Valar Group: Dev Ojha の私的寄付組織。新フルノード Zakura を公開
- Zcash Foundation: Zebra を維持し、Zakura 利用者に Zebra の並走を要請
気になるのは資金の流れです。NU6 以降ブロック報酬はマイナー80% / ZCG 8% / lockbox 12% に分かれますが、lockbox には引き出し機構がまだ定義されていません。緊急対応を回した組織は私的寄付とVCマネーで動き、12%は金庫に眠ったままでした。
考察|ZKに要るのは「暗号を信じない一段目の会計」
持ち帰るべきは、「シールドされたシステムで健全性バグが出たとき、何が助けになるのか」です。答えは、暗号を信じない一段目の会計制約でした。
評価できるところ
- 速度: 発見から修正版ハードフォークまで5日、公開開示まで6日。マイナーと取引所を巻き込む協調でこの速度は異例です。8年前は11か月黙っていた、同じプロジェクトが、です。
- 止めてから直す判断: 「回路にパッチを当てると脆弱性が逆算される」というZK特有のジレンマに、プールごと止めて時間を買う答えを出しました。修正diffがexploitのヒントになる領域では他所でも使える型です。
- 直して終わりにしなかったこと: 60日を「検証可能性」に使えたのは、ターンスタイルという会計制約が2019年から入っていたからです。ZKシステムに「暗号が破れても効く一段目のチェック」を仕込む価値が、7年越しに効きました。
弱み・リスク
- ターンスタイルは公平な損失配分の仕組みではない: 最も鋭い批判はここです。フォーラムの指摘は「先にターンスタイルを抜けた者が、旧 Orchard プールの出口容量を消費してしまう」。偽コインが実在したなら偽造者が先に逃げ切り、正直に後から移行する人のトランザクションが通らない、取り付け騒ぎの構造です。移行率が8割に乗った今も超過流出は検出されていませんが、「検出されたとき誰が損を負うのか」への公式回答は稼働から3週間たっても見当たりません。
- 形式検証と監査はまだ途上: zkSecurity の Orchard Action 回路検証は Clear (Prelim) 止まり、OtterSec のレビューは26件の指摘を出したまま報告書ドラフト中、Zellic の Zebra/Zakura 監査は High 4件を出しています。「形式検証済み」の4文字で安心する対象ではありません。
- 移行そのものがプライバシーを削る: 最も使われているウォレットが、最もプライバシーの弱い方式しか持たない状態は当面続きます。しかも移行が進むほど、Basic のまま動かした人の金額とタイミングだけが台帳に残っていきます。

外からの批判は割り引いて読む
Blockstream は6月12日、この件を構造批判に使いました。「偽ノートが発行されて引き出されないままなら、誰にも検出できない」。対案は自社 Liquid の秘匿トランザクション(Confidential Transactions/金額は隠すが残高は公開的に強制される)です。
ただしBlockstream は競合プロトコルの提供者で、これはポジショントークです。「誰にも検出できない」の部分は、まさに Ironwood のターンスタイルが答えようとしている論点でした。
個人的な見解
一番刺さったのは、このバグが数学ではなく API の使い方のミスで起きたことです。取り違え1か所で、通貨の健全性が4年間壊れていました。ZK回路を書くチームは論文の正しさより制約が実際に張られているかを疑うべきで、それは形式検証か制約カバレッジの機械的チェックでしか担保できません。
Hornby が Claude Opus 4.8 のリリース翌日に、自作のAI監査フレームワークと併用して1日で発見・exploit実装・再現まで済ませたことも、同じ方向を指しています。当然、同じ道具は攻撃側にもあります。
同じ構造は暗号の外にもあります。複式簿記の貸借一致がそれで、経理担当者が誠実かを検証できなくても、借方と貸方が合わない一点だけは誰でも機械的に確かめられます。重なっているのは検証の重心をどこに置くかという設計判断の部分で、この一段目を持っていたことが今回の60日を可能にしました。
数字も動きました。8月17日時点(エクスプローラ CipherScan 集計)で Ironwood 3,072,219 ZEC、Orchard 761,949 ZEC。稼働時に366万 ZEC あった Orchard からは79.1%が移行済みで、供給全体の95.5%が検証可能な領域に入っています(Ironwood 残高は新規シールド出力も含むので、移行率は Orchard 側の減り方で見るのが正確です)。3週間でここまで動くとは思いませんでした。市場のほうは対照的で、6月の開示では ZEC が2日で50%下落し清算$1.16億、7月28日の稼働時はほぼ無風でした。
見どころは3つ。残った76万 ZEC がどこで止まるか(Sprout の前例からすると、最後の数万 ZEC は永久に残ると予想しています)、Zodl が ZIP 318 に対応するか、そして超過流出が起きた場合の損失配分に答えが出るか。EU では AMLR により2027年7月10日から匿名性強化通貨の口座が禁じられる締切も控えます。移行率が8割に乗った以上、Ironwood の設計が実務で回ること自体は証明されたと見ています。残る宿題は、誰が損を負うのかを決めないまま出口だけが細くなっていくほうです。
Ironwood は「暗号を信じない検証」がどこまで通用するかの実験なので、今後も追いかけていきます!
以上、「Zcash Ironwood」のリサーチでした!
