mempoolfullrbf、その論点と結末
現在、Bitcoin Coreにmempoolfullrbfという機能を追加する話題でちょっとした論議が繰り広げられています。
このmempoolfullrbf(以下fullrbfと称す)の説明には、まずはRBF(Replace by Fee)について理解する必要があります。基本的にビットコインの送金は取り消しやキャンセルができません。しかし、RBFという仕組みはブロック承認前(言い換えるとmempoolに存在する場合)であれば、送信した取引データを手数料を高くした取引データで置換できるというものです。このRBFという仕組みはBIP125に準じて実装されていて、送信する取引データに「この取引データはRBFを許容するものですよ」というシグナリングをする必要があります。このシグナルがない取引データに対してはRBFは使えません。
fullrbfは、取引データにシグナルがなくてもRBFを許容する機能で、デフォルトではオフになっています。そもそもシグナルを付与すればRBFできるのに、なぜfullrbfが必要なのか、その動機とはなんでしょうか。シグナリングによるRBFではLNやDLCなど1つのUTXOを共有するコントラクトの場合に問題が発生する可能性があります。2者間によるコントラクトの場合、悪意ある相手がシグナリングせずに取引データをブロードキャストすることができてしまいます。これはPinning攻撃と呼ばれる攻撃手法の一種で、最悪の場合資産を失う危険性があります。fullrbfが導入されればシグナリングがなくてもRBFが可能となり、不正なデータを正しいデータへ置換でき、上記の攻撃を回避することができます。
一方、fullrbfは0承認をサポートしているサービスに問題が生じるかもしれません。例えば、店頭で商品を購入し、店を出てから支払い先のアドレスを自身のアドレスへ変更する、という不正ができてしまいます(店頭なので顔がバレてしまいますが笑)。現状はシグナリングされていない送金であれば、RBFされることはないので0承認を許容してもさほど問題はありません。しかしfullrbfが導入されるとシグナリングがなくても支払いがキャンセルできてしまうので、小売店が抱えるリスクが上がってしまいます。
このようにRBFにはメリットデメリットがありますが、mempoolfullrbfの実装はすでに終わっており、Bitcoin Coreにマージされました。 しかし、このマージ後に再度fullrbfの賛否を問う議論がはじまり、この機能を削除しようというスレッドが立ち上がりました。
---
ある人はRBF、特にfullrbfはmempoolを不安定にさせる(なぜなら一度送信した取引データを交換できるので)ので良くないことだと言っています。また、同氏の意見に賛同するようなツイートを引用したりしていますが、、、よく読めば「現状のビットコインエコシステムを考えると、特にLNなどではBIP125によるopt-in RBFでは足りない」と言っています。そもそもmempoolは不安定なものなので、そこに安定性を求めてはいけない、ブロック承認を待ちましょう、というのがビットコインだと思います。fullrbfは0承認をサポートしているサービスにも影響がでるかもしれませんが、「そのリスクをとるのが商売だよね」という話を実際に0承認で商売をしているオーナーの方から聞きました(この考え方はビットコイナー的で、世間一般の商売人からしたら違うだろうな笑)。
個人的にはmempoolfullrbfは存続するべきだと思います。とこの記事を書いている時に一応の決着はついたみたいで、その結末はこちらから確認できます。
Don't trust. Verify ;)
RBF Pinning攻撃が可能なのは、commitment_txのアウトプットを消費するのに協調する必要がないからで、mempoolfullrbfの導入でPinning攻撃が解決されるわけではない。1つのUTXOを共有するマルチパーティコントラクトは複雑だなぁ。
https://github.com/t-bast/lightning-docs/blob/master/lightning-txs.md#rbf-pinning
https://spotlight.soy/detail?article_id=560bwwbuq