先月、bitcoin-devメーリングリストで「Bitcoin Core 24.0にFull RBFを導入しよう」という提案が話題になりました。これは機能自体の歴史的経緯のほかにも、レイヤー2の設計やコンセンサスの変更 (ソフトフォーク・ハードフォーク)とは異なる「ポリシールールの変更」がネットワーク利用者に及ぼしうる影響という面で興味深い提案です。
今日はRBFとはなにか、なぜ現状ではすべてのトランザクションがRBFではないのか、そしてすべてのトランザクションがRBFになるメリットをまとめます。
RBFとは
RBFとはReplace-by-Feeの略で、あるトランザクションがブロックに取り込まれる前に、より手数料の高いトランザクションを配信することでそのトランザクションを置き換えることができるという「印」です。RBFが設定されているトランザクションは、後から置き換えるかもしれないことを宣言していることになります。
後からトランザクションを置き換えると便利なシチュエーションは、身近なところでは手数料を低く設定しすぎてトランザクションが取り残されてしまった場合に手数料を高く設定し直したり、何らかの理由で送る金額や宛先を変更したい場合が考えられます。
なぜ現状FULL RBFではないのか
さて、ここで疑問に思う方もいるかもしれません。なぜ、RBFは一部のトランザクションがわざわざ指定するもので、すべてのトランザクションに対して有効ではないのでしょうか。
すべてのトランザクションをRBF有効、すなわち未承認時に限って置換可能として扱うことをFull RBFといいます。(現状の仕組みはトランザクションごとに明示的に設定する必要があるため、opt-in RBFと呼ばれています。)
Opt-in RBFの(※再)導入時である2016年には、ビットコイン支払いの待ち時間を短縮しようとゼロ承認で支払いを受け付ける事業者がそれなりにいました。この行動は、メモリプールに入ってきたトランザクションはいつか必ずブロックに取り込まれるという予想に基づいています。
そこでもしFull RBFが導入されれば、そのような決済システムを利用している業者に対して二重支払い攻撃をするツールが簡単に作れてしまうとして、当時はFull RBFではなくOpt-in RBFを導入したという経緯があります。Opt-in RBFであれば、決済業者はRBFが設定されているトランザクションはゼロ承認では受け付けない、という対応で足りるという発想です。
しかし、この発想は間違っています。RBFはトランザクションやブロックの正当性に無関係なことから、コンセンサスに含まれる仕様ではないため、ビットコインノードに改変を加えることでFull RBFと同等の機能を導入することもできます。これは未承認トランザクションと同じUTXOを使う新しいトランザクションが出現したときに、手数料の高い方を残して低い方を消すというロジックを実装することで実現できます。実際に、手数料を取り逃したくないマイニングプールのノードは多くがこのような改変をしていると考えられています。
したがって、opt-in RBFの登場時点ではこのような改変を加えたノードが少なかったとしても、現状では既にネットワークとしてはFull RBFに近い状態であると考えられます。つまり、RBFを設定していないトランザクションに関しても、ゼロ承認での決済は二重支払いリスクが大きいです。
逆に言えば、今では未承認トランザクションで決済してしまう業者がほぼ絶滅したため、Bitcoin CoreへのFull RBFの実装が提案されました。
※…opt-in RBF自体はビットコインの最初期から存在したが、実装に問題があったため2016年の再導入時まで無効にされていたそうです。
FULL RBFにするメリット
Opt-in RBFからFull RBFに変更するメリットは、すなわち「RBFを設定しないこと」が可能なことによるデメリットがなくなることです。