主なポイント
2022年11月、Binanceは、ユーザーが保有資産を検証できるように、Merkleツリー暗号を利用したProof of Reservesシステムをリリースしました。
Binance は現在、ゼロ知識証明の一種である zk-SNARKs を実装することでソリューションを改善しました。
ユーザーは、各アカウントの合計純残高がマイナスでないこと、およびすべてのユーザー資産が Binance が主張するユーザー資産の合計純残高の一部であることを、プライベートかつ安全な方法で確認できるようになりました。
Binance の新しい準備金証明ソリューションの内部を見てみましょう。zk-SNARK と Merkle ツリー情報を組み合わせることで、ユーザーは Binance の準備金の状態を確認するための新しい、改善された方法を利用できるようになります。
過去数か月間、Binanceの開発チームは高度な支払い能力証明ソリューションの構築に懸命に取り組んできました。FTXの崩壊をきっかけに業界を巻き込んだ信頼の危機の中で、このようなツールは中央集権型暗号通貨取引所にとって不可欠なものとなっています。Binanceに保管されているユーザー資金は1:1の比率で裏付けられており、さらに準備金も用意されています。これをシームレスに一般に証明する方法を見つけることは、業界の信頼を回復するためのBinanceの計画の主要な部分となっています。
2022 年 11 月、私たちはマークルツリー暗号化技術を活用した準備金証明システムをリリースし、ユーザーが Binance での保有資産を検証できるようにしました。これは Binance のユーザー資金の透明性推進における前進ではありますが、このソリューションの初期設計には 2 つの欠点がありました。
ユーザーのプライバシーを保護するために、Merkle 証明のリーフ ノードはユーザーの保有資産のハッシュを表します。そのため、Merkle ルートはリーフ ノードの残高情報の合計を反映できませんでした。
準備金の検証を受けているエンティティは、ツリー内のどこかに偽のアカウントの下にマイナスの残高を追加して、必要な準備金の合計を少なく見せる可能性があります。Vitalik Buterin のブログに掲載されている次の図は、そのような悪意のある Merkle ツリーの例を示しています (ただし、この場合、ルートはすべてのリーフ ノードの残高の合計を反映しているため、プライバシーの問題が発生する可能性があります)。
これらの欠点を改善し、Binance の準備金証明システムを強化できるソリューションができました。ゼロ知識証明プロトコルである zk-SNARK を利用することで、次のことを証明できます。
マークルツリーのすべてのリーフノードは、Binance が主張する各資産のユーザー総残高に貢献しています。
マークルツリーには、合計純残高(ユーザーが保有するすべての資産の合計 USD 価値)がマイナスのユーザーは含まれていません。
マイナス残高とパフォーマンスについて
Binance は証拠金、暗号ローン、先物取引商品を提供しているため、各ユーザーの各暗号資産の残高は資産と負債で構成される場合があります。ユーザーの特定の暗号資産の残高はマイナスになる可能性がありますが、すべての暗号資産の合計純残高はマイナスにはなりません (すべてのローンは完全に担保されているため)。
この架空のシナリオでは、アリスがバイナンスに 10,000 BUSD を預け、4,000 BUSD を担保として 2 BNB を借り入れたとします (1 BNB = 1,000 BUSD のレートで、バイナンスは常に過剰担保していると仮定)。次の表はアリスのバランスシートを示しています。
その後、アリスがボブ(同じく 10,000 BUSD を預けていた)と 1 BNB を 1,000 BUSD で取引すると、取引が成立した後のバランスシートは次のようになります。
この場合、アリスの BNB 残高は -1 になりますが、これはマークル ツリーの有効なノードではなく、1 つの資産 (BNB) のみをカバーします。ただし、純残高の合計を見ると、アリスは依然として 10,000 です。
もう 1 つの課題は、Binance のユーザー ベースの規模の大きさです。実行可能なソリューションは、数千万人のユーザーに対してユーザー証明と zk-SNARK 証明を生成する必要があります。ユーザーの中には、当社のプラットフォームで 300 を超える暗号資産を保有している人もいます。
全体として、私たちは合理的な時間枠内に以下の事実の証拠を提供したいと考えています。
各 Binance ユーザーの資産は、スナップショットに表示される当社が主張するユーザー総残高の一部です。ユーザーは、ブロックチェーン エクスプローラー (Ethereum ウォレットの場合は Etherscan、BNB Chain ウォレットの場合は BscScan など) を使用して、Binance が管理するアドレスに保持されている資産に対して、当社が主張するユーザー総残高を確認できます。
各ユーザーの純残高の合計は非負です。つまり、Binance は検証済み準備金の規模を人為的に減らすために、残高がマイナスのダミーアカウントを作成しなかったということです。
zk-SNARK とは何ですか?
ソリューションの詳細に入る前に、ゼロ知識証明メカニズムの概要を簡単に説明します。zk-SNARK のようなゼロ知識プロトコルを使用すると、一方の当事者 (証明者) がもう一方の当事者 (検証者) に対して、証明者が特定の制約の下で特定の入力を使用して特定の計算を正確に実行したことを、入力を開示することなく証明できます。計算には時間がかかる場合がありますが、基礎となる数学的メカニズムにより、検証者は証明を迅速かつ安全に評価できます。
証明者 (Binance) は、証明したい計算の制約セットを定義することから始まります。制約は、高水準プログラミング言語 (この場合は、gnark のフォーク バージョン) で表現できる回路で定義されます。
次に、証明者は大量の計算を実行し、すべてのユーザーの ID とバランスシートをハッシュして、計算が以前に設定された制約を満たしていることの証明を生成します。そのためには、計算トレース (証人) と公開または非公開の入力を使用します。
検証者 (ユーザー) は証明を取得し、回路の公開入力を使用してそれを検証し、計算がすべての制約を満たして正確に実行されたことを確認します。検証計算は、証明時間に比べて非常に短時間で済みます。証明者が事前に定義された回路で証明を生成しない場合、検証に合格する有効な証明を生成することはできません。
zk-SNARKs の詳細を詳しく知りたい場合は、この一連の記事を参照してください。
私たちのソリューション
アップグレードされた準備金証明ソリューションの基本的な構成要素は、依然として Merkle ツリーです。上記の例では、次のようになります。
Merkle ツリーに加えて、各 Binance 顧客が保有する各資産の合計純残高のリストを表すグローバル状態も維持します。
準備金を証明するために、Merkle ツリーの構築のための zk-SNARK 証明を生成します。各ユーザーの残高セット (Merkle ツリーのリーフ ノード) について、回路は次のことを確認します。
このユーザーのすべての資産の残高は、上記のグローバル状態リストに含まれています。
ユーザーの合計純残高はマイナスではありません。
Merkle ツリー ルートの変更は、このユーザーの情報をリーフ ノード ハッシュに更新した後に有効になります。
実装の詳細については、この技術仕様と回路(制約)のソースコードを参照してください。
埋蔵量を証明するたびに、当社は以下の情報を公表します。
1. マークル証明: 各ユーザーのハッシュ (アリスの場合、上の図では青いノードで表されます)。
2. すべてのユーザー向けの回路のzk-SNARK証明と公開入力(各資産の合計純残高のリストとMerkleルートのハッシュ)。
Merkle 証明を検証することで、ユーザーはバランスシートが Merkle ツリーのルートに含まれていることを確認できます。zk-SNARK 証明を検証することで、ユーザーは Merkle ツリーの構築が回路で定義された制約を満たしていることを確認できます。
このソリューションのセキュリティは、証明キーと検証キーの設定に大きく依存しています。私たちは、キーの分散設定に取り組んでいます。既存の分散型信頼セットアップ セレモニーに関しては、Ethereum セレモニーが良い例です。私たちは、セットアップを信頼不要にする MPC ソリューションの実現に非常に近づいています。
パフォーマンス
残高を含める必要がある Binance ユーザーの数が多すぎるため、すべてのユーザーを一度でカバーする単一の Merkle ツリー構築の証明を得る方法はありません。この解決策は、ユーザーを 864 人ずつのバッチに分割して、小規模な回路と並列証明手順を実現することです。
864 人のユーザーを含み、各ユーザーが 350 種類の資産を所有しているバッチの場合、各資産残高は [0, 2^64-1] の範囲内にあると仮定します。32 コア 128 GB サーバーでは、zk 証明生成時間は約 110 秒、証明検証時間は 1 ミリ秒未満です。
Binance は、2 時間ですべてのアカウントの証明を生成するために、同時に 1000 の証明者を起動します。この証明者サーバーの 1 時間のコストは約 0.56 USD なので、すべてのユーザーをカバーするすべての zk 証明を生成するための総コストは約 1000 USD になります。
結論
この新しいソリューションによって生成されたユーザー向けの証明の最初の反復は、その後の準備金証明の発表で提供されます。また、ユーザーデータプロセッサ、証明者、回路、検証者はオープンソース化されているため、当社と同じモデルに依存するすべての中央集権型取引所は、ユーザーと資産の証明を簡単に生成できます。
これがデジタル資産業界の透明性を新たなレベルに押し上げるのに役立つことを願っています。また、Vitalik のブログで言及されているソリューションを実装してパフォーマンスを向上させることにも取り組んでおり、これにより、より低コストでより頻繁に証明を提供できるようになります。
これは zk-SNARK の最初のバージョンなので、コミュニティからのフィードバックをお待ちしており、システムを継続的に改善していきたいと考えています。
コードと参考資料
ソースコード
Binance 準備金証明: マークルツリーとは何か
Binance アカデミー - ゼロ知識証明による暗号通貨の透明性の向上
Vitalik のブログ: 安全な CEX の実現: 支払い能力の証明とそれ以上



