LND用のリバランス自動化とFee制御するアプリを[.NET]で作ってみた。
こんにちはかずみょんです。Windowsで始めたLNDですがいろいろと既存のアプリやツールを使おうとするとOSの壁が立ちはだかります。LND自体はwindows用バイナリーが配布されているため実行ファイルをコピペするだけで簡単にいけるのですがLNDgとかでUnix系のマルチタスクオペレーション機能(supervisord)を使われると途端に難易度があがるような気がします。最近はWindows上でWSL(Windows Subsystem for Linux)という機能で簡単にLinux環境を構築できるようなのでLNDはwindows環境、LNDgはWindows上のLinux環境に展開させればできなくはなさそうです(rebalance-lndはPython動く環境入れるだけで動きました。)。
まあ既存のツールを使うのもいいですがこういうアプリやツールも自分の好きなように機能を入れたいというのもあって今回は自分のできる範囲でREST APIを使ってLND用のリバランス自動化とFee制御するアプリを作ってみました(いろいろとspotlightの記事などを参考にさせてもらってます)。
1.動作環境
・OS: Windows 10 / Visual Studio 2022はこちら↓↓
Target Framework : .NET 6.0
・プロジェクトファイルはこちら↓↓(visual studio2022のリポジトリーのクローンからもDL可能。コンパイルして使ってください。最初はDebugモードで動かすのがいいかも。まだBugあると思うのでころころコード変わるかもしれませんが。。。)
・LNDのREST API のReferenceはこちら↓↓https://api.lightning.community/#lnd-rest-api-reference
後、ソフト動かすのにこれ↓必要です。
1.[スタート]→[ファイル名を指定して実行]をクリックし、名前の枠に「certmgr.msc」と入力して[OK]をクリック2.[信頼されたルート証明機関]の証明書フォルダを右クリックして、「すべてのタスク」から「インポート」を選択3.LNDのディレクトリ下のtls.certファイルをインポート
2.機能
・チャンネル情報取得
URIとMacaroonのパスを設定し、update channelボタンでチャンネル情報を取得する。
↓↓↓ ratioはローカルバランスとチャンネルキャパシティーの割合、単位はパーセンテージ(bfx-lnd1はローカルバランス29%)
・リバランス
・リバランスの方法としては下記2種類を用意した。
①REST APIの「 /v2/router/send 」でリモートバランスを増やしたいチャンネル(outgoing channel)とローカルバランスを増やしたいチャンネル(lasthop channel)を指定し”allow_self_payment”を指定することで自分自身のノードにループバックする。
②REST APIの「 /v1/graph/routes/{pub_key}/{amt} 」でリモートバランスを増やしたいチャンネル(outgoing channel)とローカルバランスを増やしたいチャンネル(lasthop channel)を指定し自分自身のノードにループバックするルートを探索し、「 /v2/router/route/send 」でルート指定し送金試行する。失敗したら検索ルートの中間ノードを無視するように指定しなおし再探索を行い送金する。これを繰り返し成功するまで繰り返す。REST APIでは仕様上指定できるのはノードのpubkeyなのでそのpubkeyに関するチャンネルはすべて無視されることになってしまっているようだ。①との探索方法の違いはよく分からない。(これはrebalance-lndのコードを参考に作ってみた。)
・チャンネルごとにリバランスの方向性を指定する。
outgoing、lasthop、both(ローカルバランスの比率によってoutgoingとlasthopを切り替える)、none(何もしない)のどれかを指定できる。
outgoing指定した場合でもTargetで指定した値とローカルバランスの比率を比較しローカルバランス比率がTarget(左側)より低い場合はこのチャンネルのリバランスを行わない。
lasthopに指定した場合でもTargetで指定した値とローカルバランスの比率を比較しローカルバランス比率がTarget(右側)より高い場合はこのチャンネルのリバランスを行わない。
リバランス実行時はチャンネルに指定されたリバランスの方向性とTargetを参照して対象となるoutgoingのチャンネルとlasthopのチャンネルをそれぞれ収集し、すべての組み合わせのリバランスを試行する。
・リバランス実行時の設定について
Amout/unit(sat) : 1回でリバランスする量を指定
Fee limit(sat): フィーを絶対値で設定
Interval(s):リバランスの全組み合わせを試行した後の待機時間 *あまり意味のない機能です。
Repeat(n):リバランスが成功したら再度同じ条件で実行する。これをn回失敗するまで繰り返す。
Repeat route(n):リバランス方法②においてn回分のルート探索で打ち切る。
Timeout(s):1回のリバランスの最大実行時間。早めに打ち切るため。
Auto rebalance [checkbox] : 全組み合わせリバランスを実行した後もループする。
reckless [checkbox]: 指定しない場合はrebalanceに要する最大Fee limitがoutgoingチャンネルのremote feeに設定される。指定した場合はFee limitで指定した値になる。
Auto fee control [checkbox]:Auto rebalance時のfee control有効化
Use query [checkbox]:リバランス方法②の手法を使う。
・Misson control
リバランス方法②においてルート探索時のmission control=trueに指定した。リバランス方法①において、この設定が影響あるのかは不明。
・Fee制御
・Fee設定
チャンネル毎にFeeを設定しローカルバランスの比率によってFeeを可変にできるようにした。又、チャンネル毎にその可変率を2つのパターン(FeeAC=0 or 1 or 2)で可変できるようにした。本当はAmbossサイトのFee reportから自動でBase Fee設定に反映できる機能を実装したかったがFee report取得のAPIが見つからなかった。Timerを用い設定した時間毎にローカルバランスのチェックを行いローカルバランス比率が変化してたらFeeを設定しなおす。
Config setting
チャンネルのFeeACが1の場合はConfig settingのAuto fee control settingの1の行の比率が適用される。(赤枠のACINQのチャンネルのFeeAC=1なのでConfig settingの赤枠の行が適用される。ACINQ ratio=74%,BaseFee=718 なので718÷1.6=448がupdateされる )。FeeACが0の場合はupdateは行わない。
・Auto Fee update実行時の設定について
Auto Fee intarval(min): ローカルバランスのチェック間隔
・ファイル オープン/セーブ
Open/Save Node config File : Config setting画面の読み出し/保存
Open/Save BaseFeeRate config File : すべてのチャンネルのBase Fee設定とFeeACの読み出し/保存
Open/Save RebalanceNode config File : すべてのチャンネルのリバランス情報の読み出し/保存
・ログ出力
こんな感じ。。
・まとめ
まだLightningNetworkについてはよく理解していないこともあるのですがVisual BASICを使ってLNDでRebalanceとFee制御の自動化に特化したWindowsFormアプリを作ってみました。WindowsでLNDやってる人はあまりみたことないので需要はないかもしれませんがおもしろそうだなと思ってみてくだされば幸いです。
後、有料覧ではLNDwをマルチタスクで動作させる活用法を書いてみたいと思います。
ではまた。