BIP: 133
Layer: Peer Services
Title: feefilter message
Authors: Alex Morcos <morcos@chaincode.com>
Status: Deployed
Type: Specification
Assigned: 2016-02-13
License: PD
概要
新しいメッセージ「feefilter」を追加する。このメッセージは、指定された手数料率を下回る手数料のトランザクションについて、ノードへ inv を送らないようピアに指示する役割を持つ。
動機
限定的なメンプールという概念は、マイニングされない低手数料の攻撃・スパムトランザクションへの対策として、Bitcoin Core 0.12 で導入された。また、手数料不足で最近拒否されたトランザクションへの繰り返しの要求を防ぐための拒否フィルターも導入された。これらの手法は、ノード上のリソース使用量が制御不能になることを防ぐのに役立っている。
しかし、これらの手法の効果には限界がある。拒否フィルターはブロックごとにリセットされるため、より長い期間にわたって inv されたトランザクションは再要求されてしまい、最初の要求そのものを防ぐ手段は存在しない。さらに、メンプールに受理されたすべてのトランザクションについて、各ピアへ、または各ピアから、少なくとも 1 回は inv データが送信されるが、あるピアへ送った inv が、そのトランザクションの手数料が少なすぎることを理由に getdata 要求につながらない、ということを知る手段は存在しない。
feefilter メッセージを受信すると、ノードは inv を送信する前に、あるトランザクションの手数料率が特定のピアが現在要求している最低値を下回っているかどうかを知ることができ、したがってそのピアへそのトランザクションの inv を中継することを省略できる。
仕様
- feefilter メッセージは、pchCommand == “feefilter” であり int64_t を含むメッセージとして定義される
- 「feefilter」メッセージを受信すると、ノードは feefilter メッセージ中で提供された手数料率(1 キロバイトあたりの satoshi として解釈される)を下回るトランザクションの inv をフィルタリングすることが許可される。ただし必須ではない。
- 手数料フィルターはトランザクション用のブルームフィルターと加算的に作用する。したがって SPV クライアントがブルームフィルターを読み込み feefilter メッセージを送信した場合、トランザクションは両方のフィルターを通過した場合にのみ中継される。
- mempool メッセージから生成された inv も、手数料フィルターが存在する場合はその対象となる。
- プロトコルバージョンが 70013 以上であることを確認することで機能の発見が可能になる
考慮事項
この変更によって、ネットワーク全体にわたるトランザクションの伝搬効率が悪化することはないはずである。一般に、あるノードのメンプールに受理されなかったトランザクションは、そのノードによって中継されない。本メッセージで実装される機能は、そうしたトランザクションのみをフィルタリングすることを意図している。ノードのメンプール最低手数料が、あるピアが認識しているフィルター値よりも実際には低い、という少数のエッジケースが存在しうる。この場合、両者の間の手数料率を持つトランザクションは、新たに抑制されることになる。
「-whitelistforcerelay」オプションが設定されている場合、feefilter メッセージはホワイトリスト登録済みのピアには送信されない。この場合、トランザクションはメンプールに受理されていなくても中継される想定である。
ノードが、自身のメンプール最低手数料を下回る可能性のある情報をブロードキャストすることで匿名性が損なわれるという、プライバシー上の懸念がある。この懸念を緩和するため、実装はブロードキャストするフィルター値をわずかなランダム性を持たせて量子化するほか、メッセージは各ピアへ個別にランダムに分布したタイミングでブロードキャストされる。
ノードが prioritisetransaction を用いて、実際の手数料率がノードのメンプール最低手数料を下回りうるトランザクションを受理している場合、すべての可能な txid にさらされることを確実にするため、手数料フィルターを無効化することを検討したいと思うかもしれない。
後方互換性
旧来のクライアントは、この変更後も完全な互換性と相互運用性を保つ。また、本 BIP を実装するクライアントは、feefilter メッセージを一切送信しないことを選択できる。
実装
https://github.com/bitcoin/bitcoin/pull/7542
著作権
本文書はパブリックドメインに置かれる。
