Bloom filterが漏らす全アドレス|12年放置のSPV設計欠陥
スマートフォンのウォレットアプリを起動するたびに、あなたの全保有アドレスが見知らぬサーバーに渡っているとしたら、どう感じますか。
これは仮定の話ではありません。現在もほとんどの軽量ウォレット(SPVウォレット)で起きていることです。そしてこの欠陥は、発見から10年以上経った今も構造的に修正されていません。
Bloom filterという「プライバシー保護のはずだった」仕組み
SPVウォレットは残高確認のたびに外部フルノードへ接続し、「自分のアドレスに関連するトランザクションだけ教えてほしい」とフィルタリングをかけます。このとき使われるのが「Bloom filter(ブルームフィルター)」という確率的データ構造です。
Bloom filterはもともと、保有アドレスをそのまま相手に渡さずに済むプライバシー保護の仕組みとして設計されました。「どのアドレスを持っているか」を曖昧にしたまま照会できるはず、というのが設計の前提でした。
しかし2014年、研究者たちがこの前提を崩す論文を発表します。Bloom filterのパラメータを統計的に解析すると、接続先ノードはウォレットが照会しているアドレスを90%を超える精度で逆算できるというものでした。「曖昧にフィルタリングしているつもり」が、数学的にほぼ無意味だったのです。
なぜ今も修正されないのか
欠陥が判明してから10年以上が経過しました。にもかかわらず、BIP-37が示すSPVのBloom filter設計は根本的には変わっていません。
理由は設計のトレードオフにあります。フィルタリングの精度を下げれば確かにプライバシーは向上します。しかし精度を下げると、関係のない大量のトランザクションデータを受け取ることになり、通信量と処理負荷が大幅に増加します。「軽量で高速」を売りにするSPVウォレットにとって、それは存在意義の否定に近い。
結果として、この問題は「既知の欠陥」として文書化されたまま、現在も放置されています。あなたが日常的に使っているウォレットアプリが、起動のたびに全アドレス情報を外部に漏らしている可能性は今も続いています。
接続先のノードを運営しているのは誰か
ここで問題の核心があります。接続先のフルノードを誰が運営しているか、ウォレット側からは確認できません。
ビットコインネットワークには誰でもノードを立てることができます。悪意を持った第三者が大量のノードを立て、ウォレットからの接続を待ち受けることは技術的に難しくありません。接続してきたウォレットのBloom filterを解析し、90%超の精度で全保有アドレスを割り出す。さらにそのIPアドレスと対応させて記録すれば、「どのIPがどのアドレス群を持つか」というデータが蓄積されます。
これはプライバシーの侵害であるだけでなく、物理的な攻撃リスクの起点にもなりえます。保有量が可視化されれば、標的にされる根拠が生まれます。
フルノードが唯一の根本解決
この問題への技術的な答えは一つです。自分のフルノードを立て、ウォレットの接続先をそこに限定することです。
自分のノードに接続すれば、ブロックチェーンの全データを自前で保持・検証します。外部ノードに「このアドレスの残高を教えてください」と問い合わせる必要がなくなり、Bloom filterの問題はそもそも発生しません。第三者にアドレスを渡さずに残高確認ができる、唯一の構成です。
初回のセットアップには数百GBのストレージと数日の同期時間が必要ですが、Bitcoin Core、Umbrel、RaspiBlitzといった選択肢があり、専用の小型ハードウェアで自宅に常設することもできます。一度構築すれば、以降は差分同期のみです。
軽量ウォレットを「便利だから」と使い続けることは、接続のたびにプライバシーをコストとして支払い続けることを意味します。設計上の欠陥を知った上で選択するのと、知らずに使い続けるのでは、リスクへの向き合い方がまったく異なります。
ウォレットを開く前に、接続先がどこかを確認してみてください。「外部ノード」と表示されているなら、今日から変えることができます。
※本記事は一般的な情報提供を目的としており、投資助言ではありません。
この記事が参考になったら、セルフカストディの具体的な始め方もチェックしてみてください。
LINE登録でセルフカストディの始め方を学ぶ 正しい手順を無料でお届けします