用語集 / ライトニングとレイヤー2
ダストHTLC
- ダストHTLCとは?
- ダストHTLCとは、コミットメントトランザクションで独自のアウトプットを持てないほど少額のライトニング決済のことで、強制クローズが起きると、その金額はチャネルの当事者のどちらでもなくマイナーに渡ります。
ライトニングチャネルは、ダストリミットとそれを回収する手数料を足した額を下回る進行中の支払いについては出力を作成せず、その額はマイナーへの手数料になります。ダストリミットが546 サトシ、手数料率が5,000(キロウェイトあたり)の場合、3,861 サトシ未満はすべてトリミングされます。資金が失われるのは、その支払いがまだ移動中にチャネルが強制クローズされた場合だけです。
仕組み
ダストHTLCは判断ではなく計算で決まります。チャネルの所有者が選んだダストリミットに、その支払いをオンチェーンで受け取る際のコストを加えたものです。
BOLT 3は、破棄される出力をトリミング済み(trimmed)と呼びます。自分が提供する支払いでは、チャネルは金額からHTLC-timeoutトランザクションの手数料を引いた額を確認します。自分が受け取る支払いでは、金額からHTLC-successトランザクションの手数料を引いた額を確認します。アンカーなしのチャネルではこれら2つのトランザクションの重さが663と703ウェイトユニットなので、feerate_per_kwが5,000の場合、費用は3,315と3,515 サトシになります。ダストリミット546 サトシに対して、提供側のしきい値は3,861 サトシ、受取側のしきい値は4,061になります。
BOLT 3の計算例がその損失を示しています。その手数料率で進行中の支払いが4件あります。提供するHTLCが5,000と1,000 サトシ、受け取るHTLCが7,000と800です。5,000と7,000にはそれぞれ出力が作られます。1,000と800はトリミングされ、コミットメントトランザクションの手数料は基準値の5,340 サトシから7,140に上がります。この増えた1,800 サトシは、消えた2件の支払いに正確に対応し、クローズをマイニングする者に支払われます。
各側はそれぞれ独自のdust_limit_satoshisを選ぶため、1つのチャネルの2つのコミットメントトランザクションは、どの支払いがダストに数えられるかについて食い違うことがあります。BOLT 2は、相手側が354 サトシを下回る値を提案した場合にノードがそのチャネルを失敗させ、また、大きすぎると判断した値を拒否できるようにしています。上限の高い相手側は、トリミングされた支払いで埋め尽くされたコミットメントを公開できるからです。
アンカーチャネルはこの計算を変えました。option_anchorsまたはzero_fee_commitmentsの下では、第二段階のHTLCトランザクションに手数料がかからないため、計算に寄与しなくなり、しきい値はダストリミットそのものまで下がります。BOLT 3は、その場合にdust_limit_satoshisを意図的に引き上げるようノードに指示しています。リミットを超えていても実際の手数料率ではスイープできない出力は、UTXOセットを汚すだけだからです。
BOLT 2はまた、各支払いではなく合計を制限します。ノードのmax_dust_htlc_exposure_msat(それ自体がポリシーの問題です)を超えると、ノードはコミットされた時点で受信HTLCを失敗させるべきであり、プリイメージを明かすべきではありません。これにより、起こり得た損失がきれいな失敗に変わります。
どこで見られるか
ダストHTLCはウォレットのインターフェースではなくカストディモデルに現れ、当サイトの41件のウォレットレビューはこの点で明確に分かれます。
Phoenixは端末上で実際の自己管理型ライトニングノードを稼働させるため、チャネルは自分のものであり、このエクスポージャーも自分のものです。ACINQは送金に0.4%に加えて4 サトシを請求し、その送金の1件1件がトリミングの対象になり得るHTLCです。BlueWalletのライトニング側はLNDHubサーバー上のアカウントなので、チャネルは運営者が保持します。トリミングされた支払いのリスクを負うことはなく、代わりにその運営者のリスクを負うことになります。
トリミングはクローズの時点でも再び現れます。BOLT 2は、ダストHTLCを含め、どちらのコミットメントトランザクションにもHTLCが残っていない場合にのみクローズの交渉を認めています。そのため、オンチェーンの観察者には見えない300 サトシの支払いでも、協調クローズは保留されたままになります。
ダストHTLC vsダストリミット
ダストリミットはノードが選ぶ数値です。ダストHTLCは、その数値に手数料を加えたものとの比較に敗れた支払いです。
リミットはチャネルのパラメータであり、open_channelとaccept_channelで設定され、それ以降のメッセージには引き継がれません。トリミングは変動する結果です。アンカーがなければしきい値はfeerate_per_kwに追随するため、同じ2,500 サトシの支払いでも、mempoolが空いていれば実際の出力となり、混雑していればトリミングされます。
両者も適用される段階は異なります。Bitcoin Coreのしきい値、すなわちレガシー出力では546 サトシ、pay-to-witness-script-hashでは330は、存在するトランザクションに関するリレーポリシーです。トリミングされたHTLCは出力が書かれないため、このテストに到達することはありません。