TL;DR

ゼロ知識証明により、一方の当事者 (検証者) は、もう一方の当事者 (証明者) が出した声明の内容をまったく知らなくても、その声明の有効性を判断できます。たとえば、Binance は、個々のユーザーの残高をすべて明らかにすることなく、ユーザーの資金をすべて準備金で裏付けていることを証明したい場合があります。

「準備金証明」は、内部データ(この場合、取引所のユーザーに対する負債である顧客純残高の合計)の改ざんを防止するマークルツリーを使用して構築できます。これを zk-SNARK(ゼロ知識証明プロトコル)と組み合わせると、ユーザーは個々の残高を知らなくても、自分の残高がユーザー純資産残高の一部であることを確認できます。

導入

市場の動向を踏まえると、保管されている暗号資産のセキュリティは重要な話題となっています。ブロックチェーンのユーザーは透明性とオープン性を高く評価していますが、プライバシーと機密性も支持しています。これにより、保管者が保有する資金の準備金を証明する際にジレンマが生じます。多くの場合、透明性、信頼性、データの機密性の間でトレードオフが発生します。

しかし、必ずしもそうである必要はありません。zk-SNARK のようなゼロ知識証明プロトコルと Merkle ツリーを組み合わせることで、すべての関係者にとって効果的なソリューションを見つけることができます。

ゼロ知識証明とは何ですか?

ゼロ知識証明では、一方の当事者 (検証者) が、もう一方の当事者 (証明者) が出したステートメントの内容を知らなくても、そのステートメントの有効性を判断できます。簡単な例を見てみましょう。

あなたには、あなただけが解錠方法を知り得る鍵のかかった金庫があります。この金庫は、例を挙げると、暗証番号を知らない限り、ピッキングしたり、こじ開けたり、開けたりすることはできません。この事実は、実験に参加している友人によっても立証され、検証され、知られています。

あなたは友達に組み合わせを知っていると伝えますが、それを教えたり、友達の前で箱を開けたりはしたくありません。箱の上部には、友達がメモを入れるための穴があります。これをゼロ知識証明にするには、与えられた説明以外に、友達がプロセスに関する追加情報を持たないようにする必要があります。

箱を開けて、メモに書いてあったことを友達に伝え、再び箱を閉じることで、組み合わせを知っていることを友達に証明できます。ただし、どの時点でも組み合わせを明かしていません。

より高度な例については、「ゼロ知識証明とは何か、そしてブロックチェーンにどのような影響を与えるのか」の記事をご覧ください。

なぜゼロ知識証明を使用するのでしょうか?

ゼロ知識証明は、機密情報や詳細を明かさずに何かを証明するのに適しています。これは、不適切に使用される可能性のある財務情報や個人情報を渡したくない場合に当てはまります。

暗号通貨では、秘密鍵を公開したり、デジタル署名したりすることなく、秘密鍵を所有していることを証明できます。暗号通貨取引所は、ユーザーの個々の口座残高などの機密情報を公開せずに、準備金の状態を証明したい場合もあります。

これらの例(および他の多くの例)では、ゼロ知識証明では、データ入力を受け取り、出力として「true」または「false」を返すアルゴリズムが使用されます。

ゼロ知識証明を技術用語で定義する

技術的に言えば、ゼロ知識証明は特定の基準を持つ特定の構造に従います。証明者と検証者の役割についてはすでに説明しましたが、ゼロ知識証明が満たすべき 3 つの基準もあります。

  1. 完全性。記述が真実である場合、検証者は他の情報や検証を必要とせずに、提供された証明によって納得します。

  2. 妥当性。記述が偽である場合、検証者は提供された証拠によって記述の真実性を確信できません。

  3. ゼロ知識。ステートメントが真実である場合、検証者はステートメントが真実であるということ以外の情報を学習しません。

zk-SNARK とは何ですか?

zk-SNARK (ゼロ知識簡潔非対話型知識論証) は、前述のゼロ知識原則に従う証明プロトコルです。zk-SNARK を使用すると、元のハッシュ値 (後述) が何であるかを明かさずに、その値を知っていることを証明できます。また、関連する特定の金額、値、またはアドレスに関する情報を明かさずに、トランザクションの有効性を証明することもできます。

zk-SNARK は、ブロックチェーンや暗号通貨の世界でよく使用され、議論されています。しかし、単純な公開鍵と秘密鍵のペア方式を使用して情報を保護できる場合、なぜわざわざ zk-SNARK を使用するのか疑問に思うかもしれません。ただし、マイナスの残高が含まれていないことと、マークルツリーの合計を保証する数学的証明を実装することはできません。

取引所の準備金の場合、各アカウントの識別子と残高を公開せずに、顧客の残高の 1:1 の裏付けを証明したいと考えています。さらに、zk-SNARK テクノロジーにより、データの改ざんの可能性はさらに低くなります。

マークルツリーとは何ですか?

Binance ユーザーのアカウントの合計資金を提示するには、大規模なデータセットを扱う必要があります。この大量のデータを暗号化して提示する方法の 1 つは、Merkle ツリーを使用することです。膨大な量の情報を効率的に保存でき、暗号化の性質により整合性を簡単に検証できます。

ハッシュ関数

入力を簡潔にエンコードするために、マークル ツリーはハッシュ関数を使用します。簡単に言うと、ハッシュとは、可変サイズの入力から固定サイズの出力を生成するプロセスです。言い換えると、任意の長さの入力をアルゴリズムでハッシュすると、暗号化された固定長の出力が生成されます。

入力が同じであれば、出力も同じになります。つまり、膨大な量のトランザクション データを取得して、それをハッシュ化し、管理可能な出力にすることができます。入力の情報が変更されると、出力は根本的に異なります。

たとえば、100 冊の本のコンテンツを SHA-256 ハッシュ関数に入力すると、次のような出力が得られます。

801a9be154c78caa032a37b4a4f0747f1e1addb397b64fa8581d749d704c12ea

入力の 1 文字 (100 冊の本) を変更すると、ハッシュは次のように完全に異なります。

abc5d230121d93a93a25bf7cf54ab71e8617114ccb57385a87ff12872bfda410

これはハッシュ関数の重要な特性です。データの正確性を簡単に検証できるからです。誰かが SHA-256 アルゴリズムを使用して同じ 100 冊の本のハッシュ化のプロセスを再現すると、出力としてまったく同じハッシュが得られます。出力が異なる場合は、入力が変更されたことを確実に確認できます。つまり、入力間の違いを個別にまたは手動で確認する必要がないということです。これは手間がかかる場合があります。

暗号通貨の世界におけるマークルツリー

ブロックチェーンにトランザクション データを保存する場合、新しいトランザクションはそれぞれハッシュ関数を介して送信され、一意のハッシュ値が生成されます。8 つのトランザクション (A から H) を個別にハッシュしてハッシュ出力を取得するとします。これらは、Merkle リーフ ノードと呼ばれるものです。下の画像では、各文字の一意のハッシュ値を確認できます。A の場合は hA、B の場合は hB、C の場合は hC などです。

次に、ハッシュされた出力のペアを取得し、それらを組み合わせて、新しいハッシュされた出力を受け取ります。たとえば、hA と hB のハッシュを一緒にハッシュすると、Merkle ブランチと呼ばれる hAB の新しいハッシュされた出力が得られます。新しい出力が生成されるたびに、使用されるハッシュ関数に応じて、固定の長さとサイズが付けられることに注意してください。

これで、2 つのトランザクション (例: A と B) のデータが 1 つのハッシュ (hAB) に結合されました。A または B の情報を変更してプロセスを繰り返すと、ハッシュ出力 hAB はまったく異なるものになることに注意してください。

このプロセスは、新しいハッシュのペアを組み合わせて再度ハッシュすることで継続されます (下の画像を参照)。hAB と hCD をハッシュして一意のハッシュ hABCD を取得し、hEF と hGH を同様にハッシュして hEFGH を取得します。最終的に、以前のすべてのトランザクションのハッシュのハッシュ出力を表す単一のハッシュを受け取ります。言い換えると、ハッシュ出力 hABCDEFGH は、それ以前のすべての情報を表します。

上に表示されているグラフは Merkle ツリーと呼ばれ、ハッシュ化された出力 hABCDEFGH は Merkle ルートです。Merkle ルートはブロック内のすべてのトランザクション データを簡潔に暗号的に要約するため、ブロック ヘッダーで使用されます。また、ブロック内でデータが改ざんまたは変更されたかどうかをすばやく確認することもできます。

マークルツリーの限界

CEX 準備金の例に戻りましょう。CEX は、すべての顧客の資産が 1:1 で裏付けられていることを証明したいと考えており、トークン レベルで顧客の UID と純資産保有額 (資産と負債を差し引いたもの) をハッシュするマークル ツリーを構築します。リリースされると (提供されたマークル ルートの所有権を証明するために署名されると)、個々のユーザーは、すべての入力にアクセスしない限り、マークル ツリーが有効かどうかを確認する方法がありません。

取引所がいくつかの入力を忘れた可能性があります。また、負の残高を持つ偽のアカウントを作成して、負債総額を変更する可能性もあります。たとえば、顧客の資産総額が 1,000,000 ドルであっても、-500,000 ドルの残高を持つ偽のアカウントが追加される可能性があります。これにより、準備金目標は 500,000 ドルのみに設定されます。

準備金証明のケースはブロックのマークルルートとは異なります。ユーザーは、ブロックに含まれるすべてのトランザクションをブロックチェーン エクスプローラーで確認できます。ただし、CEX は、セキュリティとデータ プライバシー上の理由から、各アカウントの残高を公開したくありません。顧客も、自分のアカウント残高が公開されることを喜ばないでしょう。この場合、CEX は、他のユーザーの残高を表示せずに、ユーザーの残高の合計が正しいことを証明することはできません。

取引所が採用を検討できる解決策の 1 つは、信頼できるサードパーティの監査人を使用することです。監査人は、提供された Merkle ルートの有効性を最終的に証明する前に、個々のアカウントと準備金をチェックできます。ただし、ユーザーにとって、この方法では監査人および監査に使用されるデータに対する信頼が必要です。データが信頼できる場合は、サードパーティに頼る必要はありません。

zk-SNARKとMerkleツリーを組み合わせる

上記の問題は、zk-SNARK を使用するのに最適なケースです。準備金がユーザーの負債を完全にカバーし、偽造されていないことを証明したいのですが、プライバシーとセキュリティ上の理由から、検証者にユーザーの残高と準備金の正確な構成を見せたくありません。

zk-SNARK を使用することで、暗号通貨取引所は、すべての Merkle ツリー リーフ ノードの残高セット (つまり、ユーザー アカウント残高) が取引所の主張するユーザー資産残高の合計に寄与していることを証明できます。各ユーザーは、プロセスに含まれているため、自分のリーフ ノードに簡単にアクセスできます。また、zk-SNARK は、生成された Merkle ツリーに、総純資産残高がマイナスのユーザーが含まれないようにします (すべてのローンが過剰担保されているため、これはデータの改ざんを意味します)。また、Binance のグローバル ステートの計算、つまり各 Binance 顧客が保有する各資産の総純残高のリストも使用されます。

Binance がこの状況にどのように取り組んでいるかを見てみましょう。まず、Binance は証明したい計算の制約を定義し、それをプログラム可能な回路として定義します。以下は、Binance がモデルで使用する 3 つの制約のセットです。

各ユーザーのバランス セット (Merkle ツリーのリーフ ノード) について、当社の回路は次のことを保証します。

  1. ユーザーの資産残高は、Binance のユーザー純残高の合計の計算に含まれます。

  2. ユーザーの合計純残高はゼロ以上です。

  3. ユーザーの情報をリーフノードハッシュに更新した後、Merkle ツリーのルートの変更は有効になります (つまり、偽造された情報を使用しない)。

その後、Binance は回路に従って Merkle ツリーの構築のための zk-SNARK 証明を生成できます。これにより、取引所は証明が制約を満たしていることを確認しながら、ユーザーの ID と残高をハッシュする膨大な計算を実行することになります。

検証者は証明 (および公開されているオープンソース コード) を検査して、計算がすべての制約を満たして実行されていることを確認します。検証計算は、証明時間に比べて非常に短時間で済みます。

準備金証明がリリースされるたびに、取引所は以下を公開します。

1. 各ユーザーのMerkle証明。

2. すべてのユーザー向けの回路の zk-SNARK 証明と公開入力 (各資産の合計純残高と Merkle ルートのリストのハッシュ)。

関心のある関係者は、Merkle 証明を検証して、個々の残高が Merkle ツリーのルートに寄与していることを確認できます。また、zk-SNARK 証明を検証して、Merkle ツリーの構築が回路で定義された制約を満たしていることを確認することもできます。zk-SNARK ソリューションとそのパフォーマンスの詳細については、ブログ「How zk-SNARKs Improve Binance’s Proof-of-Reserves System」を参照してください。

終わりに

zk-SNARK は、データの整合性とプライバシーの両方を同時に確保するために必要なテクノロジーを提供します。準備金の証明と CEX の透明性の向上への応用は、ブロックチェーン業界への信頼の構築に役立つはずです。多くの人にとって、このような開発は長い間待ち望まれており、CEX にとって極めて重要な時期に実現しました。

これは zk-SNARK の最初のバージョンであり、コミュニティからのフィードバックをお待ちしており、システムを継続的に改善していきたいと考えています。

さらに読む

  • (ブログ) zk-SNARK が Binance の Proof-of-Reserve システムを改善する方法

  • (アカデミー)準備金証明(PoR)

  • (アカデミー)プルーフ・オブ・リザーブとは何か、そしてバイナンスではどのように機能するのか

  • (発表) Binanceがプルーフ・オブ・リザーブ・システムをリリース