Chargement
keyboard_arrow_up
TechniqueTutoriels

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

Indice des prix

Sécurisez vos cryptos

Ledger Nano S
Ledger Blue
Trezor Hardware wallet

Flux Twitter

Achetez des bitcoins/ethers

Acheter bitcoins et ethers sur Coinhouse
Acheter des bitcoins sur ZeBitcoin
Achat / Vente de crypto-monnaies sur coinbase
BitIt, achat de crypto-monnaies facile et rapide
SpectroCoin, le multi-services
Cex.io, Achat / Vente et échange de crypto-monnaies
Coinmama, l’achat bitcoin ethereum facile