本文へスキップ
buybitcoinsmart

用語集 / ノードとソフトウェア

ブルームフィルタ

別名はBIP37です。

ブルームフィルタとは?
ブルームフィルタは、BIP37のライトウォレットがフルノードに送信し、ノードがそれらに属する可能性の高いトランザクションだけを転送するための、コンパクトな確率的集合です。

BIP-37で規定されています。

この設計は、帯域幅と引き換えに、作者たちがプライバシーだと考えていたものを手に入れようとしましたが、プライバシーは実現しませんでした。Bitcoin Coreは2019年11月にリリースされたバージョン0.19.0で、これらのフィルターをデフォルトで提供することをやめました。長年の研究により、フィルターがどれほど多くを漏らすかが示されたためです。依然としてブルームフィルターに依存しているウォレットは、自分が保有するビットコインの実用的な一覧を、見知らぬ他人のマシンに渡していることになります。

仕組み

状況:BIP37のブルームフィルタリングは、2019年11月にBitcoin Core 0.19.0でデフォルトで無効にされ、BIP157とBIP158のコンパクトブロックフィルターがライトウォレットの役割を引き継ぎました。

ブルームフィルターは、ビットの配列と少数のハッシュ関数で構成されます。項目を挿入するには、その項目を複数の方法でハッシュ化し、各結果を配列の長さで割った余りを求め、そのビットを1に設定します。項目を検査するには、同じ方法でハッシュ化してそのビットを見ます。それらのビットのいずれかが0であれば、その項目は間違いなく挿入されていません。すべてが1であれば、その項目はおそらく挿入されているか、他の挿入によって偶然同じビットが設定されたかです。偽陰性は起こり得ません。偽陽性は起こり得て、その割合が調整用のつまみになります。

BIP37はその計算方法を定めました。フィルターは36,000バイト、ハッシュ関数50個を上限とし、ハッシュ化には32ビットのMurmur関数のバージョン3を用い、ハッシュ番号に0xFBA4C795を掛けた値にクライアントが選んだ調整値を加えたもので初期化します。これを動かすメッセージは3つです。filterloadは接続にフィルターを設定し、filteraddはそれを拡張し、filterclearはそれを削除します。フィルターが設定されると、ピアはブロック要求に対して、80バイトのヘッダー、一致したトランザクション、およびそれらがそのブロックに属することを証明するマークル分岐を含むmerkleblockで応答します。後にBIP111はNODE_BLOOMサービスビットを追加し、ノードがそもそも協力するかどうかを告知できるようにしました。

プライバシーに関する説明は、もっぱらこの偽陽性率に依存していました。フィルターを広げて他人のトランザクションを自分のものと一緒に拾えば、観察者はどれがどれかを判別できないとされていました。それは成り立ちません。2014年に発表された学術研究は、現実的な数のアドレスを含むフィルターがその大半を明かしてしまうこと、そして同じウォレットが読み込んだ2つのフィルターを突き合わせれば偽装が剥がれることを示しました。新しいフィルターで新しいピアに再接続することは、問題を改善するどころか悪化させます。

もう一つの欠陥は、より簡単に説明できます。フィルターを提供するとは、見知らぬ他人の指示でディスクからブロックを走査することであり、したがってどのピアも、回転式ディスクを搭載したノードに膨大な無報酬の作業をさせることができました。バージョン0.19.0のリリースノートが最初に挙げているのは、プライバシー研究ではなく、このサービス拒否の論拠です。

どこで見られるか

ブルームフィルターは主に、2019年より前に書かれたソフトウェアと、その不在を回避する設定ファイルの中に残っています。

bitcoinjライブラリ上に構築されたAndroidウォレットは、BIP37を唯一のチェーンバックエンドとして使用しており、今もインストールされているものがあります。Bisqもそれを必要としたため、そのドキュメントは以前、自分のノードの設定にpeerbloomfilters=1を追加するよう人々に指示していました。この行が証拠です。あるソフトウェアが、自分が運用するノードでブルームフィルタリングを再有効化するよう求めてくるなら、それはリファレンスクライアントが正当な理由で恒久的に無効にした手法を求めているのです。

現代の代替手段は逆の仕組みで動きます。BIP157とBIP158では、ノードがブロックごとに1つのフィルターを構築して全員に公開し、ウォレットは自分のハードウェア上で照合するため、自分のアドレスに関する情報は端末の外に出ません。

ブルームフィルターvs SPV

ブルームフィルターは伝達の仕組みであり、簡易支払い検証(SPV)は信頼のモデルです。両者を混同すると、モデルが仕組みとともに消えたと人々は思い込んでしまいます。SPVとは、チェーンの残りの内容を検証することなく、あるトランザクションが最も作業量の多いチェーンにあるヘッダーのマークルルートの下にあることを確認することです。この考え方は変わっていません。変わったのは、ライトウォレットが検証に値するトランザクションをどのように見つけるかです。以前は自分のアドレスの情報を一部失う形でブロードキャストして運に任せていましたが、今はブロックごとにフィルターをダウンロードして自分の端末で照合します。

混同しやすい用語

よくある質問

ブルームフィルタは今もビットコインウォレットで使われていますか?

まれに使われており、避けるべきです。Bitcoin Coreは2019年11月にバージョン0.19.0でBIP37のフィルタへのデフォルトでの応答を停止し、ライトウォレットは現在、あなたのアドレス一覧を自身の端末に保持するBIP157とBIP158のコンパクトブロックフィルタを使用しています。

ブルームフィルタは、私のウォレットが監視しているアドレスを隠せますか?

いいえ。2014年に発表された研究は、現実的な数のアドレスを含むフィルタがその大半を漏らすこと、そして同じウォレットからの2つのフィルタを突き合わせれば偽陽性による偽装を完全に取り除けることを示しました。

次に読む

関連用語

ノードとソフトウェアのその他の用語

このページを英語で読む