コマンドラインでLNのチャネル閉鎖
Umbrelのダッシュボードからログインできなくなって1ヶ月、あれこれ解決策を教えてもらったのにCLIが怖くて未だ解決していない日があったとします。その割にはLN送金は出来る環境がまだ残っているという変な状況で、開いていたチャネルを閉じてBTCを回収する作業をした夢を見ました。(回収後のBTCの避難はまた別の問題でもあります)
状況
UmbrelのダッシュボードからログインできないせいでRTLやLNDgは使えない。
そのためいつもの快適な操作ができない。
Macでネット見るくらいの人生の人にとってGUI環境を失ったLNは基本的に地獄です。何が地獄かってBTCを人質にとられてますから逃げられない地獄です。マウスでクリックするだけの人生はいかに楽なことか。。でもそんな時でも蜘蛛の糸を垂らしてくれる人がたくさんいます。感謝です
たがえるさんの記事にあるようなチャネルの強制閉鎖の件を読んでいると、Ride The Lightning(RTL)やUmbrelのダッシュボードのLNを使わずにチャネルを閉鎖できることがわかります。その時にはChannel Pointという文字列が必要になりこれはRTLやLNDgで知ることができます。
こっちはRTLで
こっちがLNDgです
もう少しチャネル閉鎖について調べると詳しい説明がありました。
やはりChannel Pointが重要でこれを元にチャネルを閉鎖できるようです。他の方法もあるみたいですね。どこかで試す日がくるのだろうか。
ではRTLやLNDgにログインできない状況ではどのようにしてChannel Point情報を得るのでしょうか。Channel Pointに関してはLNノード情報を集めている1mLで知ることができます。1mLなかなかに良いです
オレンジの部分がaoharu2000ノードとDiamond HandsノードとのChannel Pointで、赤い部分を見るとActiveとなっています。これはチャネルが開いていて使える状態になっていることを指していて、この表示も役に立ちます。
そしてチャネルの閉鎖操作をします。上記2つのリンク先を参考にしました。
1. 先ずsshでumbrelにログインします
ssh umbrel@umbrelのIPアドレス、またはumbrel.local
パスワードを要求されますのでダッシュボードでログインする時のパスワードを入れます
2. 次にLNDのコンテナに入ります
docker exec -it lnd bash
3. チャネルを閉めます
lncli closechannel [チャネルポイントの前半部分] [チャネルポイントの後半の数値]
半角スペースを忘れずに。
例)
lncli closechannel bc2cc1b10c57bbc66e3d9e〜〜3467f1ece989f28b79161 0
茶色の破線は失敗です
青線の部分を見るとclosing_txidが無事発行されています。そして1mLを見ながらこの作業を繰り返しました。
全て閉めたらログオフするまでexitを連打
全ての開いたチャネルを1mLからのチャネルポイントを基に閉め、その後少し経ってから1mLで見てみると状態がactiveからclosedに変わります。
この表示は便利でどのチャネルを閉めたか分からなくなったら、active表示のチャネルを探しては閉めて全部closedにしてしまえばOKです。
これでオンチェーンへBTCが返ってきます。
今回はダッシュボードが使えない状態下でBTCを回収する目的でのチャネルクローズでした。そうでもなければRTLやダッシュボードから閉めれば簡単で楽です。
すると1mLでChannel Pointを見つけてチャネルを閉めることにどれくらい意味があるのか?となります。それはUmbrelでLNのchannel.backup fileを作り忘れた時、手動でチャネルを閉める時にこの操作は役に立つだろうと思っています。
Umbrelが用意しているchannel.backupファイルによるBTCの回収は、全自動で全てのチャネルを閉めてオンチェーンに戻してくれる優れものです。もしも開いたチャネルが3桁以上とかになると手動で閉めるより自動で閉めてくれる方がずっと楽で確実です。
バックアップを録り忘れた時の解決方法のオプションとして参考までにどーぞ
そして誰かこの内容の不備を指摘してください(いつも他力本願なのはお許しを)
お疲れ様です。
CLIから全てのチャネルを閉じたい場合以下のコマンド1つでできます。
lncli closeallchannels
オプションでTxFee指定、強制閉鎖、非アクティブチャネルが指定できます。
channel.backupファイルには既存チャネルの通信先ノードが全て保存されており、下記コマンドのmulti_fileオプションを使うことでその全てのノードに対して強制閉鎖を要求する、ということをします。(上記のたがえる氏の記事でrestoreスクリプトを実行していますが、そのスクリプトの中でこのコマンドを使用してます)
lncli restorechanbackup --multi_file channel.backup
自分のノードが健全に動いているなら上記 closeallchannel一発で全て閉じて資金回収することができます。SSDが壊れてもうチャネル状態がわからなくなって正常に通信できないという時のためにバックアップしておいたchannel.backupとシークレットワードを使って強制閉鎖して資金を取り戻すというのが開発側が想定した使い方だと思います。