Bitcoin : installer « Lightning Network »
Inventé depuis longtemps (sur l’échelle de temps de Bitcoin), implémenté depuis peu, Lightning Network est une évolution majeure du protocole sans en être une : c’est une seconde couche. C’est ce que l’on verra dans ce tutoriel, puisqu’il s’agira de faire interagir le daemon de Lightning (lightningd) avec bitcoind. J’utiliserai C-lightning, l’implémentation en C de Blockstream.
Avant-propos
Lightning Network est une technologie nouvelle. Il est encore « déconseillé » de déployer des nœuds sur le mainnet, bien qu’il y en ait plus de 3000, et 12000 canaux ouverts sur celui-ci à l’heure où j’écris cet article. Comme c’est spécifié un peu partout, les implémentations (c-lightning, lnd, Éclair…) ont des bugs connus et inconnus, et ont de plus été très peu testées : faites donc attention si vous les mettez en place avec de vrais bitcoins. Si vous avez un problème ou une remarque, n’hésitez pas à le dire dans les commentaires ou sur Discord.
Prérequis
Maintenant que la mise en garde est faite, nous allons pouvoir passer au concret : étant donné que tout n’a pas encore été très testé, très peu d’erreurs sont répertoriées et c’est donc beaucoup plus difficile de se sortir d’une impasse. Je vais donc décrire dans cette partie ce que j’attends que vous ayez chez vous, et ce que j’ai chez moi, pour pouvoir comparer en cas de besoin :
- Un user « bitcoin »
- bitcoind (avec un service – parenthèse après).
- bitcoin-cli qui communique sans problème avec bitcoind – et évidemment, bien savoir pourquoi et comment (le fichier bitcoin.conf, etc.)
- bitcoind interfacé avec Tor ou non, je couvrirai les deux cas.
- Que vous compreniez comment fonctionnent Bitcoin (si ce n’est pas le cas : ici et ici peuvent être tout à fait humblement un bon commencement ? ) et Lightning (si ce n’est pas le cas, je devrais faire bientôt un article, mais en attendant celui de Bitcoin magazine est vraiment pas mal, il y a aussi des liens vers des ressources dans mon article sur les améliorations apportées à Bitcoin)
Je suis sous Debian donc je parlerai de systemd et de tout ce que Debian utilise; si vous êtes sur un autre OS qui n’a pas les mêmes spécifications je mettrai des liens externes, mais je n’aurai pas testé.
Rapidement si vous n’avez pas les prérequis décrits ci-dessus, voici quelques commandes, mais je ne détaillerai pas :
Optionnel : Lightning Network via Tor
Ajouter le dépôt pour Tor (as root) :
deb http://deb.torproject.org/torproject.org stretch main deb-src http://deb.torproject.org/torproject.org stretch main gpg --keyserver keys.gnupg.net --recv A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add - apt update && apt install tor
Ensuite dans /etc/tor/torrc :
RunAsDaemon 1 PortForwarding 1 MaxMemInQueues 500MB ControlPort 9051 CookieAuthentication 1 CookieAuthFileGroupReadable 1
Vous pouvez changer « MaxMemInQueues » ou même l’enlever, c’était propre à mes capacités.
systemctl restart tor@default #systemctl restart bitcoind
(Fin de la première partie sur tor)
useradd bitcoin -r -m -G debian-tor #
Remarque : enlever « -G debian-tor » en l’absence de Tor.
Créez un fichier /etc/systemd/system/bitcoind.service :
[Unit] Description=Bitcoin daemon After=network.target [Service] ExecStart=/usr/bin/bitcoind -daemon -conf="/path/vers/bitcoin.conf" -datadir="/path/vers/la/chain" -pid=/run/bitcoind/bitcoind.pid RuntimeDirectory=bitcoind User=bitcoin Type=forking PIDFile=/run/bitcoind/bitcoind.pid Restart=on-failure PrivateTmp=true ProtectSystem=full NoNewPrivileges=true PrivateDevices=true MemoryDenyWriteExecute=true TimeoutStopSec=60s TimeoutStartSec=2s StartLimitInterval=120s StartLimitBurst=5 [Install] WantedBy=multi-user.target
Source : https://github.com/bitcoin/bitcoin/tree/master/contrib/init où vous trouverez aussi les services pour Upstart, OpenRC, CentOS, MacOS.
systemctl start bitcoind systemctl enable bitcoind
Je suis allé vite dans cette partie, pour ne pas rallonger l’article avec un hors sujet, mais n’hésitez pas si vous avez besoin de précisions dans les commentaires.
Installer C-lightning
source : https://github.com/ElementsProject/lightning
Les dépendances :
apt update && apt install -y autoconf automake build-essential git libtool libgmp-dev libsqlite3-dev python python3 net-tools zlib1g-dev
On clone et on compile :
git clone https://github.com/ElementsProject/lightning.git cd lightning ./configure make su -c 'make install'
Si vous voulez tester :
systemctl stop bitcoind bitcoind & #.....attendre qu'il vérifie les blocs.... lightningd
S’il vous parle, mais ne s’arrête pas, tout va bien. Faites juste un petit :
rm -r ~/.lightning
Pour nettoyer ce qu’il a créé. S’il s’arrête avec un message d’erreur, c’est le plus souvent parce qu’il n’arrive pas à communiquer avec bitcoind, dans ce cas pas de panique.
C-lightning utilise bitcoin-cli pour lui parler et ça devrait se régler avec la configuration.
Configurer c-lightning
La partie casse-gueule clavier figure. On va créer un service lightningd qui sera exécuté par bitcoin (l’utilisateur) pour pouvoir communiquer avec bitcoind (le service).
Premièrement, il faut créer un login pour RPC, donc vous pouvez soit utiliser (conseillé) le script fourni avec le code de Bitcoin. Vous l’avez si vous avez compilé Bitcoin, sinon :
wget https://raw.githubusercontent.com/bitcoin/bitcoin/452bb90c718da18a79bfad50ff9b7d1c8f1b4aa3/share/rpcauth/rpcauth.py -qq python3 rpcauth.py lightning
Il va vous sortir un truc du genre :
rpcauth=lightning:6ed5aa1ef4526e0414ec29f9ee7f84$b9840564b864ec04a659c0ebd5f924ca3471ec6378b67e546869a89ed8f685e8 Your password: EH03M0BApKTWV4wc2qI5dFmxyr4jA4eqgE3iLOAH-No=
Copiez « rpcauth=lightning:blablablblabla » dans votre bitcoin.conf (par défaut ~bitcoin/.bitcoin/bitcoin.conf – sinon vous savez où il est), il faut aussi avoir server=1 pour accepter les commandes JSON-RPC. Notez bien votre password, on le mettra dans la config de C-lightning, comme ça la boucle est bouclée. Évidemment, ne prenez pas celui-là. Plutôt que d’utiliser le script, vous pouvez créer un password avec rpcuser= et rpcpassword=, mais choisissez un mot (ou phrase) de passe très fort.
Redémarrez bitcoind, et passons à la configuration de C-lightning.
Optionnel : Lightning Network via Tor
Pour connecter Lightning Network aussi à travers Tor, suivons les instructions décrites ici. En 6 lignes, ça donne :
#tor addr v2 HiddenServiceDir /var/lib/tor/ln_service_v2/ HiddenServicePort 9735 127.0.0.1:9735 #tor addr v3 HiddenServiceDir /var/lib/tor/ln_service_v3/ HiddenServiceVersion 3 HiddenServicePort 9735 127.0.0.1:9735
À ajouter dans /etc/tor/torrc. Attention, si vous avez installé Tor depuis les dépôts Debian, il n’est pas à jour et ne supporte pas les adresses v3. Voir le début de l’article pour le dépôt Tor.
systemctl restart tor@default
Pour connaître vos adresses (ou la votre si vous n’en avez mis qu’une seule) qu’il vous faudra ajouter dans la config vous pouvez faire :
cat /var/lib/tor/ln_service_v2/hostname cat /var/lib/tor/ln_service_v3/hostname
(Fin de la seconde partie sur Tor)
C-lightning utilise par défaut un dossier caché dans votre répertoire utilisateur comme Bitcoin. Donc :
mkdir ~bitcoin/.lightning
Puis créez un fichier nommé « config » dans ce dossier. Vous pouvez trouver la documentation et l’explication de toutes les options ici. Voici une configuration possible, vous pouvez modifier pleins de trucs (surtout si ça ne marche pas à un moment).
# Si vous avez un chemin d'accès spécial vers votre chaîne bitcoin-datadir="/path/vers/la/chaine/" bitcoin-rpcuser="lightning" bitcoin-rpcpassword="VOTRE PASSWORD QUE LE SCRIPT A OUTPUT" # La couleur et le nom tel que vous pourrez l'apercevoir sur un explorateur rgb=00000 alias=Darosior # Vide pour écouter à la fois sur Tor, IPv4, IPv6 bind-addr= # Si vous n'utilisez pas Tor, vous pouvez mettre # bind-addr=VOTRE_IP_PUB:9735 announce-addr=VOTRE_IP_PUBLIQUE:9735 # tor proxy=127.0.0.1:9050 announce-addr=adresse_tor_v2.onion:9735 announce-addr=adresse_tor_v3.onion # Je viens de remarquer que je n'avais pas spécifié le port en copiant/collant, mais ça marche quand même # les fees (frais), choisissez ce que vous voulez, optionnel fee-base= fee-per-satoshi= # J'ai mis les lignes suivantes pour comprendre d'où venaient les problèmes que je rencontrais. Je vous conseille de les laisser si vous rencontrez des problèmes. log-level=debug # Endroit similaire à bitcoind log-file=/home/bitcoin/.lightning/debug.log
Nous touchons au but. Il ne manque plus que le service (créez un fichier /etc/systemd/system/lightningd.service) dont les samples peuvent être trouvés ici (vous aurez remarqué qu’il y en a nettement moins que sur le dépôt de Bitcoin ?). Voici le mien (j’ai juste changé une ou deux choses) :
[Unit] Description=C-Lightning (Lightning network) daemon Requires=bitcoind.service After=bitcoind.service [Service] ExecStart=/usr/local/bin/lightningd --daemon --mainnet --lightning-dir=/home/bitcoin/.lightning --pid-file=/run/lightningd/lightningd.pid # Creates /run/lightningd owned by bitcoin RuntimeDirectory=lightningd User=bitcoin Group=bitcoin Type=forking PIDFile=/run/lightningd/lightningd.pid Restart=on-failure # Hardening measures #################### # Provide a private /tmp and /var/tmp. PrivateTmp=true # Mount /usr, /boot/ and /etc read-only for the process. ProtectSystem=full # Disallow the process and all of its children to gain # new privileges through execve(). NoNewPrivileges=true # Use a new /dev namespace only populated with API pseudo devices # such as /dev/null, /dev/zero and /dev/random. PrivateDevices=true # Deny the creation of writable and executable memory mappings. MemoryDenyWriteExecute=true [Install] WantedBy=multi-user.target Si bitcoind tourne déjà, il ne reste plus qu’à exécuter : systemctl start lightningd systemctl enable lightningd
Connecter son nœud et ouvrir des canaux
Nous allons l’interfacer avec le daemon lightningd grâce à lightning-cli :
su -c 'su - bitcoin' lightning-cli help
Vous pouvez voir les différentes options, vérifiez que toutes les interfaces sont actives avec :
lightning-cli getinfo
Si tout va bien, vous allez pouvoir financer votre nœud en prenant d’abord une adresse :
lightning-cli newaddr
Une fois que la transaction est effective, vous pouvez commencer à vous connecter à d’autres nœuds et à ouvrir des canaux (la connexion sans ouvrir de canal ne nécessite pas de bitcoins). Je vous invite à vous connecter au mien (03678b4f041fbfbeebcafc076469df75decf81da20a53bd490172e83ce532df1fa@82.255.152.32:9735), mais vous en trouverez d’autres sur un explorateur (il est long comme un dimanche à charger). Essayez de vous connecter à plusieurs nœuds et d’ouvrir plusieurs canaux (en fonction de votre capacité).
lightning-cli connect 03678b4f041fbfbeebcafc076469df75decf81da20a53bd490172e83ce532df1fa@82.255.152.32:9735
Puis, pour ouvrir un canal, l’identifiant puis le montant suffisent (en satoshis).
lightning-cli fundchannel 03678b4f041fbfbeebcafc076469df75decf81da20a53bd490172e83ce532df1fa 100000
Répétez ces étapes pour tous les nœuds avec lesquels vous voulez ouvrir des canaux. Félicitations, vous êtes désormais connecté au Lightning Network ? !
Erreurs fréquentes
- C-lightning n’arrive pas à communiquer avec bitcoind : vérifiez la connexion de bitcoin-cli directement dans le prompt, si ça ne marche pas vérifiez bitcoin.conf. Sinon, essayez de spécifier une option bitcoin-cli=/path/vers/bitcoin-cli. Vérifiez aussi les permissions de l’user bitcoin partout.
- C-lightning ne voit pas que bitcoind est synchronisé et à jour. Plusieurs options encore ici : C-lightning ne supporte pas les pruned nodes (nœuds élagués), si c’est votre cas vous devez synchroniser la chaîne. Sinon, essayez de spécifier le chemin d’accès (path) directement dans ExecStart (« –bitcoin-datadir=/path/vers/lachaine ») dans /etc/systemd/system/lightningd.service.
- Je mettrai à jour cette liste avec les retours.
EDIT : Mettre à jour lightningd
su -c 'systemctl stop lightningd' cd lightning git fetch origin master git checkout v0.6.2 # Ou la dernière release ./configure make su -c 'make install' su -c 'systemctl start lightningd'
Un lien utile : https://lnroute.com/
Sources : Crypto-Lyon.fr || Images from Shutterstock