用語集 / トランザクションと手数料
パッケージリレー
- パッケージリレーとは?
- パッケージリレーでは、ノードが関連する未承認のトランザクションをまとめて受け入れることができ、高い手数料を支払う子トランザクションが、そうでなければネットワークに拒否される親トランザクションを引き連れることが可能になります。
BIP-331で規定されています。
パッケージリレーは、長年存在してきた不一致を解消するものです。マイナーはグループとして評価していましたが、トランザクションをマイナーまで運ぶネットワークは1件ずつ評価していました。Bitcoin Core 28.0は2024年10月にリリースされ、親1件と子1件のケース向けに日和見的なリレーを搭載し、BIP 331が一般的な版を規定しています。停滞した入金の手数料を引き上げたのに、その引き上げが消えてしまった経験があれば、その理由はここにあります。
仕組み
ノードはトランザクションが到着した瞬間に、それを保持するかどうかを決めます。ビットコインの歴史の大半において、ノードはそのトランザクションが何に紐づいているかを一切知らないまま、この判断を下してきました。
失敗の例を考えてみます。ノードが現在要求する額を下回る手数料を支払う親トランザクションが到着すると、保存されることなく破棄されます。その直後に、その親トランザクションのアウトプットを使用する子トランザクションが到着しますが、親トランザクションの記録がないためノードは子トランザクションも検証できず、既定で約100件のトランザクションを保持する小さなオーファンプールに入れられ、やがて忘れられます。子トランザクションが運んでいた手数料が計上されることはありません。2016年からBitcoin Coreに搭載されている祖先を考慮したマイニングも役に立ちません。マイナーには何も届かなかったからです。
親1件と子1件の日和見的なリレーは、その穴の一般的な版をふさぎます。行方不明の親トランザクションが支払い不足のため最近拒否されたものであるオーファンが現れると、ノードはその2件を1つの単位として再検討し、合算したサイズに対する合算した手数料で判断し、そのペアが基準を満たせば両方を受け入れます。対象範囲は意図的に狭く、親1件、子1件です。手数料の低すぎる親トランザクションを複数含むバッチは、依然として対象外です。
BIP 331は一般的な仕組みを定義しています。ピアはハンドシェイクの際にsendpackagesメッセージで対応を告知し、その後ancpkginfo、getpkgtxns、pkgtxnsを使って、いずれかを判断する前にトランザクションの祖先集合全体を要求します。submitpackage RPCを使えば、すでに自分のノードにグループを渡すことができ、上限は25トランザクション、101キロvbyteです。
これを最も必要とするプロトコルは、ブロードキャストのずっと前にトランザクションへ署名します。ライトニングのコミットメントトランザクションは、使われるかもしれない日の何か月も前に、手数料がいくらになるか誰も分からない時点で合意されるため、現代の設計では手数料ゼロまたはほぼゼロで署名し、必要とする側がアンカーアウトプットを通じて手数料を付加します。これが機能するのは、コミットメントトランザクションとその手数料を支払う子トランザクションが一体として伝わる場合だけです。同じリリースでは、BIP 431で規定されるTRUCトランザクションも追加されました。これはトポロジーを制限し、攻撃者がこのペアをジャンクの下に埋め隠せないようにします。
どこで見られるか
パッケージリレーは機能しているときには見えず、気づくのはそれが欠けているときです。選択肢を左右する問いは、停滞した親トランザクションがどこかに存在するかどうかです。
親トランザクションがmempoolに入っていてゆっくり承認されているのであれば、通常の手数料引き上げで十分であり、パッケージは関与しません。パッケージリレーはより難しいケース、すなわち取引所が出金バッチをその時点の下限を下回る手数料で組み立て、どのノードもコピーを保持せず、こちら側でいくら支払ってもネットワークが一度も受け入れなかったトランザクションを救えない場合のためのものです。
トランザクションIDは、独立した2社か3社のブロックエクスプローラーで調べてください。各エクスプローラーは自身のノードのmempoolを報告するからです。どこにも表示されなければ、手数料を引き上げる対象は存在せず、対処は送信者の側にあります。ライトニングのユーザーは強制クローズで同じ仕組みに出会います。そこでは、手数料ゼロのコミットメントトランザクションとアンカーの使用が、チャネルから抜け出す標準的な方法となっています。
正直な注意点が1つあります。リレーの改善はそれを実行しているピア間でしか効力を持たないため、伝播は自分のノードのバージョンではなく、ネットワーク全体での採用状況に依存します。
パッケージリレーvs child pays for parent
child pays for parentは戦略であり、パッケージリレーはそれを届ける配管です。前者は、十分な手数料を支払う子トランザクションを付けてマイナーに両方を取らせることを指し、後者はそのペアを1つの対象として移動させ判断するネットワークの能力です。親トランザクションがすでにmempoolに入っている場合、つまり停滞した入金のほとんどは、パッケージリレーなしでもこの戦略を使えます。パッケージリレーは、親トランザクションの手数料がネットワークが受け入れる水準を下回る場合に、この手法を機能させるものです。