メインコンテンツへスキップ

ページの最終更新日時: 2024年4月1日

ゼロ知識証明とは何か

ゼロ知識証明は、証明したい主張そのものを明らかにすることなく、主張の妥当性を証明する方法です。 主張を証明しようとする側を「証明者」とよび、主張の検証に責任を持つ側を「検証者」とよびます。

ゼロ知識証明は、『The knowledge complexity of interactive proof systems(opens in a new tab)』と題された1985年の論文に初めて掲載されました。この論文では、今日広く使用されているゼロ知識証明の定義を提供しています。

ゼロ知識証明プロトコルは、一方(証明者)がもう一方(検証者)に対してある事柄が正しいことを証明する手法で、主張が真であるということ以外には何の情報も伝えないものです。

ゼロ知識証明は長年にわたって改善され、現在では複数の実用的なアプリケーションで使用されています。

ゼロ知識証明が必要な理由

ゼロ知識証明は応用暗号学におけるブレークスルーであり、個人の情報セキュリティの向上を確かなものにしました。 たとえば、「私はX国の国民である」という主張を別の当事者(たとえば、サービスプロバイダー)に証明する方法を考えてみましょう。 この場合、パスポートや運転免許証など、主張を裏付ける「証拠」を提出する必要があります。

しかし、この手法には主にプライバシーの欠如という問題があります。 サードパーティのサービスと共有される個人識別情報(PII)は、ハッキングに対して脆弱な中央データベースに保存されます。 なりすまし犯罪が深刻な問題となっていることで、機密情報を共有するためのより強力なプライバシー保護手段が求められます。

ゼロ知識証明は、主張の妥当性を証明するために情報の開示を必要としないことで、この問題を解決します。 ゼロ知識プロトコルは、ステートメント(「証拠」と呼ばれます)を入力として、妥当性の簡潔な証明を生成します。 この証明は、作成のために使用された情報を開示することなく、ステートメントが真であることを強く保証します。

先の例に戻ると、身分を証明するのに必要な唯一の証拠はゼロ知識証明です。 検証者は、証明のある性質が真であることを確認できれば、主張そのものも真であると確信できます。

ゼロ知識証明のしくみ

ゼロ知識証明により、主張の内容を共有したり、真実を発見した方法を明らかにすることなく、主張が真であることを証明できる方法です。 これを可能とするために、ゼロ知識プロトコルは、入力データを取り、出力として「真」または「偽」を返すアルゴリズムに依存しています。

ゼロ知識プロトコルは以下の基準を満たさなければなりません。

  1. 完全性: 入力が正当な場合、ゼロ知識プロトコルは常に「真」を返します。 したがって、主張が正当で、証明者と検証者が正直に行動する場合、証明は受け入れられます。

  2. 健全性: 入力が無効な場合、ゼロ知識プロトコルが「真」を返すことは理論上不可能です。 したがって、主張が正当でないのであれば、偽の証明者は正直な検証者を欺いて、主張が正当であると信じこませることはできません(ただし、わずかな確率で例外がありえます)。

  3. ゼロ知識性: 検証者が主張の真偽以上の知識を得ることはありません(すなわち、検証者は主張について何の知識も持ち合わせていません)。 この要件により、検証者が証明から元の入力(すなわち、主張の内容)を導き出すのを防ぐことができます。

ゼロ知識証明は、証拠チャレンジレスポンスの3つの要素で構成されています。

  • 証拠: 証明者はゼロ知識証明で隠された情報に関する知識があることを証明したいと考えています。 秘密の情報は証明の「証拠」であり、証明者が証拠を知っていると仮定すると、情報を持っている当事者だけが答えることのできる一連の質問が設定されます。 したがって、証明者はランダムに質問を選ぶことで証明プロセスを開始し、答えを計算し、それを検証者に送ります。

  • チャレンジ: 検証者はランダムに別の質問を選び、その答えを証明者に求めます。

  • レスポンス: 証明者は質問を受け付け、その答えを計算し、検証者に返します。 証明者のレスポンスにより、検証者は証明者が実際に証拠を所持しているのかどうかを確認することができます。 証明者があてずっぽうに正解を得ているわけではないことを確かめるために、検証者はさらに多くの質問をします。 このインタラクションを何度も繰り返すことにより、証明者が証拠を知ったかぶりしている可能性は、検証者が満足するレベルまで大幅に低下します。

以上が「インタラクティブなゼロ知識証明」の構造の説明です。 初期のゼロ知識プロトコルはインタラクティブな証明を使用しており、主張の妥当性を検証するためには、証明者と検証者の間で行ったり来たりの疎通が必要でした。

Jean-Jacques Quisquateの有名なアリババの洞窟の物語(opens in a new tab)は、インタラクティブな証明がどのように機能するかを示す良い例です。 物語の中で、Peggy(証明者)はVictor(検証者)に対して、自分が魔法の扉を開く秘密のフレーズを知っていることを証明したいと思っていますが、フレーズを教えたくありません。

非対話型ゼロ知識証明

インタラクティブな証明は革命的でしたが、二者を用意して繰り返し対話する必要があったため、有用性は限定的でした。 たとえ検証者が証明者の公正さを確信していたとしても、独立した検証に証明は利用できません(新しい証明を計算するには、証明者と検証者の間で新規のやりとりが必要です)。

この問題を解決するために、Manuel Blum、Paul Feldman、Silvio Michaliは、証明者と検証者が共有鍵を持つ最初の非対話型ゼロ知識証明(opens in a new tab)を提案しました。 これにより、証明者は情報自体を提供することなく、ある情報に関する知識(すなわち証拠)を持ち合わせていること示唆できます。

対話型証明とは異なり、非対話型証明は参加者(証明者と検証者)間の一往復のコミュニケーションのみを要します。 証明者はゼロ知識証明を計算するための特別なアルゴリズムに秘密の情報を渡します。 この証明は検証者に送信され、別のアルゴリズムによって証明者が秘密の情報を知っていることが確認されます。

非対話型証明は証明者と検証者の間の疎通を減らし、ゼロ知識証明をより効率的にします。 さらに、一旦証明が生成されると、共有鍵と検証アルゴリズムへのアクセス権を持っていれば、誰でも検証することができます。

非対話型証明はゼロ知識技術のブレークスルーであり、今日の証明システムの開発を促進しました。 これらの証明の種類について以下に説明します。

ゼロ知識証明の種類

ZK-SNARKs

ZK-SNARKは、Zero-Knowledge Succinct Non-Interactive Argument of Knowledgeの頭字語です。 ZK-SNARKプロトコルには、次の利点があります。

  • ゼロ知識: 検証者は、ステートメントについて何も知らなくても、ステートメントの完全性を検証できます。 検証者が持つステートメントについての唯一の知識は、その真偽です。

  • 簡潔: ゼロ知識証明は証拠よりも小さく、すばやく検証することができます。

  • 非対話型: 複数回の疎通を要する対話型証明とは異なり、証明者と検証者は一度しか対話せず、証明は「非対話型」です。

  • 根拠: 証明は「健全性」の要件を満たしているので、不正は極めて稀です。

  • 知識(の): ゼロ知識証明は、秘密の情報(証拠)へのアクセスがないと構築できません。 有効なゼロ知識証明を計算するための証拠を持っていない証明者にとっては、不可能ではないにしても困難です。

前述の「共有鍵」は、証明者と検証者が、証明の生成と検証に使用することに合意した公開パラメータのことです。 公開パラメータの生成(総称して共通参照情報(Common Reference String: (CRS)) は、プロトコルのセキュリティにとって重要であるため、デリケートな作業です。 CRSを生成する際に使用されるエントロピー(ランダム性)が不正な証明者の手に渡ると、偽の証明の計算に利用されてしまいます。

マルチパーティー計算(MPC)(opens in a new tab)は、公開パラメータを生成する際のリスクを軽減する方法です。 複数の当事者が信頼されたセットアップセレモニー(opens in a new tab)に参加し、そこではCRSを生成するために、各々がいくつかの乱数値を提供します。 1人の公正な当事者がエントロピーの一部を破壊する限り、ZK-SNARKプロトコルの計算において健全性が保たれます。

信頼されたセットアップは、ユーザーにパラメータ生成を担当する参加者を信頼するよう要求します。 しかし、ZK-STARKの開発により、信頼されていないセットアップでも証明プロトコルが有効となりました。

ZK-STARKs

ZK-STARKは、Zero-Knowledge Scalable Transparent Argument of Knowledgeの頭字語です。 ZK-STARKはZK-SNARKと似ていますが、以下の違いがあります。

  • スケーラブル: 証拠のサイズが大きい場合、ZK-SNARKよりも証明の生成と検証をすばやく行います。 STARKの証明の場合、証拠が大きくなっても、証明と検証にかかる時間の増加はわずかです(証拠の大きさに対して、SNARKの証明と検証にかかる時間は線形に増加します)。

  • 透明性: ZK-STARKは、信頼されたセットアップではなく、公に検証可能なランダム性を使用して、証明と検証のための公開パラメータを生成します。 したがって、ZK-SNARKと比較して透明性が高まります。

ZK-STARKはZK-SNARKよりも大きな証明を生成するため、一般的に検証のオーバーヘッドが高くなります。 しかし、大規模なデータセットを証明する場合など、ZK-STARKがZK-SNARKよりも費用対効果が高い場合があります。

ゼロ知識証明のユースケース

匿名の支払い

クレジットカードの支払いは、通常、決済業者や銀行、その他の利害関係者(政府当局など)を含む複数の当事者の目に触れます。 金融監視は違法行為を特定する上でメリットがありますが、一般市民のプライバシーも損なわれます。

暗号通貨は、ユーザーがプライベートなピアツーピアトランザクションを行うための手段を提供することを目的としていました。 しかし、ほとんどの暗号通貨のトランザクションは公開ブロックチェーン上で公開されています。 通常、ユーザーは偽名を使用しますが、たとえば、TwitterやGitHubのプロファイルにETHアドレスを記載することで意図的に実際の身元をリンクさせていたり、基本的なオンチェーンとオフチェーンのデータ分析で実際の身元を特定したりすることもできます。

完全に匿名のトランザクションを行うために設計された「プライバシーコイン」というものがあります。 ZcashやMoneroなどのプライバシー重視のブロックチェーンは、送信者/受信者アドレス、資産の種類、数量、トランザクションタイムラインを含むトランザクションの詳細を非公開にします。

ゼロ知識技術をプロトコルに組み込むことで、プライバシーに重点を置いたブロックチェーンネットワークでは、ノードがトランザクションデータにアクセスすることなくトランザクションを検証できるようになります。

ゼロ知識証明は、公開ブロックチェーン上のトランザクションの匿名化にも応用されています。 たとえば、Tornado Cashは、分散型かつ自己理型のサービスで、イーサリアム上でプライベートなトランザクションを行うことができます。 トルネードキャッシュはゼロ知識証明を応用して、トランザクションの詳細を難読化し、金融のプライバシーを保証します。 残念ながら、これらは「オプトイン」のプライバシーツールであるため、違法行為に使用される可能性もあります。 こうした課題を克服するには、最終的に公開ブロックチェーンでプライバシーを標準設定にする必要があります。

個人情報保護

現在のアイデンティティ管理システムは、個人情報を危険にさらしています。 ゼロ知識証明は、個人が機密情報を保護しながらアイデンティティを検証するのに役立ちます。

ゼロ知識証明は、分散型アイデンティティが背景にある場合に特に有用です。 分散型アイデンティティ(「自己主権型アイデンティティ」とも呼ばれます)は、個人識別子へのアクセスを制御する機能を提供します。 納税者番号やパスポートの詳細を公開せずに市民権を証明することは、ゼロ知識技術が分散型アイデンティティを実現する良い例です。

認証

オンラインサービスを利用するには、身分証明とそのプラットフォームへのアクセス権が必要です。 そのためには、名前、メールアドレス、生年月日などの個人情報を提供する必要があります。 長いパスワード覚えておく必要があるかもしれません。忘れてしまうとアクセスを失うリスクもあります。

しかし、ゼロ知識証明は、プラットフォームとユーザーの両方の認証を簡素化することができます。 公開の入力(プラットフォームにアカウントを所持していることを保証するデータなど)と秘密の入力(ユーザーの詳細など)からゼロ知識証明を一度生成しておけば、それを提示するだけでサービスを利用する際の本人確認ができます。 その結果、ユーザーエクスペリエンスが向上し、組織は膨大な量のユーザー情報を保存する必要がなくなります。

検証可能な計算

検証可能な計算とは、ブロックチェーンの設計を改善するためのゼロ知識技術の応用です。 検証可能な計算により、検証可能な結果を維持したまま他者に計算をアウトソースすることができます。 アウトソース先は、プログラムが正しく実行されたことを検証する証拠とともに計算結果を提出します。

セキュリティを損なわずにブロックチェーンの処理速度を向上させるには、検証可能な計算は極めて重要になります。 これを理解するには、イーサリアムをスケーリングするための提案されたソリューションの違いを把握する必要があります。

オンチェーンのスケーリングソリューションであるシャーディングなどでは、ブロックチェーンの基本レイヤーを大幅に変更する必要があります。 このアプローチは非常に複雑で、実装時のエラーによりイーサリアムのセキュリティモデルを損なう可能性があります。

オフチェーンのスケーリングソリューションでは、イーサリアムのコアプロトコルを再設計する必要はありません。 代わりに、アウトソーシングされた計算モデルによってイーサリアムの基本レイヤーのスループットを向上させます。

実際の動作は次のとおりです。

  • イーサリアムは、すべてのトランザクションを処理する代わりに、別のチェーンに実行をオフロードします。

  • その別のチェーンは、トランザクションを処理した後、イーサリアムの状態に適用される結果を返します。

ここでの利点は、イーサリアムは何も実行する必要がなく、アウトソーシングされた計算の結果をイーサリアムの状態に適用するだけですむことです。 これにより、ネットワークの混雑が軽減され、トランザクション速度も向上します(オフチェーンプロトコルでは実行速度が最適化されます)。

チェーンは、オフチェーントランザクションを再実行せずに検証する方法が必要です。そうしないと、オフチェーンの実行に価値はありません。

ここで、検証可能な計算が役に立ちます。 ノードがイーサリアム外でトランザクションを実行すると、オフチェーン実行の正当性を証明するためにゼロ知識証明を提出します。 この証明(

と呼ばれます) は、トランザクションの有効性を保証し、オフチェーン実行の結果を適用してイーサリアムの状態を更新します。その際、実行結果に異議を挟む余地はありません。

ゼロ知識ロールアップValidiumは、有効性証明を使用して安全なスケーラビリティを提供するオフチェーンスケーリングソリューションです。 これらのプロトコルは、数千のトランザクションをオフチェーンで実行し、イーサリアム上での検証のために証明を提出します。 証明が検証されるとすぐに結果を適用できるので、イーサリアムは基本レイヤーの計算を増やすことなく、より多くのトランザクションを処理することができます。

オンチェーン投票における贈収賄および共謀の抑止

ブロックチェーンの投票スキームには、完全に監査可能で、攻撃に対して安全で、検閲に強く、地理的制約がないなど、多くの利点があります。 しかし、オンチェーンの投票スキームでさえ、共謀の問題に対して脆弱です。

共謀は「他人を惑わせる、騙す、もしくは誤解を招くことで、開かれた競争を阻むための調整」と定義される通り、賄賂の提供によって投票に影響を与えるような、悪意のある行為者の形を取ることもあります。 たとえば、アリスがオプションAを好んでいたとしても、ボブから賄賂を受け取ってオプションBに投票するかもしれません。

贈収賄と共謀は、投票によって情報伝達を行うあらゆるプロセス(特にユーザーが自分の投票内容を証明できる場合)の有効性を損ないます。 これは重大な結果をもたらす可能性があり、限られたリソースを割り当てる責任を伴う投票であれば尚更です。

たとえば、クアドラティックファンディングメカニズム(opens in a new tab)は、寄付の多寡で公共プロジェクトの候補の優先順位を評価します。 それぞれの寄付はプロジェクトに対する「投票」としてカウントされ、より多くの票を受け取るプロジェクトがマッチングプールからより多くの資金を得ます。

オンチェーン投票により、クアドラティックファンディングでは共謀がしやすくなります。ブロックチェーントランザクションは公開されているためで、収賄者はオンチェーンのアクティビティを見ると、収賄受領者がどのように「投票」したのかがわかります。 このようにしてクアドラティックファンディングは、コミュニティの総意に基づいて資金を割り当てる効果的な手段ではなくなります。

幸いなことに、MACI(Minimum Anti-Collusion Infrastructure)のような新しいソリューションは、ゼロ知識証明によって、賄賂と共謀からオンチェーン投票(たとえば、クアドラティックファンディングメカニズム)を守ることができます。 MACIは、中央管理者(「コーディネーター」と呼ばれる)が、各個人の投票内容を開示することなく、投票と結果を集計できるようにするスマートコントラクトとスクリプトのセットです。 それでも、投票が正しく集計されたことを検証したり、特定の個人が投票に参加したことを確認したりすることは可能です。

MACIはいかにしてゼロ知識証明と連携するか

最初に、コーディネーターがMACIのスマートコントラクトをイーサリアムにデプロイし、その後、ユーザーはスマートコントラクトに公開鍵を登録することで、投票にサインアップできるようになります。 公開鍵で暗号化したメッセージをスマートントラクトに送ることで投票を行います(有効な投票は、ユーザーのIDに関連付けられた最新の公開鍵で署名されている必要があり、かつ、他の基準も満たさなければなりません)。 投票期間が終了すると、コーディネーターはすべてのメッセージを処理し、投票を集計し、オンチェーンで結果を検証します。

MACIでは、ゼロ知識証明が計算の正確性を確保します。これにより、コーディネーターによる票の誤処理や結果の誤集計が発生することはありません。 これは、a)すべてのメッセージが正しく処理されたこと、b)最終結果はすべての有効な票の合計に対応していること、の2点を検証するZK-SNARK証明の生成をコーディネーターに要求することで達成されます。

したがって、通常は各ユーザーの投票の内訳を共有しなくても、MACIは集計作業中に計算された結果の完全性を保証します。 この機能により、安易な共謀スキームによる影響を阻止することができます。 先述のアリスを買収するボブの例で、この可能性を探ってみましょう。

  • アリスは、公開鍵をスマートコントラクトに送信することで投票への登録を行います。
  • アリスは、ボブから賄賂を受け取って、オプションBに投票することにします。
  • アリスがオプションBに投票します。
  • アリスは暗号化されたトランザクションを秘密裏に送信し、自分のIDに紐付けられた公開鍵を変更します。
  • アリスは、新しい公開鍵を使用して、スマートコントラクトに別の(暗号化された)メッセージを送信することでオプションAに投票します。
  • アリスは、オプションBに投票したトランザクションをボブに見せます(前の公開鍵は、システム上でアリスのIDと紐付いていないため無効です)。
  • メッセージの処理で、コーディネーターはアリスのオプションBへの投票を無視し、オプションAへの投票のみカウントします。 したがって、アリスと共謀してオンチェーン投票を操作しようとするボブの試みは失敗します。

MACIでは、コーディネーターが贈賄者と共謀したり、贈賄したりはしないと信頼することが要求されます。 コーディネーターは、(証明を作成するために必要な)ユーザーのメッセージを復号化することができ、各人の投票内容を正確に検証することができます。

しかし、コーディネーターが公正である場合には、MACIはチェーン上の投票の不可侵性を保証する強力なツールとなります。 クアドラティックファンディング(例: clr.fund(opens in a new tab))では、個々人の投票選択の完全性に大きく依存するため、MACIが広く用いられています。

MACIに関する詳細(opens in a new tab)

ゼロ知識証明の短所

ハードウェアのコスト

ゼロ知識証明を生成するには、非常に複雑な計算が必要であり、専用の機械で効率的に実行することが推奨されます。 こうした機械は高価であるため、一般の個人には手が届かないことがほとんどです。 さらに、ゼロ知識技術を使用するアプリケーションもハードウェアコストを考慮する必要があり、エンドユーザーのコストを増加させる可能性があります。

証明検証のコスト

証明を検証するのにも複雑な計算が必要であり、アプリケーションにゼロ知識技術を導入するコストが増加します。 このコストは、計算にゼロ知識証明を与える場合に特に重要です。 たとえば、ゼロ知識ロールアップでは、イーサリアム上のZK-SNARKの証明を1つ検証するのに最大500,000ガスが支払われます。

信頼の仮定

ZK-SNARKでは、一旦生成されたCRS(公開パラメータ)は、ゼロ知識プロトコルの参加者の間で再利用することができます。 公開パラメータは、信頼されたセットアップセレモニーによって作成されます。ここでは、参加者が公正であると仮定されます。

しかし、参加者の公正さを確実に評価するのは現実的に不可能で、デベロッパーの言葉を信じるしかありません。 ZK-STARKは、文字列の生成に使用されるランダム性が公に検証可能であるため、信頼性を前提とする必要はありません。 一方、ZK-SNARKの証明メカニズムのセキュリティを強化するため、研究者たちは信頼されないセットアップの開発に取り組んでいます。

量子計算による脅威

ZK-SNARKは、暗号化に楕円曲線暗号(

)を使用しています。 今のところECDSAアルゴリズムは安全ですが、量子コンピュータの発展は将来的にセキュリティモデルが破綻する可能性があります。

ZK-STARKは、暗号化に耐衝突ハッシュを使用するため、量子計算による脅威に耐性があると考えられています。 楕円曲線暗号で使われている公開鍵と秘密鍵のペアリングとは異なり、衝突耐性ハッシュは量子アルゴリズムでも突破するのが困難です。

参考文献

この記事は役に立ちましたか?