Lightning Deep Dive: Was ist Channel Splicing?

Ist Lightning perfekt? NEIN. Ist Lightning die beste Chance, Bitcoin zum besten globalen Zahlungsmittel zu machen? JA. In diesem Beitrag schreibt unser Entwickler, Johannes Zweng, über verbesserungswürdige Aspekte des Lightning-Netzwerks und wie diese durch das Channel Splicing gelöst werden können.

Wir alle wissen, die Bitcoin-Blockchain ist eine begrenzte Ressource (und das ist auch wichtig und notwendig zur Erhaltung der Dezentralität von Bitcoin). Um Bitcoin als Zahlungsmittel für den gesamten Planeten zu skalieren, ist daher eine Lösung auf Layer 2 zur Übertragung von Bitcoin unumgänglich.

Zum Glück haben wir ja bereits das Jahr 2023 und es hat sich schon Vieles getan. Wir haben mittlerweile Lightning produktiv auf dem Bitcoin Main Net. Die Technologie entwickelt sich rasant weiter - neue, coole Features kommen laufend hinzu (multipath payments, Hold-Invoices, LN-URL, Bolt12, etc.) und Lightning-Payments funktionieren mit dem Wachsen des Netzwerks mit jedem Tag reibungsloser und verlässlicher.

Aber es gibt natürlich immer Verbesserungspotential:

Erste Problemstellung: On-Chain Balance
“versus” Lightning Balance

In der aktuellen Adoptionsphase von Lightning (so ehrlich muss man sein) kann man bei weitem noch nicht überall mit Lightning zahlen, wo bereits Bitcoin akzeptiert wird. Immer wieder kommt man in eine Situation, in der man dennoch On-Chain Bitcoin-Transaktionen durchführen muss (oder möchte).

Wenn man als User nun seine Bitcoin in einer Lightning Wallet aufbewahrt, ist es manchmal schwierig oder umständlich, mit dieser Wallet eine On-Chain Zahlung durchzuführen. Es gibt zwar mittlerweile Services wie Lightning Loop (oder entsprechende ähnliche Services, die von Wallet Anbietern bereitgestellt werden), die einen Atomic Swap zwischen Lightning und On-Chain ermöglichen. Das bedeutet einfach, man sendet einem Swap-Partner (Lightning Loop Betreiber oder Wallet-Anbieter) Bitcoin via Lightning und dieser sendet atomic (also gleichzeitig und unwiderruflich) eine Bitcoin-Transaktion On-Chain an das gewünschte Ziel.

Damit kann man zwar aus einer Lightning Wallet heraus On-Chain Zahlungen durchführen (die Phoenix-Wallet macht das zum Beispiel im Hintergrund so), aber man ist auf einen Peer angewiesen (auch wenn man diesem nicht vertrauen muss) und es fallen zumeist Gebühren für den Service an, sodass so eine Zahlung immer etwas teurer ist, als eine “normale” On-Chain Transaktion.

Diese gefühlte Trennung der Guthaben in einer Wallet zwischen On-Chain und Lighting ist daher immer noch eine große Hürde, die auch konzeptionell neuen Usern schwer vermittelbar ist.


Zweite Problemstellung: Unveränderliche
Channel-Kapazität

Man stelle sich vor, man startet als Lightning Routing-Betreiber (dies geht ja mittlerweile dank Projekten wie Raspiblitz, Umbrel, myNode etc. immer einfacher). Man macht mit ein gewissem Guthaben ein paar Channels auf, etabliert sich als Routing Node, öffnet ein paar weitere Channels, wächst langsam rein, macht größere Channels auf, und plötzlich hat man ein paar alte Channels, die schon lange online sind, aber die im Laufe der Zeit zu “klein” geworden sind, weil vielleicht mittlerweile mehr Lightning-Routing-Traffic durch die eigene Node geht, oder man mehr Liquidität fürs Routing bereitstellen möchte.

Ja, natürlich kann man jetzt einfach einen zweiten zusätzlichen Channel zum selben Peer aufmachen. Aber man hat dann zwei Channels, die auch zwei separate closing transactions brauchen und so weiter. Ginge das nicht besser?

Kurz gesagt: Doch, das geht besser!

Channel Splicing enters the game: Was genau ist
das und was bedeutet es für Lightning?

Splicing: engl. für “verbinden”, “kleben”, den Begriff kennt man auch in der Welt der Netzwerkverkabelung, das Verbinden zweier Glasfaser-Enden nennt man ebenfalls “splicing”).

Kurzes Auffrischen: Was genau ist denn ein Lightning-Channel? 

Vereinfacht gesprochen ist ein einzelner Lightning Channel nichts anderes als eine 2-von-2 Multi-Sig Wallet-Adresse zwischen 2 Partnern, in der eine bestimmte Anzahl an BTC liegen. Diese Funds auf dieser Adresse sind auf der Blockchain sozusagen eingesperrt. Das ist die “funding transaction” (und diese Transaktion muss mindestens drei Bestätigungen auf der Blockchain haben).

Die beiden Peers erzeugen danach gemeinsam (weil ja 2-von-2 Multisig, deswegen müssen immer beide mit-signieren) immer wieder neue Child-Transaktionen, in denen sie einen bestimmten Teil des Guthabens an den einen Partner und den Rest an den anderen Partner auszahlen würden (falls es zu einer Closing-Transaktion käme).

Diese Transaktion landet aber vorerst nicht auf der Blockchain, sondern wird laufend ersetzt durch neuere Versionen, wo die Aufteilung der Funds (“welcher Teil gehört dem Einen und welcher dem Anderen”) entsprechend angepasst wird, wenn satoshis durch den Channel fließen. (Zum einfacheren Verständnis habe ich hier bewusst ein paar komplexere Details, wie zb. das Widerrufen alter Channel-States, weggelassen).


Am Ende des Lebenszyklus eines Channels wird einfach eine finale Transaktion auf der Blockchain gebroadcastet, die genau die Funds in der 2-von-2 Wallet entsprechend dem letzten “Aufteilungs-Stand” im Channel, an die beiden Partner sendet. Das ist die “closing transaction”.

Konzept Channel Splicing:

Die Idee beim Channel Splicing ist nun – vereinfacht gesprochen – das Schließen eines bestehenden Channels und das Öffnen eines neuen Channels in einer einzelnen Transaktion durchzuführen, oder anders gesprochen: die “funding transaction” eines Channels durch eine neue Transaktion zu ersetzen. 

Dadurch, dass die neue Transaktion auf der alten Funding-Transaktion aufbaut, könnte man dies auch so gestalten, dass man nicht 3 Bestätigungen abwarten muss. In diesem Fall ist das Vertrauen auf eine 0-conf Transaktion sicher, da gewährleistet ist, dass es keinen Double-Spend geben kann. Da die alte Funding-Transaktion eine 2-von-2 MultiSig Adresse ist, kann jeder der beiden Partner sicher sein, dass der jeweils Andere ohne Zutun des Partners keine Double-Spend-Transaktion erstellen kann. Und sollte die neue Transaktion nie oder erst sehr spät bestätigt werden, werden in der Zwischenzeit alle auflaufenden Routing HTLCs einfach auf beiden Funding-Transaktionen parallel aufgebaut.

Was bringt uns das?

Nun denn, wie man sieht sehr viel:

  • Der neue Channel kann sofort benutzt werden (ohne dass man 3 Confirmations abwarten muss)

  • Man kann die neue Funding-Transaktion auf zwei Arten gestalten:

  1. Man kann entweder neue Outputs an beliebige On-Chain Adressen hinzufügen (also Funds aus dem Channel entfernen und an beliebige on-chain Adressen senden)
    → dies nennt man Splice-Out

  2. Oder man kann auch zusätzliche, neue Inputs hinzufügen (also die Channel-Kapazität erhöhen).
    → dies nennt man Splice-In

Diese Eigenschaften (keine Downtime des Channels, Entfernen oder Hinzufügen von Funds in einem Channel mit nur einer Transaktion) bieten eine Lösung für beide zu Beginn dargestellten Problemstellungen.

On-Chain Zahlungen:

  • Angenommen ein User hat seine gesamte Balance in Lightning Channels, möchte aber eine On-chain Zahlung durchführen → Splice-Out an die On-Chain Adresse, die bezahlt werden soll. Der Channel hat keine Downtime und ist danach einfach um den Betrag “schmäler” geworden, der für die On-Chain-Zahlung entnommen wurde.

    Das Ganze kostet nur eine Transaktion (die nach heutigem Stand aufgrund des enthaltenen Bitcoin Scripts etwas größer, und damit auch teurer wäre, als eine “normale” Standardtransaktion). Allerdings sobald Lightning Taproot Transaktionen nutzt, kann man auch Transaktionen mit komplexen Script-Bedingungen so durchführen, dass sie auf der Blockchain nicht von Standard-Transaktionen unterscheidbar sind und auch nicht mehr Fees kosten.

    Das bedeutet, man kann aus seiner Lightning Balance heraus ganz einfach On-Chain Zahlungen durchführen. Es besteht keine Notwendigkeit mehr in “On-Chain-Balance” und “Lightning-Balance” zu denken.

Channelkapazität anpassen:

  • Ebenso kann man mit Splicing die Kapazität eines Channels in beide Richtungen anpassen (und prinzipiell können das beide Peers tun). Also wenn der Channel zu schmal wird, mehr Funds hinzufügen, oder wenn man merkt, dass die Kapazität in einem Channel nicht genutzt wird, oder überdimensioniert scheint, einfach wieder reduzieren (aber den Channel dennoch offen halten).

Aktueller Status

Aktuell ist Channel Splicing noch nicht im Protokoll (den sog. Lightning BOLTs) spezifiziert, das heißt im Moment ist Channel Splicing noch nicht möglich und in keiner Lightning-Implementierung vorhanden. Die oben genannte Phoenix-Wallet steht jedoch kurz vor einem entsprechenden Update.  

Bereits 2018 wurden auf der Lightning-Dev Mailingliste erste Vorschläge diskutiert (siehe diesen Beitrag von Rusty Russel vom c-lightning Team und diesen Optimierungsvorschlag von René Pickhardt).

Allerdings wurde das Thema danach zugunsten anderer, damals ebenso noch nicht implementierter Themen (zb. Multipath Payments, flexiblere Datenstruktur im Onion Routing - Stichwort “TLV”, keysend, etc.) immer wieder zurückgestellt.

Im Frühjahr 2021 hat Rusty Russel allerdings einen konkreten Entwurf als Pull-request (Änderungsvorschlag) für die Spezifikation begonnen (siehe hier), der seitdem regelmäßig unter den Entwicklern der verschiedenen Lightning Implementierungen diskutiert wird.

Fazit

Lightning ist großartig, aber wir dürfen nicht vergessen, dass es immer noch in den Kinderschuhen steckt. Auch wenn das Netzwerk laufend (und rasant) wächst, gibt es noch viele Ideen und technische Verbesserungen, die einfach aus Zeitmangel noch nicht umgesetzt sind.

Also wenn Lightning heute noch nicht perfekt ist, habt etwas Nachsicht und Zuversicht. Die Entwickler-Community arbeitet daran. Ideen gibt es genug in der Pipeline.

Let’s build the money of the future. :-)

Vielen Dank für's Lesen meines Beitrags zu diesem Thema und bis zum nächsten mal - euer Johnny.