最近はビットコインの手数料相場が低めで推移しているため、送金が詰まってしまったという方は少ないかもしれません。しかし、ギリギリの送金手数料でトランザクションを配信した後、手数料相場が上昇してしまって送金が取り残されるという経験をしたことがあるビットコイナーは多いはずです。

個人の送金であれば、同じトランザクションの手数料を増やして再配信することができます。このReplace-by-feeという挙動が既定になって数年が経ちました。

Bitcoin Core 24.0からのFull RBF既定化についての議論まとめ
この1週間ほど世間の話題はFTXの信用不安問題で持ちきりですが、ビットコイン開発者の多くは全然違う論争に巻き込まれていました。Bitcoin Coreの次期リリースである24.0において、ノードのポリシーとしてFull RBF (mempoolfullrbf)というものが導入される予定のところ、これに反対する意見が出たためです。 結果的には導入継続という流れになりましたが、このように誰でも意見・議論できることがビットコイン開発における健全性維持の1つの仕組みです。 それでは議論の内容を見ていきましょう。 RBFとは RBFとはReplace-by-Feeの略で、配信したがまだブロックに取り込まれていないトランザクションを、より高い手数料を払って置換することをいいます。トランザクション作成時にそのトランザクションにRBF有効のフラグが立てられている場合、同じコインを使用する別のトランザクション、つまり相反するトランザクションを配信して古いものを置き換えることができます。(置換されるトランザクションより手数料が高いこと、置換されるトランザクションがまだブロックに取り込まれていない

しかし、「事前にトランザクションを署名して手元に置いておく」ようなユースケース、つまり将来的にRBFすることが必ずしもできないケースも存在します。そういうときにはCPFP(Child-Pay-For-Parent)という、「余分に高い手数料を払う子トランザクションとセットで取り込んでもらう」手法もあります。手数料が安すぎるトランザクションが取り込まれれば、その次の手数料が高すぎるトランザクションも取り込めるので、マイナーがトータルで見れば相場以上の手数料収入を得られるというロジックです。

CPFPについては下記の記事でも触れています。

Mempool.spaceの「トランザクションアクセラレーター」はマイニングやメモリプールにどういう影響を与えるのか
Bitcoin 2023カンファレンスではビッグな発表がいくつかありました。その中でも3本の指に入るものにmempool.spaceエクスプローラーを運営するMempool社が「トランザクションアクセラレーター」サービスの提供を開始するという発表がありました。 これはユーザーがMempool社に手数料を払うことで、Mempool社と提携したマイナーが任意のトランザクションを(トランザクション内で支払った手数料に関わらず)次のブロックに入れてくれる、というものです。 このサービスの存在意義について、RBFやCPFPといった方法でトランザクションの手数料を後から追加することができるのになぜ?という声もありました。また、もしもこのサービスの利用が増えてしまうとビットコイン自体に様々な弊害が生まれることを懸念する意見もあります。 この記事では新サービスの概要と想定される影響について情報を整理します。 ビットコイントランザクションの配信と承認 今回発表されたMempool Transaction Acceleration Marketplaceには主に2つの用途が考えられます。「ノン

それでも、ビットコインノードがトランザクションを伝播する際の方針に「トランザクションの手数料率が1 sat/vbyte以上」という原則があるため、ごく少額のダストアウトプットを含めるなど様々な工夫が必要になってきました。それが、Bitcoin Core 28および29のリリースによって一部のケースにおいて撤廃されたので、今日はレイヤー2のビットコイントランザクションの手数料の扱い方がどう変わるかについて調べました。

マニアックな話ですがお付き合いいただければ幸いです。

・「事前に手数料率を決めない」ために使用されているAnchor Output

・UTXOセットの肥大化につながらないため許されたPay to Anchor

・Arkのようなプロトコルで使うためにはさらなるポリシー変更が必要?

「事前に手数料率を決めない」ために使用されているAnchor Output

冒頭で、トランザクションの作成時点よりも後に手数料を追加したくなるケースがあると言いましたが、その代表例にライトニングネットワークのチャネル閉鎖があります。

​ライトニングチャネルの残高は「コミットメントトランザクション」と呼ばれる、両者に残高を払い出す1つのトランザクションとしてオフチェーンで保管されています。これを配信することでチャネルを強制閉鎖できるのですが、コミットメントトランザクションの入力はファンディングトランザクションの出力、つまり2者の2-of-2マルチシグアドレスであるため、RBFで新しい手数料率で配信しようと思うと両者の強力が必要になってしまいます。(チャネルの共有相手がオフラインの場合、困ります)

したがって手数料率を変えようと思うと次に検討する手段はCPFPになるのですが、ライトニングではチャネルを閉鎖した場合は相手が一定期間の間不正を告発できるようになっています。(もし古いコミットメントトランザクションを配信したら、一定期間は相手が残高を全て没収できるようになっています)つまり、一定期間は自分に払い出すトランザクション出力を勝手に使うことはできません。つまり、CPFPでいう子トランザクションを作ることができません!

そこで、Anchor Outputというものをコミットメントトランザクションに追加します。これはコミットメントトランザクションに残高を持つユーザーごとに1つ存在する330 satsというダスト金額のアウトプットで、これをCPFPすることでコミットメントトランザクションの手数料率を調整することができます。

The Mempool Open Source Project®
Explore the full Bitcoin ecosystem with The Mempool Open Source Project®. See the real-time status of your transactions, get network info, and more.

片側にだけ残高があったチャネル閉鎖の例。330satのAnchor Outputが1つ見て取れる。

The Mempool Open Source Project®
Explore the full Bitcoin ecosystem with The Mempool Open Source Project®. See the real-time status of your transactions, get network info, and more.

両側に残高のあったチャネル閉鎖の例。330satのAnchor Outputが2つある。

ただ、Anchor Outputが存在することによって、それぞれのチャネル残高から330satずつを割り当てる必要が出てくるなど、必要以上に複雑な仕組みになっています。本当は手数料を追加する方法がほしいだけなのに、わざわざトランザクション伝播のためにダストリミットに引っかからない出力を2つも用意する必要があるためです。

そこで、Pay to AnchorやEphemeral Anchorsという概念が誕生しました。

UTXOセットの肥大化につながらないため許されたPay to Anchor

上記のAnchor Outputの問題点のうちの1つである330satの融通は、もし0satのアウトプットが作れたら解決しますが、どうしてダストリミットというポリシーでそのようなトランザクションの伝播は防がれてしまうのでしょうか?

Ordinals Inscriptionsの発明からは特にビットコインのUTXOセットが肥大しており、ラズパイでビットコインノードを運用することも徐々に難しくなってきています。ダストリミットは新しいUTXOを作る際に少額のビットコインを要求することで、UTXOセットの肥大化に歯止めをかける効果があります。もし0satのアウトプットをいくつでも作ってよければ、ビットコインのUTXOセットは今の何倍ものサイズになっているかもしれません。

Ephemeral Anchors

しかし、Anchor Outputのように手数料の追加のためにすぐに消費されるUTXOであれば永続的に残らないので問題ありません。そこでEphemeral Anchorsという概念が誕生しました。パッケージとして伝播されるトランザクションにおいて、親トランザクションで生成され子トランザクションで消費されるUTXO(Anchor Output)に限り、0satでも許可するメモリプールポリシーのことをEphemeral Anchorsと呼びます。この場合、トランザクションがセットでブロックに含まれることでUTXOセットの肥大化を生みません。

つまり、0satのアウトプットを使ってCPFPすることで、親トランザクションの手数料がゼロ、子トランザクションが全ての手数料を負担する、という形を実現できます。

Pay to Anchor(P2A)

また、先述の例ではライトニングチャネルには2つのAnchor Outputが必要だったりしますが、1つのAnchor OutputをAnyone-can-spendとなるようなスクリプトで作成すれば2者で共有できます。「誰でもCPFPできる」タイプのAnchor Outputの誕生です。これが通称Pay to Anchor(P2A)という新しいアウトプットタイプとして規格化されました。

P2Aアウトプットにダストが含まれる場合はダストを誰が拠出するかの問題が発生しますが、それが0satのEphemeral Anchorであれば非常にシンプルになります。

P2Aは具体的には<OP_1> <4e73>というスクリプトでロックしたアウトプットです。既知のデータをプッシュするだけで送金できるので誰でもCPFPの入力に使用することができます。アドレスとして表現するとbc1pfeessrawgfという、feesから始まるアドレスになるデータが選ばれました。

まとめると、Pay to Anchorとは誰でも使用できるスクリプトに対する支払いをAnchor Outputとして使用しようという規格で、Ephemeral Anchorsの仕組みと組み合わせることでどんなトランザクションでも0satのPay to Anchorを含めることで参加者の誰にでもCPFPできる形になります。

💡
Ephemeral P2Aを利用したライトニングチャネルを"Zero-fee Commitment"チャネルと呼んだりします。ここで規格が提案されています。

Arkのようなプロトコルで使うためにはさらなるポリシー変更が必要?

このPay to Anchorはビットコインノードのリレーポリシーと密接に関わっていますが、現時点ではCPFPの親トランザクションが伝播に必要な手数料率を満たしていない場合、1つ目の子トランザクションと合わせて満たす必要があります。これを1P1C (1 Parent 1 Child)パッケージリレーと呼びます。

Package Relayの導入がライトニングの弱点を改善
ビットコインのソフトウェアは常にアップデートされています。目立つのはコンセンサスに関わる変更-ハードフォークやソフトフォークと呼ばれるもの-ですが、その頻度は非常に低いためあまり積極的に開発されているイメージは強くないかもしれません。しかしながら、それ以外の部分でも重要な改善が加えられています。 たとえばBitcoin Coreのフルノードの同期はサイズの割に高速ですが、これもノードの挙動をアップデートし最適化し続けている成果です。また、ポリシールールという、コンセンサスには影響しないがノードの挙動を決めるルールがあり、ネットワーク関連の機能に使われることが多いです。 今日はポリシールールとして近い将来に導入されるであろう“Package Relay”というトランザクションの伝播に関わる新しい仕様と、それがライトニングやDLCにとってどのような問題を解決するのかについて説明します。 メモリプールとトランザクションのリレー ビットコインの手数料を意識したことのある方にとってメモリプールというものは馴染み深いものかもしれません。一応説明すると、フルノードが他のノードからまだブロッ

Package Relayについてはこちら

1P1Cの制約として、例えばArkのオンチェーン脱出のようなケースにおいて、トランザクションツリーの途中の複数のツリーが0-feeで、末尾にある場合、上記の条件に当てはまらなくなります。0-feeのトランザクションが多数連なるためです。

💡
パッケージの作り方、手数料の追加方法によっては1P1Cに無理やり当てはめることもできなくはないかもしれませんが、効率では劣るでしょう。

より汎用的なPackage Relayの実装はまだなので、このようなユースケースに関してはすぐにはメリットを享受できないかもしれません。しかし、将来的に可能になるとオフチェーンでトランザクションを保管する形式のビットコイン・レイヤー2の構造がスッキリすることは間違いありません。

まとめ

・ライトニングチャネルのコミットメントトランザクションなど、単独で手数料を更新できないトランザクションの手数料を追加できるように、CPFPという仕組みを使って子トランザクションを連結するためにAnchor Outputというダスト出力が一般的に使われている。

・誰にでも消費できるAnchor Outputがあれば、複数名で1つのAnchor Outputを共有することが非常にシンプルな形で可能になる。これがPay to Anchor(P2A)として規格化された。

・また、1P1Cパッケージ内でCPFPに使うために生成・消費されるAnchor Outputに関してはUTXOセットの汚染につながらないため、0satのアウトプットであることが許可されるようなメモリプールポリシーの更新があった。これをEphemeral Anchorsという。

・現在はPackage Relayの実装が汎用的ではなく、1P1Cパッケージにしか対応していないのでArkなど多数のトランザクションが連なる形のレイヤー2には扱いにくいが、将来的にはそのようなプロトコルにおいても構造のシンプル化につながる。