Alpha Release of the Lightning Network Daemon


Volcanic Lightning

LND - version 0.1-alpha

We’re very excited to announce the release of v0.1-alpha of the Lightning Network Daemon (lnd)! This release marks a major milestone for the Lightning Network as well as Bitcoin as a whole. With this release, lnd stands as the most feature-complete implementation of Lightning yet and is now ready for public testing by developers!

The signed release itself can be found in our Github repo.

The daemon is a full implementation of Lightning, capable of: opening channels with peers, closing channels, completely handling all cooperative and non-cooperative channel states, maintaining a fully authenticated and validated channel graph, performing pathfinding within the network, passively forwarding incoming payments, and sending outgoing onion-encrypted payments through the network.

In this post, we’ll take a brief tour of some of lnd’s high-level architecture, the exposed developer APIs, lnd’s usage of the upcoming segwit upgrade to Bitcoin, and finally lnd’s network capabilities.

Golang

btcsuite

The entirety of the lnd codebase has been built from scratch using Go, a new systems programming language that makes it easy to build simple, reliable, and efficient software. We chose Go due to its first-class language-level support for concurrency, expansive standard library, memory safety, and simple language design. The last point holds significance as we’ve developed the codebase for lnd with readability in mind above all.

Our goal is to make it as easy as possible to dive into the code either just to learn about the Lightning Network protocol at a deeper level, or to start contributing pull requests to the project. The codebase has extensive internal documentation in the form of literate programming-inspired comment blocks and an established testing infrastructure as we optimize for developer-time rather than machine-time.

Any major Bitcoin codebase requires a solid, easy to use, and well-tested set of underlying libraries to interact with the network to perform routine tasks such as transaction generation and signing, script generation, watching the chain for relevant transactions, etc. Our Bitcoin library of choice is btcsuite, the very set of libraries that powers btcd, the full-node implementation which is also written in pure-golang.

With this initial release, lnd is dependent on btcd as a direct source to the blockchain in order to fully manage channels and respond to relevant on-chain events. We have a new Lightning compatible lite-client node for Bitcoin in the works that will make the dependency optional in a future release. In addition to utilizing the set of btcsuite libraries, several of our developers such as roasbeef also contribute back to the project as it’s a critical piece of Bitcoin infrastructure.

Developer APIs

grpc

lnd exposes a high-performance, efficient, and flexible RPC layer which is powered by gRPC: a cross-platform open-source RPC framework based on HTTP/2 and protobufs. gRPC is able to generate language-specific client-side libraries that allow for application developers to seamlessly drive lnd from the comfort of their programming lingua franca. Using this set of client libraries, interacting with lnd is as easy as manipulating objects in their chosen language. At the time of this release, the supported languages are: C++, Java, Python, Go, Ruby, G#, Node.js, Objective-C and PHP.

In addition to providing a native-language client accessibility layer, lnd also exposes an HTTP-REST interface that has the same capabilities as the gRPC interface minus the bi-directional streaming RPC calls that gRPC provides.

Lightning Channels – Segwit Inside

segwit

Individual payment channels composed as a series of interconnected links are what make the Lightning Network possible. lnd’s channel design currently utilizes the upcoming Bitcoin upgrade: segwit. Although alternative less-ideal channel constructions are possible without segwit, by utilizing segwit we’re able to deploy the most efficient, flexible, and safe channel design. Additionally, the script upgrade capabilities created by segwit provide a path for upgrades to Bitcoin that will improve the privacy and efficiency of Lightning. Examples of such improvements include Elliptic-Curve Schnorr Signatures and unlocking new op-codes that allow for more private end-to-end payments over Lightning by randomizing the payment hash along the route.

Three very important features of Lightning enabled by segwit include: Unlinkable Outsourced Channel Monitoring, infinite channel life time, and the two-stage HTLC scheme proposed by Mats Jerratsch (later modified by Tadge Dryja). Without segwit, fully-automatic channel outsourcing that includes the broadcast of a transaction that claims all funds in a contested channel by the outsourcer isn’t possible. This is because without a malleability fix, the transaction ID of the commitment transaction can’t be known ahead of time. Similarly, the two-stage HTLC scheme greatly improves the usability of Lightning by allowing a long revocation delay with a short payment delay isn’t safe to deploy without segwit.

lnd’s internal wallet is fully segwit-aware. The wallet is capable of segwit nested p2sh addresses, which look like regular p2sh addresses, and also native segwit addresses, which are more efficient and provide a greater degree of scalability. lnd implements BIP 142, which defines an address format for native segwit addresses. These addresses can be used to send money between instances of lnd or software that supports the BIP such as bcoin. On testnet, a native BIP 142 p2wpkh address looks like:

QWyzAWWPYUgdc6j6HxQpgvqKtyBo4xYjBkwr

Onion-Routed Micropayments

The Lightning Network enables instant, end-to-end secure micropayments that leverage a technique called the HTLC, or Hash-Time-Locked-Contract. Within lnd, all outgoing payments are dispatched using a modified version of Sphinx, which allows us to send payments across the network that are encrypted end-to-end. There is no support for sending payments with plaintext routes, meaning privacy is the default, as it should be.

The payment flow on Lighting is very similar to the flow on traditional financial infrastructure such as PayPal or Stripe: the payee creates an Invoice and sends that to the payer, who then fulfills the payment by sending a payment through the network. lnd provides a preliminary payment request encoding scheme that allows users to easily communicate payment conditions out-of-band. A fully encoded payment request includes: the destination’s public key, the payment hash, and the value of the payment. A sample encoded payment request looks like:

ycyr8brdjic6oak3bemztc5nupo56y3itq4z5q4qxwb35orf7fmj5phw8bx148zzipg3rh6t1btadpnxf7z1mnfd76hsw1eaoca3ot4uyyyyyyyyydbibt79jo1o

Peer-to-Peer Network

All communications between lnd nodes are end-to-end encrypted by default using a modern cryptographic messaging transport derived from the Noise Protocol framework. As a result, no information, not even the initial version handshake, is transmitted in plain-text amongst lnd nodes. Once nodes connect, they begin to exchange authenticated node and channel data which are periodically gossiped throughout the network. All advertised channels carry a channel authentication proof which proves that the channel is anchored in an unspent output, and also binds the multi-sig keys embedded within the Bitcoin blockchain to the public key identities of the peers in the Lightning Network layer.

Once a node has a complete view of the channel graph, it’s able to passively forward incoming HTLCs according to the forwarding instructions embedded within the onion-encrypted routing information. Path finding for outgoing payments uses a set of heuristics to select a path with sufficient payment flow capacity to carry the payment and which minimizes the required cumulative time-lock and then required fees in that order.

The specification for the authenticated gossip network implemented within lnd can be found here within the Lighting Network specifications.

Lightning Network Specifications

The set of documents defining the Lighting Network are called BOLTs: Basis of Lightning Technologies. lnd doesn’t yet fully implement all of the behavior outlined within the specifications. The latest state of our implementation of the BOLT’s can be tracked within our README. In an upcoming release we aim to achieve full BOLT compliance as a preliminary step, with interoperability with the other Lightning implementations coming at a later date.

Contributors

This release of lnd is the combined work of developers from around the world and includes contributors from Lightning Labs, Bitfury, Blockchain Lab, Chaincode Labs, and MIT DCI. The full list of contributors (in alphabetical order by first name) is:

  • Aleksei Ostrovskiy
  • Alex Akselrod
  • Andrew Samokhvalov (andrew.shvv)
  • Bryan Bishop (kanzure)
  • Bryan Vu
  • Christopher Jämthagen
  • Evgeniy Scherbina
  • John Newbery
  • Joseph Poon
  • Mykola Sakhno
  • Olaoluwa Osuntokun (roasbeef)
  • Riccardo Casatta
  • Paul Capestany
  • Slava Zhigulin
  • Tadge Dryja

Developers, Developers, Developers!

We look forward to engaging new developers as they tinker with lnd to create novel Layer-2 application on top of the Lightning Network and also get a feel for what’s possible with this new technology. We’ve secured the #lnd channel on freenode as a place dedicated to discussing lnd-related development and support.


If you’re also fascinated by the intersection of distributed systems, peer-to-peer networks and applied cryptography we’re exploring with Lightning, then Lightning Labs is hiring for full-time positions. If interested, email laolu32 at gmail.com!