Setup Lightning Network sur votre node Bitcoin

Setup Lightning Network sur votre node Bitcoin

 

 

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 intéragir 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 nodes sur le mainnet, bien qu’il y ait plus de 3000 node, 12000 channel ouvertes sur celui-ci à l’heure où j’écris cet article. Comme 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 le mettez en place avec des vrais bitcoins. Si vous avez un problème ou une remarque n’hésitez pas à le dire dans les commentaires ou sur Discord : https://discord.gg/jcwHsT3 .

 

Prérequis

Maintenant que la mise en garde est faite, on va pouvoir passer au concret : étant donné que ça 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 ayiez chez vous et ce que j’ai chez moi, pour pouvoir comparer en cas de besoin.

  • Un user « bitcoin »
  • bitcoind (avec un service mais sinon je risque de faire une parenthèse après)
  • bitcoin-cli qui communique sans problème avec bitcoind (et évidemment de bien savoir pourquoi et comment (le fichier bitcoin.conf, etc..))
  • bitcoind interfacé avec tor ou non, je ferai 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 sonc je parlerai de systemd et 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 :

/* Pour tor, optionnel */

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 tor */

useradd bitcoin -r -m -G debian-tor # Enlever "-G debian-tor" si pas 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'

Ici 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 parcequ’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 conf.

Configurer c-lightning

La partie casse-gueule clavier figure. On va créer un service lightningd qui sera run par bitcoin (l’user) pour pouvoir communiquer avec bitcoind (le service).

Premièrement on crée 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. Evidemment ne prenez pas celui-là.
Plutôt que d’utiliser le script, vous pouvez set un password avec rpcuser= et rpcpassword=, mais choisissez un mot(/phrase) de passe très fort.

Redémarrez bitcoind et on passe à la configuration de C-lightning.

/* Optionnel, pour tor */

Pour connecter Lightning Network aussi à-travers tor, on peut suivre 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

A 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. Cf le début de l’article pour le dépôt tor.

systemctl restart tor@default

Pour connaître vos adresses (ou votre si vous 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 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 doc et l’explication de toutes les options ici. Voici une configuration possible, vous pouvez modifier pleins de trucs (surtout si ça marche pas à un moment).

# Si vous avez un path special 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 explorer
rgb=00000
alias=Darosior


# Vide pour écouter à la fois sur tor, ipv4, ipv6
bind-addr=
# Si vous 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 remaquer que j'avais pas spécifié le port en copiant/collant mais ça marche quand même
# les fees, choisissez ce que vous voulez, optionnel
fee-base=
fee-per-satoshi=
# Ca je l'ai mis pour comprendre d'où venaient les problèmes que je rencontrais. Je vous conseille de le laisser si vous rencontrez des problèmes
log-level=debug
# Endroit similaire à bitcoind
log-file=/home/bitcoin/.lightning/debug.log

On touche au but. Plus que le service (créez un fichier /etc/systemd/system/lightningd.service) dont les sample peuvent être trouvés ici (vous aurez remarqué qu’il y en a nettement moins que sur le repo de Bitcoin 😉 ). Voici le miens (j’ai juste changé un ou deux trucs) :

[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’à :

systemctl start lightningd
systemctl enable lightningd

 

Connecter son noeud et ouvrir des channel

On va interfacer avec le daemon lightningd grâce à lightning-cli :

su -c 'su - bitcoin'
lightning-cli help

Vous pouvez voir les differentes options, vérifier que toutes les interfaces sont actives avec :

lightning-cli getinfo

Si tout va bien vous allez pouvoir fund votre node en prenant d’abord une adresse :

lightning-cli newaddr

Une fois que la transaction est arrivée vous pouvez commencer à vous connecter à d’autres noeuds et ouvrir des channel (La connection sans ouvrir de channel ne nécessite pas de bitcoins). Je vous invite à vous connecter au miens (03678b4f041fbfbeebcafc076469df75decf81da20a53bd490172e83ce532df1fa@82.255.152.32:9735), mais vous en trouverez d’autres sur un explorer (il est long comme un Dimanche à charger). Essayez de vous connecter à plusieurs noeuds et d’ouvrir plusieurs channel (en fonction de votre capacité).

lightning-cli connect 03678b4f041fbfbeebcafc076469df75decf81da20a53bd490172e83ce532df1fa@82.255.152.32:9735

Puis pour ouvrir un channel juste l’id puis le montant (en Satoshis)

lightning-cli fundchannel 03678b4f041fbfbeebcafc076469df75decf81da20a53bd490172e83ce532df1fa 100000

Répétez ces étapes avec tous les node avec lesquels vous voulez ouvrir des channel.
Félicitations vous êtes désormais connectés au Lightning Network 🙂 .

 

Erreurs fréquentes

  • C-lightning n’arrive pas à communiquer avec bitcoind : vérifiez la connection 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 de partout.
  • C-lightning ne voit pas que bitcoind est synchronisé et à jour. Plusieurs options encore ici : C-lightning ne supporte pas les node prune, si c’est votre cas vous devez synchroniser la chaîne. Sinon essayez de spécifier le path directement dans ExecStart (« –bitcoin-datadir=/path/vers/lachaine ») dans /etc/systemd/system/lightningd.service.
  • Je vais update 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/

Articles Similaires

Laisser une réponse