レイヤー2プロトコルの実装に役立つ「Pay to Anchor(P2A)」とは?
最近はビットコインの手数料相場が低めで推移しているため、送金が詰まってしまったという方は少ないかもしれません。しかし、ギリギリの送金手数料でトランザクションを配信した後、手数料相場が上昇してしまって送金が取り残されるという経験をしたことがあるビットコイナーは多いはずです。
個人の送金であれば、同じトランザクションの手数料を増やして再配信することができます。このReplace-by-feeという挙動が既定になって数年が経ちました。
しかし、「事前にトランザクションを署名して手元に置いておく」ようなユースケース、つまり将来的にRBFすることが必ずしもできないケースも存在します。そういうときにはCPFP(Child-Pay-For-Parent)という、「余分に高い手数料を払う子トランザクションとセットで取り込んでもらう」手法もあります。手数料が安すぎるトランザクションが取り込まれれば、その次の手数料が高すぎるトランザクションも取り込めるので、マイナーがトータルで見れば相場以上の手数料収入を得られるというロジックです。
CPFPについては下記の記事でも触れています。
それでも、ビットコインノードがトランザクションを伝播する際の方針に「トランザクションの手数料率が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することでコミットメントトランザクションの手数料率を調整することができます。

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

両側に残高のあったチャネル閉鎖の例。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できる形になります。
Arkのようなプロトコルで使うためにはさらなるポリシー変更が必要?
このPay to Anchorはビットコインノードのリレーポリシーと密接に関わっていますが、現時点ではCPFPの親トランザクションが伝播に必要な手数料率を満たしていない場合、1つ目の子トランザクションと合わせて満たす必要があります。これを1P1C (1 Parent 1 Child)パッケージリレーと呼びます。

Package Relayについてはこちら
1P1Cの制約として、例えばArkのオンチェーン脱出のようなケースにおいて、トランザクションツリーの途中の複数のツリーが0-feeで、末尾にある場合、上記の条件に当てはまらなくなります。0-feeのトランザクションが多数連なるためです。
より汎用的な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には扱いにくいが、将来的にはそのようなプロトコルにおいても構造のシンプル化につながる。
次の記事
読者になる
一緒に新しい世界を探求していきましょう。


ディスカッション