Ce tutoriel s’adresse principalement à celles et ceux qui souhaiteraient construire un nœud de routage Lightning Network. Une bonne connaissance de Linux et de Bitcoin sont des pré-requis. Si vous souhaitez simplement disposer d’un wallet Lightning Network non-custodial, il existe plusieurs solutions comme le wallet Zap (https://zap.jackmallers.com/).
Vous trouverez dans ce tutoriel les instructions détaillées pour installer un nœud complet (full node) Bitcoin (bitcoind) ainsi que le nœud Lightning Network (lnd).
Le full node est utilisé par le nœud lightning pour les actions suivantes :
- Envoyer et recevoir des transactions ‘on chain’ ;
- Séquestrer les fonds dans des wallets multi-signatures (création de canal) ;
- Libération des fonds (fermeture de canal).
Le stack technique est le suivant :
- Architecture ARM7 (odroid xu4)
- Ubuntu 18.04 LTS
- Bitcoind 18.1
- Lnd / lncli: 7.1 beta
- TOR (optionnel)
- Zap wallet (optionnel)
Attention, les Raspberry Pi 3 et 4 tournent sur ARMv8. Ce tutoriel devra donc être adapté en conséquence.
Notez également qu’il vous faudra également disposer d’une adresse IP publique fixe afin de ne pas perturber l’état de vos channels.
Dernier point d’attention, hormis TOR, les composants bitcoind et lnd ne sont installés sous forme de service. Un redémarrage du service nécessitera donc de relancer unitairement les composants.
Préparation du système
Installation du stockage externe
Dans le cas de l’utilisation d’un nouveau disque externe, il sera sans doute nécessaire de le formater, de le monter et de l’ajouter dans /etc/fstab.
Je ne détaillerai pas cette partie bien trop dépendante de votre système.
Dans tous les cas, il faudra prévoir un répertoire spécifique à bitcoind. Dans mon tutoriel, cela sera /mnt/bitcoin/bitcoin et l’utilisateur y aura tous les accès.
Installation de Python3 et make
Python3 et make seront nécessaires.
sudo apt install python3 make
Sécurisation de la plateforme
La liste des mesures suivantes n’est pas exhaustive, cependant, certaines sont nécessaires et simples à mettre en oeuvre.
Créez un nouvel utilisateur administrateur afin d’éviter d’utiliser le compte root
$ adduser admin
Ajoutez le comme sudoers
$ adduser admin sudo
Il peut être utile de créer un utilisateur bitcoin, mais ça ne sera pas nécessaire dans ce tutoriel.
La configuration de votre serveur SSH est un second point. L’usage d’une authentification par mot de passe et d’un accès direct à l’aide du compte root est déconseillé. Il vous sera nécessaire si ce n’est pas déjà fait de créer une paire de clés RSA sur votre poste d’administration.
La commande suivante vous permettra de créer une paire de clef dans le répertoire .ssh de votre utilisateur courant.
$ ssh-keygen
Copiez-la sur votre serveur distant (id_rsa est le nom du fichier précédemment créé).
$ ssh-copy-id -i ~/.ssh/id_rsa admin@IP_seveur
Sur votre serveur, modifiez le fichier /etc/ssh/sshd_config
Les éléments suivant doivent être dé-commentés :
Autorise l’authentification par clef publique :
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
Interdit l’accès ssh à l’utilisateur root :
PermitRootLogin no
Interdit l’authentification par mot de passe :
PasswordAuthentication no
Relancez le service ssh :
$ sudo service sshd force-reload
Sur votre PC d’administration, tentez d’ouvrir une nouvelle connexion ssh afin de vérifier le bon fonctionnement de la nouvelle configuration.
Installation de TOR “The Onion Router”
Cette étape est optionnelle mais vivement recommandée. En effet, TOR vous permettra globalement deux choses :
- Joindre les nœuds sur TOR ;
- Masquer l’adresse IP publique de votre nœud.
Par contre, les nœuds classiques ne pourront plus se connecter à votre nœud. Pour y remédier, il faudra préalablement que votre nœud s’y connecte.
Pour installer TOR, lancer la commande suivante :
$ sudo apt install tor
Éditez la configuration de TOR “/etc/tor/torrc” et ajoutez les lignes suivantes :
SOCKSPort 9050 Log notice stdout ControlPort 9051 CookieAuthentication 1
Lancez TOR :
$ sudo systemctl enable tor.service $ sudo systemctl start tor.service $ sudo systemctl status tor.service
Attention, votre nœud Lightning Network risque de ne pas pouvoir accéder au cookie d’authentification. Il faut autoriser l’utilisateur exécutant TOR (ici “admin”) à pouvoir y accéder. Pour ce faire, lancez la commande suivante :
$ sudo usermod -a -G debian-tor admin Relancez votre session ou lancez la commande suivante. $ sudo su - admin
Configuration réseau
Il est très probable que votre nœud soit derrière un équipement réalisant du NAT (translation d’adresse). C’est le cas lorsque un modem routeur opérateur (votre “box”) porte un réseau IP privé et une adresse IPv4 publique.
Dans ce cas, il faudra prévoir de configurer votre routeur et d’y faire :
- Une réservation de bail DHCP ;
- La configuration de translation de port et d’adresse.
Côté NAT, il faut prévoir ceci : le port TCP 9735 sera utilisé par votre nœud Lightning pour être joignable depuis le réseau Internet. Le port 10009 est facultatif pour administrer votre nœud depuis internet.
Installation de bitcoind
L’installation de bitcoind est relativement aisée. On retrouve les instructions ici : https://bitcoin.org/en/full-node#linux-instructions
Récupérez bitcoind :
wget https://bitcoin.org/bin/bitcoin-core-0.18.1/bitcoin-0.18.1-arm-linux-gnueabihf.tar.gz
Avant de l’installer, il est nécessaire de vérifier la non-altération de l’archive ainsi que de sa provenance.
Pour ce faire, nous allons récupérer l’empreinte numérique et vérifier l’archive.
$ wget https://bitcoin.org/bin/bitcoin-core-0.18.1/SHA256SUMS.asc
$ sha256sum --check SHA256SUMS.asc --ignore-missing bitcoin-0.18.1-arm-linux-gnueabihf.tar.gz: Réussi
Récupérez la clef GPG de l’équipe Bitcoin Core :
$ wget https://bitcoin.org/laanwj-releases.asc
Et vérifiez-là :
$ gpg --with-fingerprint ./laanwj-releases.asc pub rsa4096 2015-06-24 [SC] [expire : 2022-02-10] 01EA5486DE18A882D4C2684590C8019E36C2E964 uid Wladimir J. van der Laan (Bitcoin Core binary release signing key) <laanwj@gmail.com>
Importez la clef :
$ gpg --import ./laanwj-releases.asc
Et vérifiez la signature :
$ gpg --verify SHA256SUMS.asc gpg: Signature faite le ven. 09 août 2019 09:08:43 CEST gpg: avec la clef RSA 90C8019E36C2E964 gpg: Bonne signature de « Wladimir J. van der Laan (Bitcoin Core binary release signing key) <laanwj@gmail.com> » [inconnu]
Finalement, installez bitcoind :
$ sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-0.18.1/bin/*
Vérifiez l’installation avec les commandes suivantes :
$ which bitcoind /usr/local/bin/bitcoind
$ bitcoind --help
Doit vous retourner l’aide de bitcoind.
Configuration de bitcoind
Lancez la commande suivante. Elle vous permettra de sécuriser les accès RPC de bitcoind :
$ wget https://raw.githubusercontent.com/bitcoin/bitcoin/452bb90c718da18a79bfad50ff9b7d1c8f1b4aa3/share/rpcauth/rpcauth.py -qq python3 rpcauth.py lightning
String to be appended to bitcoin.conf:
rpcauth=lightning:887b68fa9f4b7a4a88f175df4b17e4$0a5dc908952c0df9950d167b17e8cd3b874d8283b8981b4196621b538ce17f89
Your password:
P5D_jU_ZjCtD-7N1g3LwcAebhoadv3Pr6H7WtumuSMc=
Notez que lightning est le nom d’utilisateur qui sera utilisé par votre nœud lightning. Il peut être modifié à votre convenance.
Sauvegardez bien le résultat, il sera utilisé par tous les clients de votre full node (donc également lnd).
Créez un fichier bitcoin.conf dans le répertoire bitcoin (ici /mnt/bitcoin/bitcoin/) :
blocksdir=/mnt/bitcoin/bitcoin datadir=/mnt/bitcoin/bitcoin server=1 rpcauth=lightning:887b68fa9f4b7a4a88f175df4b17e4$0a5dc908952c0df9950d167b17e8cd3b874d8283b8981b4196621b538ce17f89 txindex=1 # [zeromq] # Enable publishing of block hashes to <address>. #zmqpubhashblock=tcp://127.0.0.1:28332 #zmqpubhashtx=tcp://127.0.0.1:28332 zmqpubrawblock=tcp://127.0.0.1:28332 # Enable publishing of raw transaction hex to <address>. zmqpubrawtx=tcp://127.0.0.1:28333
Notez bien que le paramètre rpcauth doit être paramétré avec le résultat précédent.
Le paramètre txindex est optionnel mais recommandé pour votre nœud lightning.
Dans une commande screen dédiée (screen -S bitcoind), lancez bitcoind de la façon suivante :
$ bitcoind --datadir=/mnt/bitcoin/bitcoin/
A partir de maintenant, il vous faudra plusieurs jours pour récupérer l’ensemble des blocs.
Les lignes suivantes vous indiqueront la fin de la synchronisation :
2019-08-24T09:23:06Z UpdateTip: new best=000000000000000000158495173d0d7646f5277215586fee981ed13f6f304dfc height=591520 version=0x3fff0000 log2_work=90.999947 tx=448165028 date='2019-08-24T09:23:10Z' progress=1.000000 cache=16.9MiB(149805txo) warning='39 of last 100 blocks have unexpected version'
Installation de Golang
L’installation de lnd nécessite l’installation préalable de golang.
Récupérer golang avec la commande suivante :
$ wget https://dl.google.com/go/go1.12.9.linux-armv6l.tar.gz
Décompressez l’archive :
$ tar -C /usr/local -xzf go1.12.9.linux-armv6l.tar.gz
Modifiez votre $HOME/.profile et ajoutez y :
GOROOT=/usr/local/go GOPATH=$HOME/gocode PATH=$GOPATH/bin:$GOROOT/bin:$PATH
Relancez alors le profil avec la commande source $HOME/.profile
Installation de lnd
Lnd est l’implémentation officielle du Lightning Network.
Récupérez lnd et installez-le :
$ go get -d github.com/lightningnetwork/lnd $ cd $GOPATH/src/github.com/lightningnetwork/lnd $ make && make install tags="signrpc walletrpc chainrpc invoicesrpc routerrpc watchtowerrpc"
Allez dans $GOPATH/gocode/bin et lancez commande suivante afin de vérifiez l’installation :
./lnd --help
Elle doit vous retournez l’aide de lnd.
La compilation de lnd a généré également les fichiers suivants :
- lncli : permet de gérer votre noeud lnd
- lnconnect : permet de vous fournir les éléments d’auto-configuration aux client Zap desktop et mobile.
Configuration de lnd
Créez le fichier $HOME/.lnd/lnd.conf et éditez-le.
Ajoutez la configuration suivante et adaptez-là à votre configuration :
# Configuration statique à ne pas modifier bitcoin.mainnet=1 bitcoin.active=1 debuglevel=info bitcoin.node=bitcoind bitcoind.rpchost=127.0.0.1:8332 bitcoind.zmqpubrawblock=tcp://127.0.0.1:28332 bitcoind.zmqpubrawtx=tcp://127.0.0.1:28333 restlisten=0.0.0.0:8080 rpclisten=0.0.0.0:10009 # Nom du noeud (il permet de le retrouver facilement) alias="JohnOn Chain LN" # Taille minimale d'un channel (100 satoshis) minchansize=100 # Utilisation RPC (utilisez son format 'password') bitcoind.rpcuser=lightning bitcoind.rpcpass=P5D_jU_ZjCtD-7N1g3LwcAebhoadv3Pr6H7WtumuSMc= # Configuration auto pilot activée (nombre de channel maximal=5 / allocation du buget maximal 60% de la balance onchain) autopilot.active=1 autopilot.maxchannels=5 autopilot.allocation=0.6 # Configuration statique TOR si utilisé (décommenter les lignes) # tor.active=true # tor.v3=true # tor.streamisolation=true # listen=localhost # Adresse IP, ou nom d'hôte. Désactivez si vous utilisez TOR externalip=xxx.xxx.xxx.xxx
Démarrage de lnd
Lancez lnd avec la commande suivante (dans un screen) :
$GOPATH/gocode/bin/lnd
Ce dernier vous demandera de faire un lncli create ou un lncli unlock.
- “Create” permet de créer votre wallet ;
- “Unlock” permet de le déverrouiller.
À noter que pour recevoir des paiements, lnd devra toujours tourner avec un wallet débloqué. Il est fortement conseillé de ne pas tenter d’importer un wallet existant (hormis depuis un autre lnd).
Pour une première configuration, il faut créer son wallet.
Lnd vous fournira une seed de 24 mots (BIP39) qu’il faudra bien évidement sauvegarder.
Après le premier lancement, il faut attendre plusieurs minutes le temps que lnd scanne l’état de la base de bitcoind.
Lancez la commande suivante afin de vérifier l’état du noeud :
$ $GOPATH/gocode/bin/lncli getinfo
{
“version”: “0.7.1-beta commit=v0.7.1-beta-76-g9a5ac78912a52ddd5722df81e77c7746e6d857be”,
“identity_pubkey”: “02ad921d465e6ecfe493e90864275ffcf1b70c6050c76e6c33701b0c3686d687b9”,
“alias”: “JohnOn Chain LN”,
“color”: “#3399ff”,
“num_pending_channels”: 0,
“num_active_channels”: 11,
“num_inactive_channels”: 1,
“num_peers”: 14,
“block_height”: 591556,
“block_hash”: “0000000000000000000ad44fca8d49a91b3db1c817432558d567ff0b2d2d0454”,
“best_header_timestamp”: 1566658329,
“synced_to_chain”: true,
“testnet”: false,
“chains”: [
{
“chain”: “bitcoin”,
“network”: “mainnet”
}
],
“uris”: [
]
}
On trouve les informations suivantes :
- Synced_to_chain : ‘true’ indique que le nœud (bitcoin) est bien synchronisé avec le réseau.
- Identity_pubkey : identifiant unique de votre nœud (lightning network) sur le réseau.
- Num_peers : nombre de nœuds (lightning network) connectés.
- Num_active_channels : nombre de channels actifs.
- Num_inactive_channels : nombre de channels inactifs (le nœud distant ne répond pas).
- Num_pending_channels : nombre de channels en attente d’ouverture ou de fermeture.
Capitalisation du nœud
Un nœud dispose de deux wallets :
- On-chain : les fonds sont utilisables de manière classique sur le réseau Bitcoin ;
- Off-chain : les fonds sont sous séquestres dans wallet multisig (correspondant à un channel).
Pour ouvrir un channel, il faut dans un premier temps envoyer des bitcoins sur le wallet on-chain.
Lancez la commande suivante pour obtenir une adresse :
$ $GOPATH/gocode/bin/lncli newaddress np2wkh
La commande vous retourne une adresse publique au format 3xxxxx (nested witness public key hash).
Envoyez quelques satoshis à cette adresse.
Après validation, il est possible d’obtenir le solde du wallet avec la commande suivante :
$ $GOPATH/gocode/bin/lncli walletbalance
Il est même possible de récupérer les UTXOs (transactions non dépensées) correspondantes avec la commande suivante :
$ $GOPATH/gocode/bin/lncli listunspent
Création d’un channel
Cette opération est facultative si vous avez activez auto pilot. Dans le cas contraire, il vous faudra ouvrir un channel auprès de plusieurs nodes. Dans notre exemple, nous utiliserons LNBIG. Cette opération vous fournira une grande connectivité au réseau pour un coût moindre.
Allez sur le site de l’opérateur https://lnbig.com/#/ et récupérez l’URL d’un des nœuds, ici :
03bc9337c7a28bb784d67742ebedd30a93bacdf7e4ca16436ef3798000242b2251@lnd-06.LNBIG.com:9735
Avant de créer le channel, il faut se connecter au nœud avec la commande suivante :
$ $GOPATH/gocode/bin/lncli connect 03bc9337c7a28bb784d67742ebedd30a93bacdf7e4ca16436ef3798000242b2251@lnd-06.LNBIG.com:9735
Note : La commande ne retourne rien.
La commande suivante est cruciale puisqu’elle permet de créer le channel. Cela sous-entend:
- La création d’une transaction on-chain ;
- L’envoi des fonds dans un wallet multisig (séquestre).
Les fonds vous serviront à envoyer des paiements Lightning Network (mais pas d’en recevoir).
$ $GOPATH/gocode/bin/lncli openchannel --node_key 0298f6074a454a1f5345cb2a7c6f9fce206cd0bf675d177cdbf0ca7508dd28852f --local_amt 60000 --sat_per_byte 1
Les options suivantes sont :
–local_amt : le nombre de satoshis pour le solde local
–sat_per_byte : le nombre de satoshis par byte. Il permet de définir le montant des frais. Plus il est important et plus la transaction sera intégrée rapidement dans un bloc. Ici, j’ai mis la valeur la plus basse (1 sat/B). En fonction de la congestion de la blockchain, cela vous prendra plus d’une journée pour créer le channel.
LNBIG vous propose gratuitement de créer un channel vers votre nœud. C’est particulièrement pratique pour recevoir des paiements. Vous trouverez les instructions sur le site.
Vérification des channels
La vérification des channels est quelque chose d’indispensable surtout lorsque vous en possédez un grand nombre.
$ $GOPATH/gocode/bin/lncli listchannels.
La commande vous retourne l’ensemble des channels actifs et inactifs. Vous trouverez plusieurs informations comme :
- Active : L’état du channel (actif ou inactif)
- Capacity : La capacité du channel (local est distant)
- Local_balance : La capacité d’envoi dans le channel (les sats que vous possédez)
- Remote_balance : La capacité de réception dans le channel (les sats que le noeud distant possède).
Recevoir un paiement
Le paiement lightning network fonctionne par le principe de facture. Il permet de payer mais également d’acheminer le paiement à travers le réseau.
Si vous souhaitez recevoir un paiement, il faut donc créer un invoice et l’envoyer à la personne souhaitée :
$ $GOPATH/gocode/bin/lncli addinvoice --amt 1000 --expiry 3600
La commande suivante peut prendre plusieurs paramètres dont :
- Amt : Le nombre de satoshis de la facture (peut être omis. Dans ce cas, c’est le payeur qui définit cette somme)
- Expiry : la durée de validité de l’invoice.
Il est à noter qu’un invoice est à usage unique (comme une adresse bitcoin).
Réaliser un paiement
Si au contraire, vous devez envoyer un paiement, il faudra utiliser la commande suivante :
$ $GOPATH/gocode/bin/lncli payin
Sachez également que la restauration d’une sauvegarde trop ancienne peut également poser problème.
En effet, Lightning Network intègre un mécanisme anti-triche. Lorsqu’un nœud diffuse un état précédent, le nœud voisin peut le punir en récupérant l’ensemble des fonds (car cela s’apparente à une tentative de double dépense).
Exemple, vous avez réalisé une sauvegarde il y a une semaine. Entre temps, vous avez réalisé des échanges sur le Lightning Letwork. Par la suite, vous êtes contraint de changer de machine. Vous restaurez votre sauvegarde (vieille d’une semaine). Vous risquez de diffuser un état précédent.
Dans tous les cas, la sauvegarde passe par l’arrêt de lnd à l’aide de la commande :
$ $GOPATH/gocode/bin/lncli stop
Vous avez deux possibilités :
- La sauvegarde de votre seed et de l’état de vos channels
- La sauvegarde du répertoire .lndvoice <invoice>
Évidemment, un paiement peut échouer pour plusieurs raisons :
- Pas de channel actif ;
- Les channels actifs ne permettent pas d’acheminer le paiement (manque de connectivité ou pas de capacité d’envoi suffisante) ;
- Il n’existe pas de route pour atteindre le wallet du destinataire ;
- Frais de routage trop importants (si vous spécifiez des frais maximum).
Fermeture d’un channel
La fermeture vous permet de récupérer les fonds “on chain”.
Il y a plusieurs possibilités :
- Le nœud voisin est actif : La fermeture se fait le temps d’une transaction Bitcoin.
- Le nœud voisin est inactif : La fermeture sera forcée et non immédiate (peut prendre jusqu’à une semaine).
Sauvegarde
Comme évoqué dans la vidéo, la sauvegarde est cruciale. Une absence de sauvegarde peut entraîner la perte de vos fonds.
Méthode classique
Pour la première solution, la commande suivante permet de sauvegardee l’état de vos channels.
$ $GOPATH/gocode/bin/lncli exportchanbackup --all --output_file $HOME/backupchan.asc
La commande suivante vous permet de vérifier la sauvegarde :
$ $GOPATH/gocode/bin/lncli verifychanbackup --multi_file $HOME/backupchan.asc
La restauration passe par la commande suivante :
$ $GOPATH/gocode/bin/lncli restorechanbackup --multi_file $HOME/backupchan.asc
Sauvegarde du répertoire
Le script suivant permet facilement de sauvegarder votre répertoire :
http://www.zapread.com/Post/Detail/4902
Le script stoppera automatiquement lnd, sauvegardera le répertoire .lnd et relancera lnd.
Gestion de votre nœud
La gestion de votre nœud est cruciale et commence par la capacité à créer des factures (invoices) et réaliser des paiements.
Vous devrez également créer et fermer vos channels.
L’utilitaire lncli peut faire tout cela, mais ce n’est pas très pratique à l’usage courant.
Sachez que Zap wallet peut se connecter à votre nœud (site éditeur https://zap.jackmallers.com/).
Pour ce fait, il faudra utiliser l’utilitaire “lndconnect” (déjà installé avec lnd). Il permet de vous créer une adresse de connexion. Cette adresse embarque notamment les informations d’authentification et ne doit jamais être transmise à un tiers.
Si vous songez à utiliser la version IOS, il faudra préalablement re-générer le certificat de votre nœud. Il est également préférable de disposer d’un nom de domaine, IOS ayant la fâcheuse tendance à être très tatillon sur la vérification des certificats.
Pour ce faire, stoppez lnd avec la commande suivante :
$ $GOPATH/gocode/bin/lncli stop
Archivez la clef privée et le certificat associé :
$ mv $HOME/.lnd/tls.cert $HOME/.lnd/tls.cert.BACK $ mv $HOME/.lnd/tls.cert $HOME/.lnd/tls.key.BACK
Relancez lnd via la commande suivante :
$ $GOPATH/gocode/bin/lncli --tlsextraip=<IP publique> --tlsextradomain=<DNS>
Les paramètres permettent de créer un certificat avec le nom DNS et/ou l’IP de connexion.
A présent, générez l’adresse de connexion via lndconnect :
$ $GOPATH/gocode/bin/lndconnect --adminmacaroonpath=$HOME/.lnd/data/chain/bitcoin/mainnet/admin.macaroon --host=<adresse de connexion>
Cette commande retourne un QR code. Il est probable que votre shell ne puisse pas l’afficher entièrement. Je vous recommande d’utiliser l’option -j qui vous retournera simplement l’adresse.
Il ne vous restera plus qu’à la paramétrer dans Zap Wallet.
À son lancement, cliquez sur “Create wallet” et sélectionnez l’option “Connect”.
Il ne vous restera plus qu’à y coller l’adresse retournée par lndconnect.
Tutoriel vidéo
Vidéo d’explication pour construire un nœud Lightning Network :
Commentaires