Skip to main content

フェーズ2:プライバシーとゼロ知識証明

ZKの部品箱(コミットメント・マークル木)

Academy のフェーズ1〜2で出てくる暗号の部品「コミットメント」「マークルツリー/マークル証明」「ナリファイア」を、やさしい比喩と開発者の視点で。Midnight の Compact での使われ方も。


ゼロ知識証明必要なことだけ見せる を支える、小さな暗号の部品たちを見ます。 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ではどこ?

今日のまとめ

  • コミットメント=封をした箱、マークル木=トーナメント表、ナリファイア=使用ずみ半券
  • どれも「中身を見せずに何かを示す」ための部品
  • Compact では persistentHashMerkleTree がそのまま登場する

今はここだけでOK

「封をした箱・トーナメント表・使用ずみ半券」——この3つの絵が浮かべば、ZKの部品箱はバッチリです。

📘 もっと正確に(原文準拠コース)

Academy 原文に忠実な詳しい版はこちら:

つぎに読むページ

➡️ いよいよ Midnight 本体のしくみへ。Midnightのしくみ(二刀流)