こんにちは!弐号です。
仮想通貨の取引所ではユーザの残高以上の十分なコインを保管していることが非常に重要です。
もし取引所の持っているコインの枚数が預かり残高よりも少ないということは取引所は債務超過に陥っており、全ユーザが出金を行おうとすると取りっぱぐれるユーザがいることを意味しています。
2022年11月にアメリカの大手取引所のFTXが経営破綻しましたが、これはFTXがユーザの残高よりも遥かに少ない枚数のコインしか持っていなかったことが公になってしまったことに起因しています。
これにより、FTXユーザはその預け入れ残高の大半を失う可能性が高いです(※日本法人の FTX Japan は本社とは別勘定でコールドウォレットにコインを保管していたため、日本のFTXユーザは全額が変換される見込みです)。
伝統的な銀行でも、債務超過に陥り倒産してしまうと顧客の預金が引き出せなくなってしまうというのと状況としては一緒です。
ですので、ユーザが安心して資産を預け入れられるためには、取引所が十分なコインを保管していることを正しく確認できる必要があり、これを行うための仕組みが「Proof of Reserves (PoR; 準備金の証明)」です。
残念ながら国内の主要な取引所では PoR を行っているところはありませんが、海外の大手取引所では例えば Binance や OKX など、この PoR を行っている取引所が存在します。
この記事では PoR の一般的な意義や仕組みを解説します。
目次
PoR で証明されること
すでに述べたとおり、PoR の意義は
(取引所の保有するコインの枚数) \geqslant (ユーザの預かり残高の合計枚数)
を第三者に対して証明することにあります。
安直なやり方では、この両者の枚数を公開し「これだけ俺はコインを持っているんだ!」と主張することですが、それだけだと本当にその枚数のコインを持っているのかよく分かりませんし、預かり残高も実際より少なく主張しているかもしれません。
そのため、PoRではより高度な数学的な証明が求められます。
伝統的な銀行では現金の保有量や日銀の当座預金の金額を暗号額的に証明することはできませんが、仮想通貨の世界ではどのアドレスに何枚のコインが入っているのかが誰でも分かりますので、こうした情報を組み合わせていくことで数学的に残高の証明を行うことができるのです。
以降では取引所の保有数と預かり残高のそれぞれについて、一般的にどのように残高の証明を行うのかを見ていきましょう。
取引所の保有枚数の証明
取引所の保有枚数の証明では
- 取引所の所有するアドレスの一覧
- 各アドレスが取引所の管理するものであることの証明
を行います。
この二つを数学的に確かめることができれば、あとはブロックエクスプローラなどで各アドレスの残高を取得し、合算すれば取引所の保有するコインの枚数が分かります。
アドレスの一覧については、例えば Binance ではこちらのページからエクセルファイルとして、OKX ではこちらのページから CSV ファイルとしてそれぞれダウンロードできます。
上記のファイルに記載されているアドレスが取引所のものであることについては、電子署名技術を用いることで証明が可能です。
例えば OKX では、「I am an OKX address」という文字列に対して、アドレスに対応する秘密鍵で電子署名を行うことで保有証明を行っています。
これらのデータを総合することで、取引所の保有するコインの枚数を数学的に証明することができます。
ユーザの預かり残高の証明
次にユーザの預かり残高の証明方法を見てみましょう。
単純な方法としては、取引所の各アカウントの保有残高の一覧を個人情報を匿名化した上で公開するというものです。
取引所が不正を行うには、取引所の預かり残高を少なく見せるために意図的に一部またはすべてのアカウントの残高を少なく見せたり、アカウントが存在しないことにすることです。
しかしもしそのようなことをしていたら、この一覧の中の自分の口座の残高がおかしな数値になってしまいますので、不正に気づくことができます。
ごく少数のアカウントの残高のみを不正操作していた場合には、たまたま自分のアカウントの残高は正しくなっており、自分では気づけない可能性がありますが、残高が書き換わってしまっている人が Twitter などでそのことを報告することでいずれは不正がバレてしまいます。
もっとも取引所のユーザ全員がチェックをするとも限りませんから、たまたまバレない可能性もありますが、もし仮にバレてしまった場合にはその取引所の信用は失墜し営業が困難になるでしょうから、取引所としては「賭け」であり、それなりの抑止力にはなると考えられます。
例えば全体の口座数のごくわずかである 0.01% の口座をランダムに抽出し、残高を不正に書き換えたと仮定しても、1万人がチェックを行えばバレる確率は約37%、5万人がチェックすれば成功確率はわずか0.7%程度に下がります。
もちろん、長い間ログインしていないアカウントだけを書き換えるなどで成功確率を上げることはできますが、それでも多くのユーザがチェックをすればするほど指数関数的にバレない確率は減っていきます(※演習問題①)ので、わざわざ PoR などといった面倒くさい作業をやりながら不正を行う取引所があるとは考えにくいと思います。
そもそもの話、残高の多いアカウントの情報を少なく見せないといけませんが、そうしたアカウントは高い確率でアクティブ率の高いユーザですので、かなりバレるリスクがあります。
以上はあくまで「単純な方法」です。
実際には多くの取引所では Merkle ツリーを用いたもう少し高度な検証の仕組みを提供しています。
その理由としてはいくつかあると思われますが、一つは大手の取引所ともなれば全体のアカウント数は1億人を超えます。
世界人口が80億人くらいですので、すごいユーザ数ですね。
Facebookのアクティブユーザは30億人ほどであることを考えれば、それでもまだまだ伸びしろはあるでしょう。
さて、取引所の保有枚数を確認するために全ユーザの残高を公開する方法だと、すべてのユーザの残高を合計する必要があります。
1億人いるとすると約1億回の足し算が必要になるわけですが、さすがにその数になると数秒〜十数秒の時間がかかります。
コインの種類の分だけ計算する必要がありますので、コンピュータを用いたとしてもそれなりに計算するのは大変です。
それ以上に厄介なのがデータ量です。
アカウントあたりのデータサイズを100Bとしても、100億B = 10GiB ものデータ量をダウンロードしないといけません!
現代のネットワーク帯域を考えればできなくはないですが、ちょっと辛いですね。
もう一つの問題がプライバシーです。
各残高が誰のものかを公開する必要はありませんが、SNS などでスクリーンショットを上げているようなユーザは近い残高を保つアカウントの情報から本人が特定されてしまう可能性があります。
そこで登場するのが Bitcoin の Simple Payment Verification (SPV) などでも用いられている Merkle ツリーです。
(https://www.okx.com/proof-of-reserves より引用)
上の画像のように各アカウントの残高をリーフとする Merkle ツリーを構成してあげると、自分の残高が正しく含まれていることは共通の Merkle ルートから確かめられます。
検証に必要なのは、隣のリーフにあたるユーザの残高情報および途中のノードのみであり、この方法を用いれば N
を総アカウント数としておおむね \log_2(N)
個ほどのデータで事足ります。
仮に総アカウント数が1億人だったとしても、27個ほどのノードの情報があれば検証することが可能です。
実際、Binance や OKX ではこの方法で PoR を実施しています。
少し難しい部分もあったと思いますが、取引所は何を証明すればいいのか、そのためにはどういった方法を取ればいいのか、といった内容を押さえれば理解できると思います。
また、理解を助けるための演習問題を一番下に掲載しますので、ぜひ解いてみてくださいね!
ではでは!
演習問題
演習問題① – PoRの不正がバレる確率
取引所は残高の情報を不正に書き換えるアカウントを完全にランダムに選択すると仮定する。
書き換えたアカウントの数の全体アカウント数に対する割合を p
とする。
また N
人が PoR の監査を行ったとする。
このとき、取引所が不正を行っていることをいずれかのユーザが発見する確率を p, N
の関数として求めよ。
さらに実際に p = 0.01\\%
といった非常に低い割合であっても、N
の増加とともに指数関数的に発見される確率があがることをグラフをプロットすることで確認せよ。
演習問題② – PoR監査をやってみよう!
PoR を行っている取引所のアカウントにログイン(なければ新規開設)し、最新の監査データを取得して監査をしてみよ。
(OKXでのやり方は取引所「OKX」の監査 (Proof of Reserves; PoR) を自分でやってみたで紹介しています。)
演習問題回答
演習問題① – PoRの不正がバレる確率
監査を行ったユーザがアカウントを書き換えられていない確率は
ここから先は、会員限定のコンテンツになります。残り全てを見るには、サロン入会案内ページから会員登録をよろしくおねがいします。