Skip to main content

原文準拠 Phase 2:ゼロ知識証明

1.1 ゼロ知識証明の入門

Midnight Academy Phase 2 / Unit 1 / 1.1 の原文準拠版。ゼロ知識証明とは何か、3つの必須ルール、対話型と非対話型の違い、そしてブロックチェーンでの応用(プライバシーとスケーラビリティ)を正確に・やさしく。


📘 Academy原文準拠 | Phase 2 · Unit 1 · Lesson 1.1 Introduction to Zero-Knowledge Proofs (ZKP) 内容に忠実な日本語版です。原文(英語)・図・動画は公式 Academy(外部リンク・別タブで開きます)を正本に。

「知っていることの中身を見せずに、知っていると証明する」——そんなことができるのでしょうか。

実は、できます。たとえば:

  • 生年月日を見せずに、18歳以上だと証明する。
  • 残高を見せずに、取引に十分なお金があると証明する。
  • パスワードを一度も打たずに、そのパスワードを知っていると証明する。

この技術は実用されています。Zcash はこれを使って何十億もの価値を動かしています。Polygon はこれで Ethereum をスケールさせています。そして Midnight は、プライバシーモデル全体をこの技術の上に築いています。

では、これが実際にどう動くのかを見ていきましょう。

ゼロ知識証明とは、ほんとうは何なのか

ゼロ知識証明(zero-knowledge proof)とは、ある主張が真であることを、その真実以外の情報を一切明かさずに相手に納得させるしくみです。証明する人(prover/証明者)が、検証する人(verifier/検証者)に対して「秘密を知っている」と示すのですが、秘密そのものは隠れたままです。

たとえばこう考えてみてください。金庫の暗証番号を知っていると証明したい、でも番号は教えたくない。ふつうのやり方なら、あなたの目の前で金庫を開けてみせます。ゼロ知識のやり方なら、あなたが選んだ物を金庫に入れてもらい、あとでそれを取り出して返すのです。これなら「私が金庫を開けられる」ことは分かりますが、暗証番号は決して伝わりません

ZKP を聞くのが初めてでも大丈夫。いま完全に腑に落ちなくても問題ありません。コースを進めるうちに、ずっと先で必ず分かるようになります。

どんな ZKP も守るべき3つのルール

正直な証明者・不正な証明者・検証者の3列で、完全性(有効な証明は常に受理される)・健全性(無効な証明は常に拒否される)・ゼロ知識(真偽以外は何も分からない)の3つの性質を対比した図

🖼️ 図のかわりに:ゼロ知識証明が満たすべき3つの性質(完全性・健全性・ゼロ知識)を並べた図がありました。中身は下の説明のとおりです。

ゼロ知識証明がちゃんと機能するには、次の3つの性質が必要です。

  1. 完全性(Completeness):私が真実を語っていて、本当に秘密を持っているなら、いつでも相手を納得させられる。正しい証明は必ず通る。
  2. 健全性(Soundness):私が嘘をついていて秘密を持っていないなら、相手を納得させることはできない(ありえないほどの幸運に恵まれない限り)。偽の証明は拒否される。
  3. ゼロ知識性(Zero-Knowledge):私が何かを証明したあとでも、相手が学ぶのは「主張が真である」ことだけ。証明は、それ以外の知識をゼロしか明かさない。

これらは「あると望ましい」程度のものではありません。どれか1つでも崩れたら、その「ゼロ知識証明」は無価値になります。何も証明できていない(健全性なし)か、通るべきときに通らない(完全性なし)か、情報を漏らしている(ゼロ知識でない)か、のいずれかになってしまうからです。

ZKP には2つの種類があります。対話型(Interactive)非対話型(Non-Interactive) です。

対話型 ZKP と 非対話型 ZKP

証明者と検証者のシーケンス図。上半分の対話型ZKPは初期コミットメントの後にランダムチャレンジとレスポンスを複数回やりとりして検証する流れ、下半分の非対話型ZKP(Fiat-Shamir変換)はハッシュ関数でチャレンジを置きかえ単一の証明オブジェクトを生成して検証する流れを示した図

アリババの洞窟の図。洞窟の入口から左の通路と右の通路が伸び、奥でつながる鍵のかかった扉に至る経路を示し、検証者は外で待ち証明者が洞窟に入るという設定を表した図

🖼️ 図のかわりに:対話型 ZKP(prover と verifier が何度もやりとりする)と非対話型 ZKP(prover が1人で証明を作り、誰でもあとから検証できる)を対比した図がありました。

対話型 ZKP(Interactive ZKPs)

初期のゼロ知識証明は、対話型の証明(interactive proofs) として定式化されました。

対話型 ZKP では、prover と verifier が何度もやりとりします——証明を完成させるために、しばしば複数ラウンドの「チャレンジ(問いかけ)と応答」を繰り返します。

対話型 ZKP を説明する古典的な例が アリババの洞窟(Ali Baba cave) の話で、正直なところ、これがいちばん分かりやすい説明だと思います。

🖼️ 図のかわりに:円形の洞窟の絵がありました。入口から2本の道が伸び、奥でつながっていて、そのつなぎ目に鍵のかかった扉がある、という設定です。

たとえば、円形の洞窟があって、2本の道が奥の鍵のかかった扉で出会っているとします。私は「その扉を開けるパスワードを知っている」と主張します。パスワードを教えずに、どう証明すればよいでしょうか。

  1. あなたは外で待ち、私は洞窟に入って、左右どちらかの道をランダムに選んで進みます。
  2. あなたは入口まで来て、どちら側から出てきてほしいかを叫びます。
  3. 私はその側から出てきます(必要なら扉を使って)。
  4. これを何度も繰り返します

もし私がパスワードを知らなければ、入った側と反対の道をあなたが指定したときにボロが出ます。20ラウンド繰り返せば、私がごまかせている確率は100万分の1未満まで下がります。

この「チャレンジと応答」のやりとりを 対話型証明(interactive proof) と呼びます。対面ではうまく機能しますが、ブロックチェーンには向きません。ネットワーク上のすべてのノードと会話するわけにはいかないからです。

非対話型 ZKP(Non-Interactive ZKPs)

ここからが面白いところです。1980年代に Fiat と Shamir が、対話型の証明を非対話型に変えるシンプルな方法を見つけました——verifier のランダムなチャレンジを、ハッシュ関数で置きかえるのです。

あなたが「左から出てきて」と叫ぶかわりに、私が自分の証明の現在の状態をハッシュして、そのランダム性を自分で生成します。ハッシュ関数の出力は私には操作できないので、これはまるで買収もごまかしもできない、公平なロボット検証者を雇っているようなものです。

これで私は証明を1人で丸ごと作り、ブロックチェーンに投稿でき、誰でもあとから検証できます。会話はいりません。

その最も有名な例が zk-SNARKs(Zero-Knowledge Succinct Non-interactive Argument of Knowledge) です。この長たらしい名前は、要するに「短くて・対話のいらないゼロ知識証明」という意味で、ブロックチェーンにぴったりです。

非対話型の証明は、ブロックチェーン用途でとても重要です。オンチェーンに投稿して、prover と verifier の生のやりとりなしに、あとから誰でも検証できるからです。

ZKP の応用

ZKPの応用例の図。プライバシー(Zcash=取引の詳細を隠す、本人確認=身分証なしで年齢を証明、Midnight=選択的開示)と、スケーラビリティ(zk-Rollups=取引をまとめて処理、Mina=小さなブロックチェーン証明、ライトクライアント=フルチェーンなしで検証)の2分野に分けて応用例を列挙した図

ゼロ知識証明は、ブロックチェーン技術におけるゲームチェンジャーになりました。とりわけ、2つの重大な課題——プライバシースケーラビリティ——を解決する点で重要です。

🖼️ 図のかわりに:ZKP の主な応用領域として「プライバシー/秘匿性」と「スケーラビリティ/効率」の2つを示した図がありました。

当初、ZKP はプライバシー強化の手段として注目されましたが、いまではブロックチェーンのスケーラビリティと効率の向上にも不可欠だと分かってきました。順に見ていきましょう。

1. プライバシーと秘匿性(Privacy and Confidentiality)

Bitcoin や Ethereum のような公開ブロックチェーンでは、取引の詳細がふつう台帳上に丸見えです。ZKP を使えば、機密データを隠したまま、取引が正しいことを保証できます。

たとえば Zcash は zk-SNARKs を使って shielded transactions(遮蔽された取引) を実現しています。送り手・受け手・金額を暗号化できる一方で、取引に添えられた証明が「残高のつじつまが合っていて、二重支払い(double-spend)が起きていない」ことをネットワークに納得させます。つまりユーザーは、セキュリティを犠牲にせずに金銭的プライバシーを得られます。同様に、ZKP はさまざまなプラットフォームで、トークンの秘匿転送や、秘匿スマートコントラクトにも使えます。

もう1つの例が本人確認(identity verification) です。ID書類を丸ごとさらすかわりに、ZKP を使えば「私は成人です」とか「有効な運転免許を持っています」と、名前・住所・ID番号を明かさずに証明できます。これは GDPR のようなプライバシー法への準拠や、ブロックチェーンアプリでのユーザーデータ保護に、大きな意味を持ちます。

2. スケーラビリティと効率(Scalability and Efficiency)

ブロックチェーンにはスケーラビリティの限界があります。ふつう、すべてのノードがすべての取引やスマートコントラクトの各ステップを検証しなければならないからです。ゼロ知識証明は、計算を圧縮・集約して、信頼を保ったまま処理を肩代わりする方法を提供します。

代表的な応用が、Ethereum 上の zk-Rollups です。何百もの取引をオフチェーンで処理し、「すべての計算が正しかった」ことを証明する簡潔な(succinct)ZKP(ふつうは SNARK) を生成します。このたった1つの証明だけをオンチェーンに投稿し、Ethereum のノードはその証明だけを検証すればよいので、オンチェーンの計算量が減ります。

Ethereum のベースレイヤは現在 Groth16 SNARK の検証のみをサポートしています。一方、多くの Layer-2 システム(たとえば StarkNet)は、ハッシュベースの証明系(すなわち STARKs) を使ってオフチェーンで計算します。それらは最後に Groth16 の証明でラップされて、Ethereum 上で検証されます。このハイブリッド方式は、STARK のスケーラビリティと透明性を、SNARK の簡潔な検証コストと組み合わせます。

こうしたシステムの成功は、SNARK と STARK の「S」——すなわち succinctness(簡潔性:短くて検証しやすい証明)scalability(スケーラビリティ:大きな計算でも効率よく証明を作れること)——にかかっています。これにより、第三者を信頼せずに、何百もの取引を1つ分のスペースとコストで確定できます。

もう1つの強力な応用が light clients(軽量クライアント) です。たとえば Mina再帰的な zk-SNARK(recursive zk-SNARKs) を使い、誰もがチェーンの全履歴をダウンロードせず、ほんの数キロバイトのデータだけでブロックチェーンの状態を検証できるようにしています。これを可能にしているのも、やはり簡潔性です。

要するに、ZKP は proof-of-computation(計算の証明)や proof-of-history(履歴の証明)を圧縮し、最小限の帯域・労力で、大きな計算を信頼不要に検証できるようにするのです。

開発者として押さえる点

  • ZKP は「真実以外は何も明かさず、主張の真を納得させる」しくみ。登場人物は prover(証明者)verifier(検証者) の2者。
  • 必須の3性質は Completeness(完全性)/ Soundness(健全性)/ Zero-Knowledge(ゼロ知識性)。1つでも欠けると証明は無価値。
  • 対話型は複数ラウンドのチャレンジ&レスポンスで成立し対面向き。非対話型Fiat–Shamir(ランダムなチャレンジをハッシュ関数で置きかえる)でオフライン化でき、オンチェーン投稿・後追い検証に向く。
  • zk-SNARKs は「短く・非対話」なゼロ知識証明。Ethereum ベースレイヤは Groth16 SNARK の検証のみ対応、STARKs は Groth16 にラップして検証する構成が一般的。
  • ブロックチェーンでの2大価値はプライバシー(Zcash の shielded transactions、本人確認の「成人である」証明など)とスケーラビリティ(zk-Rollups、Mina の recursive zk-SNARKs による light clients)。
  • キーワードは succinctness(簡潔性)scalability(スケーラビリティ)。Midnight のプライバシーモデルも、この ZKP の土台の上に成り立っている。

やさしい版・公式へ

つぎに読むページ

➡️ 原文準拠コースの入口へ戻る。このコースについて(次のレッスンは順次追加します)