Het c-lightning-team kondigt met trots v0.7 van c-lightning aan. Deze versie is het resultaat van acht maanden werk sinds de laatste versie, met 50 contributies van over de hele wereld in 1300 commits. Het bevat niet alleen performanceverbeteringen en bugfixes, maar ook een aantal interessante nieuwe functies.
Nieuwe functies
- Plugins: de belangrijkste nieuwe functie van versie 0.7. Met plugins kunnen ontwikkelaars Lightning uitbreiden met hun eigen applicaties in elke willekeurige taal. Plugins zijn belangrijk voor ons doel om de meest flexibele, uitbreidbare, en aanpasbare implementatie van de specificatie van het Lightning Network te worden. Zo kunnen we ons focussen op de kernfunctionaliteit en tegelijkertijd gebruikers en ontwikkelaars in staat stellen om hun eigen functionaliteit toe te voegen en c-lightning te integreren in hun omgeving.
- Routeboost is nu geïmplementeerd, en stelt gebruikers in staat om betalingen te verzenden en ontvangen via niet-publieke channels (kanalen) door hun details aan de invoice (factuur) toe te voegen. Dit is belangrijk voor nodes die privé willen blijven en dus niet hun kanaal aankondigen.
- Verbeterd muntbeheer: meer controle over welke munten worden gebruikt om channels te openen en opnames te maken uit de nodes, waardoor een aantal problemen met onbevestigde transacties wordt voorkomen.
option_data_loss_protect
staat nu standaard aan, waardoor er minder kans is op het verliezen van gegevens voor jou en je peers.- Reproduceerbare builds: met wat voorbereiding is het mogelijk om je eigen Ubuntu binaries te maken en te controleren dat ze identiek zijn aan wat wij aan gebruikers aanbieden.
- Betere documentatie: zelfs de beste functies zijn nutteloos als er geen documentatie voor is. Daarom hebben we onze documentatie aangepast en wordt het nu automatisch gegenereerd op lightning.readthedocs.io
- En, zoals altijd: performance, performance, performance.
Extensies en aanpasbaarheid via plugins
Extensies en aanpasbaarheid zijn, naast performance en veiligheid, altijd enorm belangrijk voor ons geweest. Tot nu toe was het echter zo dat gebruikers volledige daemons moesten schrijven om simpele functies toe te voegen of kleine aanpassingen te maken. Dit verandert nu met de introductie van plugins. Plugins zijn simpele programma’s die in elke taal kunnen worden geschreven en worden beheerd door c-lightning. Dit is gelijk aan het sidecar-model waarin een geassocieerd proces tegelijk met een ander proces draait en er interactie tussen plaatsvindt. Bovendien hebben we een aantal extensiepunten beschikbaar gemaakt via de plugin-API:
- Command line option passthrough zorgt ervoor dat plugins hun eigen opties voor de command line kunnen registreren en deze beschikbaar maken via lightningd, zodat alleen het hoofdproces hoeft te worden geconfigureerd.
- JSON-RPC command passthrough zorgt ervoor dat plugins hun eigen commando’s kunnen toevoegen aan de JSON-RPC interface.
- Event notifications geeft plugins toegang tot push-notificaties over evenementen vanuit lightningd.
- Hooks zijn een manier voor plugins om op de hoogte gesteld te worden van interne evenementen in lightningd, zodat het gedrag kan worden aangepast.
De JSON-RPC en passthrough van opties zorgen ervoor dat er vanuit één punt met zowel de daemon als alle plugins kan worden gecommuniceerd. De notificaties en hooks zorgen dat real-time interacties of aanpassingen aan het gedrag van de node mogelijk zijn. Dit alles zorgt voor een veel nauwere samenwerking met de core deamon dan voorheen mogelijk was.
Vergeleken met voorgaande manieren om c-lightning uit te breiden, is het aan de slag gaan met plugins veel makkelijker. Als je wel eens gewerkt hebt met stdin en stdout, en weet hoe je om moet gaan met JSON-data, dan heb je de vaardigheden om een plugin te bouwen. Bovendien hebben wij en de community ook een aantal libraries gebouwd om het schrijven van plugins te vergemakkelijken voor C, Python, Golang, en Java.
Hier volgt een voorbeeld van een Python-plugin die gebruikmaakt van de JSON-RPC passthrough, passthrough voor opties, en notificaties voor het bijhouden van berichten aan c-lightning:
from lightning import Plugin
plugin = Plugin(autopatch=True)
@plugin.method("hello")
def hello(plugin, name="world"):
greeting = plugin.get_option('greeting')
s = '{} {}'.format(greeting, name)
plugin.log(s)
return s
@plugin.init()
def init(options, configuration, plugin):
plugin.log("Plugin helloworld.py initialized")
plugin.add_option('greeting', 'Hello',
'The greeting I should use.')
plugin.run()
De JSON-RPC interface en het plugin-systeem worden met prioriteit behandeld in onze interfaces, en we zijn constant bezig met het verbeteren van de functionaliteit door meer informatie en interactie toe te staan met c-lightning core.
Nieuwe modularisatie
Plugins maken het niet alleen mogelijk om c-lightning aan te passen, maar ontwikkelaars kunnen er tevens c-lightning beter mee modulariseren. De laatste paar weken zijn we bezig geweest met het overzetten van functionaliteit. We hebben de code uit c-lightning zelf gehaald, en er plugins van gemaakt. Er zijn twee redenen waarom we dit hebben gedaan:
- We kunnen zo makkelijker zaken gescheiden houden, door expliciet te zeggen welke gegevens kunnen worden bereikt en welke acties kunnen worden uitgevoerd.
- We stellen gebruikers in staat om de plugin te verwisselen met hun eigen implementatie, mocht de standaard plugin niet voldoen aan hun behoeften.
Door zelf ook plugins te gebruiken, kunnen we er beter voor zorgen dat de ervaring optimaal is. We zijn constant bezig met het verbeteren van de expressiviteit en de manier waarop plugins kunnen communiceren met de core daemon.
We hebben bijvoorbeeld de code voor het betalen van invoices overgeplaatst naar een betaal-plugin. Het hoofddoel van de betaal-plugin is om een invoice te ontvangen en dan een betaling uit te voeren op basis van de informatie in de invoice. Dit klinkt misschien simpel, maar zelfs een enkele betaling kan resulteren in een lang proces waar aanvullende informatie uit de invoice wordt gehaald, zoals hints voor routes en de binnenkort verschijnende multi-part payments (betalingen verspreid over meerdere routes). De plugin bekijkt de informatie en genereert een aantal routes. Vervolgens wordt de betaling uitgevoerd, en wordt het opnieuw geprobeerd als een route faalt. Door deze functionaliteit te verplaatsen naar een plugin, konden we simpelere code schrijven voor zowel de plugin als de core daemon. Het stelt gebruikers ook in staat om de code te vervangen met hun eigen oplossing die misschien beter werkt voor betalingsroutes. Zo is er misschien aanvullende informatie over de staat van het netwerk, en hoeven we daar c-lightning niet voor aan te passen.
Hoewel het plugin-systeem pas net klaar is, zijn er al een aantal ontwikkelaars begonnen aan het ontwerpen en ontwikkelen van een aantal innovatieve plugins om zo de functionaliteit van c-lightning verder uit te breiden: autopilots, network probes, prometheus metrics, cross-chain atomic swaps, aanvullende RPC interfaces, en nog veel meer.
Een vooruitblik
Deze release was een belangrijke mijlpaal, maar er staat nog veel meer op de planning. Recentelijk is v1.0 van de specificatie van het Lightning Network afgerond, en nu kijken we uit naar de vele interessante functies en innovaties op onze roadmap.
Zo hebben we recentelijk een flexibelere manier bedacht voor het samenstellen van packets voor onion-routing, waardoor er meer informatie kan worden meegeleverd aan de hops in een route. Hierdoor ontstaan krachtige nieuwe mogelijkheden, zoals spontane betalingen zonder invoice, en “rendezvous routing”, wat de identiteit van de verzender en ontvanger verborgen houdt tijdens de betaling.
Er zijn ook andere voorstellen waar we mee bezig zijn: dual-funded channels om de liquiditeit voor het netwerk te verbeteren, en het verwijderen van “fee commitments” om de kans op vroegtijdige kanaalsluiting te verkleinen.
Nu we versie 0.7 van c-lightning hebben uitgebracht, kijken we ernaar uit om deze geweldige nieuwe functies te implementeren en de grote uitdagingen van de toekomst aan te gaan.
We willen graag alle betrokkenen bedanken: niet alleen de mensen die code hebben bijgedragen aan c-lightning, maar ook iedereen die #reckless (roekeloos) genoeg was om het te testen en feedback te geven over wat werkt en wat verbeterd kan worden. En ten slotte willen we de Lightning Network-teams ACINQ en Lightning Labs bedanken, en alle contribuerende individuen die de community van het Lightning Network zo prettig, samenwerkend en open hebben gemaakt!
Aan de slag met plugins
Lightning heeft meer plugins nodig! Om te beginnen met het uitbreiden van je Lighting-apps, kun je een kijkje nemen naar onze documentatie en deze voorbeeld-plugins. We horen graag feedback over de nieuwe update. Je kunt ons bereiken via onze GitHub repo of via de Lightning-dev mailing list.