用語集 / ノードとソフトウェア
簡易支払い検証(SPV)
別名はSPVです。
- 簡易支払い検証(SPV)とは?
- 簡易支払い検証(SPV)は、ブロックヘッダーとマークルブランチのみを用いて、取引が実際のプルーフ・オブ・ワークに裏付けられたブロックに含まれていることを確認します。
サトシ・ナカモトは、2008年のホワイトペーパーの第8節で、サーバーを運用せずにビットコインを使う方法としてこの手法を説明しました。安価なのは、ブロックヘッダーが80バイトだからです。960,000ブロック前後では、ヘッダーチェーン全体がおよそ77MBであるのに対し、2026年8月時点のブロック本体は759GBに達します。これで得られるのは、マイナーがあなたの支払いを確定させたことの証明であり、その支払いがルール上有効かどうかについては何も分かりません。
仕組み
簡易支払い検証は、2つの証拠で1つの問いに答えます。
1つ目はヘッダーチェーンです。各ブロックヘッダーはちょうど80バイトで、直前のヘッダーのハッシュ、内部のトランザクションのマークルルート、タイムスタンプ、そしてマイナーが満たす必要があった難易度ターゲットを含みます。クライアントはヘッダーだけをダウンロードし、各ヘッダーが直前のヘッダーに連結していること、各ハッシュが実際にそのターゲットを下回っていることを確認し、最終的に電力量で価格を付けられるチェーンを得ます。これを偽造するのは、説得力のある嘘をつくことではなく、マイニングをやり直すことを意味します。
2つ目はマークルブランチです。ブロック内のトランザクションは、ルートが1つ残るまでペアごとにハッシュ化されるため、特定のトランザクションがブロックに含まれることを証明するには、そのルートへ至る経路上のわずかな兄弟ハッシュだけで済みます。その数は対数的です。4,096件のトランザクションを含むブロックには12個のハッシュが必要で、これは384バイトに相当し、ブロックが2倍になっても増えるのは1個だけです。あなたのクライアントはブランチをハッシュでたどって上り、その結果をすでに信頼しているヘッダーのマークルルートと比較します。そして、そのトランザクションはそのブロックに含まれているか、含まれていないかのどちらかです。
この2つを組み合わせると、簡易支払い検証が立てる主張が得られます。このトランザクションはあるブロックによって確定され、それ以降、測定可能な量の作業がその上に積み重ねられています。
ここからが欠落部分であり、実はここが役に立つ部分です。包含は有効性ではありません。この手法では、使われているコインが存在したこと、署名が正しかったこと、ブロックがマイナーに正しい補助金を与えたこと、同じコインが別のブランチで使われていないことを示せません。否定的な事実を証明することもできません。支払いを単に省略するサーバーは、何の証拠も残しません。サトシはこの注意書きをホワイトペーパーに直接書き込み、この手法は正直なノードがネットワークを支配している間は信頼できること、頻繁に支払いを受け取る事業者は依然として自前のノードを運用したくなるだろうことを指摘しました。
ビットコインを購入するときにこれが重要な理由
スマートフォンのウォレットに表示される緑のチェックマークは、通常、検証とはまったく言えません。
多くの人が最初の取引所での購入後にインストールするウォレットは、ヘッダーチェーンを構築しません。ある企業のサーバーにあなたの残高を問い合わせ、その回答を表示し、確認済みと表示します。これはホワイトペーパーの手法よりも弱い保証であり、ホワイトペーパーの手法自体もノードより弱いものです。日常的な少額の残高であれば、この信頼の連鎖は問題ありませんし、そうでないかのように装っても誰の助けにもなりません。問題になるのは、金額が痛手になる水準のときです。
実務上の問いは、あなたが誰を、いつまで信頼しているかです。当サイトの取引所レビューには、各プラットフォームが出金を解放する前に何を要求するかが記載されており、その確認数の1つ1つは、その取引所自身のノードからの報告です。コインが届いたとき、それをあなたに表示するウォレットは、また別の誰かのノードからの報告をしています。どちらの当事者も嘘をついている可能性は低いです。しかし両方とも、間違っていることも、オフラインであることも、外部から与えられたチェーンを提供していることもあり、それが起きたときにあなたに知らせることはありません。
プライバシーの側面もあります。2014年のブルームフィルタークライアントに関する研究では、ウォレットが関心を持つアドレスを隠すためのフィルターが、その大半を漏らしていたことが判明しました。そのためBitcoin Coreは2019年11月にバージョン0.19.0でこの機能をデフォルトで無効にし、また新しい軽量ウォレットはリクエストをアップロードする代わりにコンパクトフィルターをダウンロードするようになりました。
2018年9月に簡易支払い検証が見逃していたもの
CVE-2018-17144は、ビットコインの歴史における包含と有効性の違いを最も明快に示す例です。
Bitcoin Core 0.14.0で追加された最適化は、冗長と考えられていたチェックを飛ばしており、その結果、影響を受けたバージョンは、同じ入力を2回使うトランザクションを含むブロックを部分的に処理してしまいました。ある処理の仕方ではノードがクラッシュしました。別の処理の仕方では、マイナーが何もないところからビットコインを生成できるようになりました。このバグは2018年9月17日に報告され、翌日にBitcoin Core 0.16.3で修正されました。実際のネットワークで悪用した者はいません。
もし誰かが悪用していたと想像してください。マイナーが供給を水増しするブロックを生成し、そのヘッダーは完全に本物のプルーフ・オブ・ワークを持ち、マークルツリーも完全に正しいとします。更新されたフルノードはブロックを解析し、重複した入力を見つけて拒否し、送信してきたピアを切断します。簡易支払い検証を行うクライアントは、ヘッダーを確認し、ブランチを確認し、その中の支払いを確認済みと報告します。なぜなら、そのクライアントが利用できる証拠のすべてが有効だからです。クライアントは使われている入力にアクセスできないため、その問いはそもそも生じません。
これがトレードオフのすべてです。簡易支払い検証は、マイニングしている誰かからルールを引き継ぎます。ノードはそうしません。
簡易支払い検証vs Neutrino
簡易支払い検証とNeutrinoはどちらも、ウォレットがフルチェーンなしで機能できるようにし、フィルタリングの向きは正反対です。BIP37に基づく従来の方式は、あなたの関心事をピアに送ります。あなたがフィルターをアップロードし、ピアがあなたの代わりに検索し、ピアはあなたが所有するアドレスを大まかに知ることになります。大半のモバイルライトニングウォレットが使っているBIP157とBIP158の実装であるNeutrinoでは、ノードが全員に向けてブロックごとに1つのコンパクトフィルターを公開します。あなたのウォレットはフィルターをダウンロードし、非公開で検査し、一致したブロックだけを要求します。その後にあなたが行う検証は、同じマークルとヘッダーの計算です。変わるのは、通信相手があなたの探していたものを知らないという点です。