先日リリースされたBitcoin Core v28.0が、Pay to Anchorアウトプットを使用するトランザクションのリレーをサポートした。Pay to Anchorというのはエフェメラルアンカーという提案の一部。
エフェメラルアンカー
エフェメラルアンカーは、ライトニングネットワークなどのマルチパーティコントラクトにおける、新しい形態のアンカーアウトプットの提案。現在のライトニングネットワークのコミットメントトランザクションには、2人の各参加者がコミットメントトランザクションの手数料をCPFPにより引き上げられるよう、2つのアンカーアウトプットが含まれるようになっている↓
techmedia-think.hatenablog.com
↑のアンカーアウトプットには、ダスト制限に引っかからない最低限の金額(330 sats)が設定されている。
一方、エフェメラルアンカーは、
- 上記のようなコミットメントトランザクションの手数料を0に設定し、
- コミットメントトランザクション内に金額0のアンカーアウトプット(Pay to Anchor:後述)を1つだけ設ける
- コミットメントトランザクションをネットワークにブロードキャストする必要がある場合は、手数料0のコミットメントトランザクションと、そのアンカーをインプットとして使用する手数料引き上げ用の子トランザクションをパッケージとして送信する
という利用を可能にする提案で、現在以下のPRが公開されている↓
Bitcoin Core v28.0では1P1C(1つの親と1つの子)によるパッケージリレー、TRUC(v3)トランザクションのリレーポリシーがサポートされ、↑のようなエフェメラルアンカーを導入する準備が出来つつある。今回のPay to Anchorの使用のサポートにより、残りはPay to Anchorアウトプットにダスト値の金額(具体的には0値)を許可するよう、mempoolのリレーポリシーに例外を設けるようにすること。
そもそもアウトプットの金額のダスト制限は、経済合理性の無い金額*1のアウトプットの作成や、それに伴うUTXOセットの肥大化、ノードの検証コストの増加を抑止するために設けられている制限になる。
ただ、上記のように手数料0のトランザクション内に1つだけ金額0のアンカーがある場合、
- そのトランザクションをリレー可能するには、手数料を支払う子トランザクションとセットでパッケージとしてリレーする他なく、
- そのようなトランザクションがマイニングされるということは1つのブロック内に親子トランザクションが一緒に入ることになり、
- 金額0のアンカーはそのブロック内で消費されるのでUTXOセットを肥大化するようなことはない。
という理由で、一時的にmempoolに存在するダストアウトプットを対象にダスト制限の例外を設けようというもの。
LNのような事前署名系のトランザクションだと、署名時とブロードキャスト時の手数料率にはどうしても差異が生まれるものなので、↑のようにブロードキャスト時にCPFPで手数料決めるというのがシンプルで良いかもしれない。
Pay to Anchor
本題のPay to Anchor(P2A)というのは、以下の形式のスクリプトを持つアウトプットのこと↓
<OP_1> <4e73>
- witness versionが
1(OP_1=0x51)で、witness programが2 byteの4e73
※ BIP-141によりwitness programの長さは2〜40 byteと定められているため、2 byteは最小のwitness program - hex値にシリアライズすると
51024e73(02は2 byteをプッシュするpushdata opcode) - Bech32mアドレスにすると
bc1pfeessrawgfで、(Vanity addressとして)アドレスにfeesが入るように選択されたのが↑のwitness programの値
witness versionが1だけど、witness programが32 byteではないので、Taprootのルールは適用されない。つまり、このロックスクリプトは単に2つのデータをスタックにプッシュするだけのスクリプト。LNの既存のアンカーアウトプットと違って、鍵もロックスクリプトに含まれないので、基本的に誰でもこのアウトプットを使用できる(anyone can spendな)アウトプットになる。
OP_TRUEをwitness scriptとしたP2WSHアウトプットでも同様のことが可能だけど、その場合はアウトプットのサイズが大きくなるため、アウトプットの作成と使用において最もサイズの小さくなるように↑のような設計になったみたい。
Bitcoin Core v28.0での対応
今回、Bitcoin CoreにマージされたPay to Anchor(P2A)アウトプットの使用を標準リレーポリシーでサポートしたPR↓
このような未知のwitness programを持つアウトプットを持つトランザクションはこれまでも作成/リレーが可能だったけど、インプットとして使用する場合、そのトランザクションは標準リレーポリシーで許可されていなかったため、Bitcoin Coreではリレーされなかった。Bitcoin Core v28.0では、このようなP2Aアウトプットを使用するトランザクションのリレーが標準ポリシーとしてサポートされるようになった。
※ ネットワーク内でBitcoin Core v28.0にアップグレードしているノードが少ない内は、まだリレーされにくいので注意。
*1:使用する場合、その金額より高い手数料を支払う必要がある