Beitrag geupdated am 29. Oktober 2022
aufgenommen: Anchor Channels, Umbrel 5 und höher
Hallo an die Community,
ich bin vor einigen Tagen auf einen wirklich lästigen Bug gestoßen, welcher bereits bekannt ist. Zumindest bin ich bei meiner Recherche auf zahlreiche Threads gestoßen, in denen Lightning Nutzer das gleiche Problem hatten wie ich, leider oft ohne einen Lösungsvorschlag.
Vorab: ich bin kein Super-Lightning-Experte und falls ich hier etwas nicht richtig wiedergebe, bei meinem Lösungsweg potenzielle und mir nicht bekannte Risiken unerwähnt bleiben oder ich einen zu umständlichen Weg gegangen bin und dieser Bug hätte möglicherweise viel einfacher behoben werden können; dann gebt mir bitte Bescheid. Jedenfalls hat mir dieser Weg geholfen das Problem aus der Welt zu schaffen.
Nun zum Thema: ich wollte gestern einen kleinen Channel mit einer capacity von 100,000 Sats schließen, den ich in der Vergangenheit zu meinem Peer geöffnet hatte, da wir beide keinen Schimmer von Lightning hatten. Dieser Kanal eignete sich also gut dafür um einen Fuß in der Lightning Welt zu fassen und ein Gefühl dafür zu bekommen. Wir hatten also Payments durchgeführt, Invoices erstellt und sogar Zahlungen geroutet, soll heißen: der Channel war stets aktiv und in Nutzung. Der Kanal war aber mittlerweile zu klein geworden um einen Nutzen zu bieten und so wollte ich den Kanal nun über einen cooperative close über RTL schließen um anschließend einen größeren Kanal zu eröffnen. Mein Peer und ich waren online und die Sats, die ich mitgegeben habe, waren im Hinblick auf den Mempool mehr als ausreichend. Ich war schon skeptisch, als sich der Kanal Stunden später noch immer im „Pending“ Status befand. Als sich der Kanal am nächsten Tag immer noch in diesem Status befand, wusste ich, dass irgendetwas schief gegangen ist.
Hinweis: ich nutze eine Umbrel Node, auf dem die Lightning Implementierung LND läuft. Die Befehle könnten bei anderen Lightning Implementierungen wie C-Lightning oder Eclair anders sein. Damit kenne ich mich nicht aus.
Also habe ich Termius (Ihr könnt auch Putty oder andere SSH Clients nutzen) gestartet und mich auf die Node eingeloggt. Um den Lightning Client zu nutzen, führt folgenden Befehl aus:
docker exec -it lnd sh
Ab Umbrel 5 könnt Ihr auf den Lightning Client wie folgt zugreifen:
~/umbrel/scripts/app compose lightning exec lnd sh
(Beim Raspiblitz sind die beiden oberen Schritte überflüssig und Ihr könnt sie überspringen und mit dem Tutorial fortfahren)
Anschließend lasst Ihr euch mit
lncli pendingchannels
eure Pending Channels anzeigen. Das sah in meinem Fall so aus:
Die local_txid ist die closing-transaction. Das Kuriosum hierbei war, dass ich diese TX im Mempool nicht finden konnte. So hätte die Transaktion also auch nie verarbeitet werden können. Daher startete ich die Node neu um u.a. auch den LND-Client neu zu starten, in der Hoffnung, dass die Transaktion dann möglicherweise erneut übertragen werden würde. Leider war dem bei mir nicht so!
Was hier nur noch geholfen hat, war ein Force-Close. Leider kann man aber über Apps wie RTL einen Kanal, der sich im Pending Status befindet, nicht mehr ansprechen. Der Weg ging hier also wieder direkt über den LND Client.
Auf dem oben geposteten Screenshot seht Ihr die Zeile channel_point. Der Channel Point ist die Funding Transaction mit einer :0 oder :1 dahinter. Die Zahlen zeigen euch lediglich an, ob Output 0 oder Output 1 den Kanal gefundet hat. Das könnt Ihr an dieser Stelle bei Seite lassen. Relevant ist der Wert des Channel Points ohne der 0 oder 1. Wenn der Channelpoint bspw. 123456789:0 ist, gebt Ihr folgendes ein:
lncli closechannel 123456789 --force
Mittlerweile etabliert sich zunehmend der Commitment Type ANCHOR CHANNELS statt STATIC REMOTE KEY (wie er noch auf meinem Screenshot zu sehen ist). Sollte bei euch ein Anchor Channel betroffen sein, sieht der Befehl etwas anders aus und es muss auch der Output Index mit hinzugenommen werden. In unserem Beispiel würde es also wie folgt aussehen:
lncli closechannel --force 123456789 0
Anschließend wird die Closing TX-ID erneut an den Mempool übertragen und euer Kanal befindet sich nun tatsächlich im „Pending“ Status.
Euer Peer bekommt die Remote Balance sofort ausgezahlt, während Ihr - je nach Einstellung - die Lock Time abwarten müsst. In unserem Kanal waren es 144 Blöcke, sprich ca. 1 Tag. Und so war es dann auch.
Ich hoffe, dass Ihr erst gar nicht auf diesen Bug stößt und falls doch, dass euch diese kleine Anleitung dabei hilft.