ゼロ知識証明 と 必要なことだけ見せる を支える、小さな暗号の部品たちを見ます。 Midnight Academy のフェーズ1〜2でも、これらの言葉が出てきます。むずかしそうですが、たとえ話でいけます。
① コミットメント(commitment)=ふうをした箱
ある値を、中身を見せずに「これに決めた」と先に約束しておくしくみ。
たとえ話:封をした手紙。
- 中に「3」と書いて、封をして相手に渡す(これがコミット)。
- あとで封を開ければ「ほら3だったでしょ」と証明できる(オープン)。
- 封がしてあるのであとから書きかえられない(これをbinding/拘束という)。
- 封の外からは中が見えない(これをhiding/秘匿という)。
ふつうは「ハッシュ(一方向の変換)」で作ります。中身+秘密のかくし味(ソルト)をハッシュにすると、中身は隠れるのにあとで一致を確認できる箱になります。
開発者の視点(Compact): けいじ板チュートリアルの「本人ハンコ」がまさにコミットメントでした。
Compact では persistentHash<...>([...]) でハッシュを作ります。用途を混ぜないよう、pad(32, "bboard:pk:") のようなラベル(ドメイン分離)を一緒に混ぜるのがコツです。
② マークルツリー/マークル証明(Merkle tree / proof)= 名簿の早わかり
たくさんのデータを1つの「代表のハッシュ(ルート)」にまとめ、「その中に確かに入っている」ことを少しの情報だけで証明するしくみ。
たとえ話:トーナメント表。
- たくさんの選手(データ)を2つずつハッシュで combine していって、いちばん上に1つの代表(ルート)を作ります。
- 「私はこの大会に出ていたよ」を証明したいとき、全選手リストを見せる必要はありません。
- 自分からルートまでの一本道(パス)のハッシュだけ見せれば、「確かにこの表の一員」と確認できます。
これの嬉しいところ:
- 大きなデータでも、証明は小さくて速い(全部を見せない/調べない)。
- 「入っているか」を、中身を全部見せずに確認できる → プライバシーと相性ばつぐん。
開発者の視点(Compact):
Compact の公開ステートには MerkleTree<n, T> という箱があります(Ledger ADT(外部リンク・別タブで開きます))。 insert(item) で葉を足し、checkRoot(root) で「このルートに含まれるか」を確認できます。
「履歴も保持する」HistoricMerkleTree もあります。
③ ナリファイア(nullifier)= 使用ずみスタンプ
「この秘密はもう使ったよ」を、だれが使ったかは隠したまま示す、1回かぎりの印。
たとえ話:ライブの半券。
- チケット(秘密)から、そのチケット専用の半券(ナリファイア)が1つだけ作れます。
- 入場のとき半券を箱に入れる。同じチケットで2回入ろうとすると、同じ半券が出て「使用ずみ!」とバレます。
- でも半券からは「だれのチケットか」は分かりません。
これで「二重に使う(double-spend)」を、名前を出さずに防げます。シールドな(隠れた)お金やクーポンに欠かせない部品です。
💡 Midnight が内部で nullifier をどう実装しているかの細部は、公式ドキュメントで確認してください(ここでは考えかたの説明です)。
おまけ:ZK証明には「方式」がある
ゼロ知識証明にはいくつかの方式(しくみのレシピ)があります。名前だけ知っておくと、公式ドキュメントが読みやすくなります。
- Groth16 … 証明がとても小さい。事前準備(setup)が要る。
- PLONK / Halo2 … 使い回しやすい準備など、改良版いろいろ。
- zk-STARK … 事前準備が要らない方向。証明は大きめ。
どれが「正しい」ではなく、目的に合わせて選ぶものです。Midnight が内部でどの方式を使うかの確定情報は、公式ドキュメントで確認してください(ここでは深入りしません)。
3つの部品の関係
これらが組み合わさって、ゼロ知識証明や選んで見せる、そしてシールドな取引が実現します。
開発者として理解すべきこと
- コミットメント=hiding+binding(隠せて、あとから変えられない)。
persistentHash+ ドメイン分離ラベルで作る - マークル証明=大きな集合の所属を、小さく・中身を見せずに証明。Compact の
MerkleTreeで扱う - ナリファイア=匿名のまま二重使用を防ぐ1回かぎりの印
- 方式(Groth16/PLONK/STARK 等)は名前を知っておく。Midnight の採用方式は公式で確認
公式Docsではどこ?
- 概念:Academy Phase 1〜2(外部リンク・別タブで開きます)(commitments / Merkle proofs / nullifiers / selective disclosure)
- Compact:Ledger ADT(MerkleTree など)(外部リンク・別タブで開きます)
- ZK入門:What are ZKPs?(外部リンク・別タブで開きます)
今日のまとめ
- コミットメント=封をした箱、マークル木=トーナメント表、ナリファイア=使用ずみ半券
- どれも「中身を見せずに何かを示す」ための部品
- Compact では
persistentHashとMerkleTreeがそのまま登場する
今はここだけでOK
「封をした箱・トーナメント表・使用ずみ半券」——この3つの絵が浮かべば、ZKの部品箱はバッチリです。
📘 もっと正確に(原文準拠コース)
Academy 原文に忠実な詳しい版はこちら:
つぎに読むページ
➡️ いよいよ Midnight 本体のしくみへ。Midnightのしくみ(二刀流)