LNノードのルーティングエラーによる機会損失について
この記事はDiamond Handsのルーティングに関するレポートです。
はじめに
ライトニングネットワークのノード運用では、ビットコインのルーティングをすることで手数料を得ることができ、また取引所がルーティングを適切にすることはビットコインの流動性を提供することに繋がります。DiamondHandsプロジェクトの参加者たちも各自ルーティング状況を記事で公開したりSNSで報告したりしています。ノード運用をしていると、どうしてもルーティングの成功回数や取引量に目が行き勝ちですが、今回はルーティングの失敗と機会損失についてみていきたいと思います。
※DiamondHandsノードはLNDのため、以下の表などに記載されている各データ項目名はLNDに従います。
※ルーティングエラー情報は今回以下のツールを活用し取得しました。
https://github.com/smallworlnd/stream-lnd-htlcs
ルーティングとは
ビットコインのオンチェーン送金では、送金データをビットコインネットワーク全体へ送信し、すべてのノードへ伝達し、マイナーがそのデータをブロックへ取り込むことで行われます。一方、ライトニングネットワークでの送金はネットワーク全体へは送信せず、送金したい相手に直接、またはその相手と繋がっているノードを中継することで送金をします。そのため送金があったことは当事者間でしか分かりません。この時、送金を中継するノードはルーティング手数料を得ることができます。ただし、中継するノードはそのための資金を十分に持っている必要があり、ルーティング要求のあった金額以下の流動性しかないとルーティングに失敗してしまいます。
以下の図はアリスがボブを経由してキャロルへ2コイン送金するイメージ図です。ボブはキャロルへの送金を中継するためのコインを十分持っており(上段のボブーキャロル間の3コイン)、これをアウトバウンド資金などと言ったりします。またボブはアリスからコインを受け取るために2コイン分のインバウンド容量があるなどと言ったりします。
以下の図ではボブはキャロルへのアウトバウンド資金が枯渇しているため、アリスからルーティング依頼があってもコインが足りずルーティングができない状態を表しています。
二種類のルーティング失敗
ルーティングの失敗には大きく分けて二種類あります。一つは自ノードのルーティングは成功したけど後続のノードが失敗する場合、もう一つは自ノードがルーティングに失敗する場合です。
前者の失敗は後続のノードに依存するため、自ノードではどうすることもできません。後続のノードとは、例えば、アリスがボブ、キャロルを経由してデイブへ送金する場合、ボブはルーティングに成功してもキャロルが失敗する場合がこれにあたります。
後者の失敗の場合、基本的にはルーティングするためのアウトバウンド資金が枯渇していることが原因でエラーになります。アウトバウンド資金が枯渇していればリバランスなどをしてチャネルバランスを保つことで、ルーティングエラーを低減することが可能です。先の図でボブがルーティングに失敗したのはこの後者に該当します。
ルーティング統計
以下のグラフおよび表は、2021-8-14の1日のDiamondHandsノードのルーティング状況です。ルーティングをしたのが合計で773回で、そのうちルーティングに成功したのが settle_event の65回で合計0.095BTCとなっています。
また、ルーティングはしたが後続のノードがルーティングに失敗してエラーを返した forward_fail_event が708回、合計で1.9BTCとなっています。上記で述べたとおり、このエラーは後続のノードに依存するので自分自身ではどうすることもできません。
以下のグラフを見るとルーティングに成功したのは全体の約6%しかないことがわかります。
次に、自ノードがルーティングに失敗した回数をみてみます。上記表の link_fail_event が自ノードによるルーティングの失敗した回数です。そのうち先に述べたアウトバウンド資金の枯渇が原因のエラーが INSUFFICIENT_BALANCE で304回、合計で2.3BTCとなっています。これは例えば、ルーティング手数料を0.01%で設定していた場合、最大0.00023BTCのルーティング手数料を得ることができなかったことになり、これが機会損失となります。ただし、このルーティング失敗回数には、何らかの送金エラー※1により再送金した回数も含まれるため、実質の機会損失としてはもう少し少なくなります。
※1チャネルの流動性が枯渇していたり、送金経路のノードがオフラインで応答がなかったりなど
以下の表は INSUFFICIENT_BALANCE によるエラーをチャネル単位で集計したものです。この表を見るとどのチャネルへのルーティングが頻繁に失敗しているかが分かります。#1ではbtc.binexplorer.comへのルーティング失敗が32回あります。このノードへのルーティング可能なアウトバウンド資金の残高は0となっており(表のchannel_local_balanceの値)、アウトバウンドが枯渇している為、ルーティングが頻繁に失敗していることが分かります。
以下の表は、#8のRiver Financialへの INSUFFICIENT_BALANCE によるエラーの明細です。River Financialとのチャネル容量は2,000,000 satsでアウトバウンド資金が29,425 satsしかありません。outgoing_amountはルーティングしようとしている金額ですが、アウトバウンド資金より大きな金額のためルーティングができずに失敗しています。これだけルーティング需要があっても、チャネルバランスが悪いためにルーティングが失敗しているのが分かります。
まとめ
以上のようにルーティングの失敗情報を見ることで、ルーティング需要のあるチャネルやどのくらいルーティングが失敗しているかを把握することができます。またこれらのデータから、どのチャネルのバランスを調整する必要があるかを知ることができます。リバランスの必要なチャネルをみつけ対応することで、ルーティングの失敗率を低減し、より多くの流動性を提供することが今後のLN市場の発展に繋がっていくと想定しています。
今になって読み直すと理解が全然違います!