Develop with pleasure!

福岡でCloudとかBlockchainとか。

1P1Cパッケージリレー

Bitcoin Core v28.0で新たにサポートされた機能の1つが1P1C(1 Parent 1 Child)パッケージリレー。パッケージリレーというのは、複数の関連トランザクションをまとめてP2Pネットワークでリレーできるようにする機能のこと。

複数の関連トランザクションのセットをパッケージとしてリレーするためには新しいP2Pメッセージを導入する必要がある↓けど、

techmedia-think.hatenablog.com

今回、Bitcoin Core v28.0で導入されたのは、既存のP2Pメッセージを利用して、親トランザクション1つ子トランザクション1つの計2つのトランザクションのみをリレーできるようにする限定的なパッケージリレー。

トランザクションリレーの仕組み

Bitcoinトランザクションのリレーは、以下のようにinvメッセージで新しいトランザクションを通知し、通知を受け取ったピアはそのトランザクションを持っていなければgetdataメッセージで対象のトランザクションを要求し、txメッセージでトランザクション本体を送信する仕組みになっている。

sequenceDiagram
    Node A->>Node B: inv
    Node B->>Node A: getdata
    Node A->>Node B: tx

Node Bは受け取ったトランザクションの有効性を確認し、問題がなければ自身のmempoolに追加し、自身と接続している他のピアにもそのトランザクションを通知する。

低手数料トランザクションの問題

ノードのmempoolのサイズは有限なので、mempoolがあふれるようになると、基本的に手数料率の低いトランザクションがmempoolから排出される。さらに新しいトランザクションを受け取っても、そのトランザクションの手数料がその時のmempoolの最小手数料率を下回るような場合は、mempoolに追加されない。自身のmempoolに追加されないトランザクションは他のピアにもリレーしない。

低手数料率のトランザクションが問題になるのは、mempoolの手数料率が高騰している状態で、LNのコミットメントトランザクションのように事前署名済みの低手数料率のトランザクションをブロードキャストしなければならない場合。mempoolの最小手数料率を下回ると前述したようにリレーされない。対象の親がmempoolに入らなければCPFPもできない。

1P1Cパッケージリレー

Bitcoin Core v28.0では、この問題を解決するために、1P1Cパッケージリレーを導入した。

まず先立って、Bitcoin Core v26.0で関連トランザクションのセットをパッケージとして送信するsubmitpackage RPCが追加された↓

rpc: allow submitpackage to be called outside of regtest by glozow · Pull Request #27609 · bitcoin/bitcoin · GitHub

これにより、ローカルのmempoolに格納するかどうかのチェックの際に、まず個々のトランザクションの手数料率がチェックされ、それがmempoolの最小手数料率を満たさない場合にパッケージとして手数料率が評価されるようになる。

これでローカルのmempoolのパッケージ評価ができるようになったので、あとはそれと組み合わせてパッケージをリレーする方法↓

sequenceDiagram
    Note over Node A,Node B:...
    Node A->>Node B: tx(低手数料の親)
    Note right of Node B: mempoolの最小手数料率を満たさないためリジェクト
    Note over Node A,Node B:...
    Node A->>Node B: tx(高手数料の子)
    Note right of Node B: 子の参照先を保持していないので親を要求
    Node B->>Node A: getdata(親)
    Node A->>Node B: tx(低手数料の親)
    Note right of Node B: 親子をパッケージとして評価してmempoolに格納
  1. 最初に低手数料率の親を受け取ると、mempoolの最小手数料率を満たさない場合、リジェクトされる。
  2. その後、高手数料率の子を受け取るが、この段階では参照先の親を持っていないので(missing input)、子はオーファン扱いになり、親トランザクションを要求する。
  3. 再度親を受け取ると、オーファンにいる子トランザクションと一緒にパッケージとして手数料率を評価し、mempoolの最小手数料率を満たしていれば、親子でmempoolに格納される。

という形で既存のP2Pメッセージをそのまま使いながら1P1Cの限定的なパッケージリレーをサポートしている。

親の受け取りを2回行うことになるので、使用する帯域幅は増える。これが1P1Cではなくさらに多くの関連トランザクションに拡大すると、ネットワークおよびノードへのオーバーヘッドが増え悪用される可能性もあるため、汎用的なパッケージリレーをサポートするためには、↑のBIP-331のような新しいP2Pメッセージの導入が必要になる。

手数料0の親トランザクション

トランザクション 1vBあたり1 satのという最小値の手数料を設定しなけければならないというポリシーがあるが、TRUC(v3)トランザクション↓を使用するとこれを回避して親トランザクションの手数料を0にすることもできる。

techmedia-think.hatenablog.com

たとえば、LNのコミットメントトランザクションを手数料0で作っておいて、ブロードキャストする際にCPFPで手数料を調整するといったことができるようになる。

※ 1P1CリレーはBitcoin Core v28.0で導入されたばかりなので、ネットワークで広く利用可能になるためには、ネットワークの大半がBitcoin Core v28.0になる必要がある。