Bitcoin : installer un noeud complet

Suite à l’article concernant la mise en place d’un node Lightning Network (qui fonctionne en utilisant un noeud Bitcoin), on m’a dit : « Ah c’est bien Lightning Network, tout ça, c’est bien expliqué, mais… comment mettre en place un nœud Bitcoin du coup ? ». Je me suis donc résolu à en faire un tutoriel afin de permettre à quiconque de pouvoir utiliser Bitcoin et C-lightning, tout en augmentant la résilience du réseau à la censure.

Un nid douillet pour accueillir Bitcoin

Commençons par configurer notre environnement. J’utiliserai pour ce tutoriel Debian 9, mais la procédure restant relativement rudimentaire, vous pourrez aisément suivre et adapter pour une autre distribution.

Premièrement, nous allons faire les choses bien et ajouter un user bitcoin sous lequel le daemon (bitcoind) tournera :

useradd -r -m -d /home/bitcoin bitcoin

Cette commande ajoute un utilisateur system, qui ne pourra pas se connecter. Pour passer sous cet user, utiliser en tant que root :

su - bitcoin

Pour en savoir plus sur useradd :

man useradd

Les données (la blockchain, la configuration, etc..) seront stockées dans /home/bitcoin/.bitcoin par défaut. Vous pouvez très bien stocker la blockchain sur un disque dur externe en spécifiant plus tard l’option datadir. Dans ce cas pensez à donner les droits en lecture et écriture du dossier de montage à l’utilisateur bitcoin. Vous pouvez sinon ajouter tout simplement un lien symbolique.

On va à présent installer les dépendances nécessaires à la compilation des sources (cf. les instructions de build) :

apt install git build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev libminiupnpc-dev libzmq3-dev jq

Si vous souhaitez aussi bénéficier de l’interface graphique vous aurez besoin de :

libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler

A présent, il nous faut Berkeley-DB en version 4.8 (pas supérieure), c’est l’étape la plus compliquée.

  • Si vous êtes sous Ubuntu vous avez de la chance il y a un PPA :
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install libdb4.8-dev libdb4.8++-dev
  • Si vous êtes sous Debian, j’en ai fait un script (qui va fetch les packages et les installer) pour la création de l’INSAcoin :
wget https://raw.githubusercontent.com/Crypto-lyon/INSAcoin/master/scripts/install_libdb4.8.sh && chmod +x install_libdb4.8.sh && ./install_libdb4.8.sh amd64 && rm install_libdb4.8.sh

Si vous avez un OS en 32 bits, remplacez amd64 par i386.

Chauffer le nid

Dans cette partie on va faire un peu chauffer votre processeur en compilant bitcoin-core depuis les sources.

su - bitcoin
bash # pour être un peu plus confortable
cd /home/bitcoin

Puis on récupère les sources de la dernière version (0.17 au moment ou j’écris l’article) :

git clone -b 0.17 https://github.com/bitcoin/bitcoin && cd bitcoin

Et c’est parti :

./autogen.sh
./configure --enable-cxx --without-gui # Enlevez evidemment le without-gui si vous voulez le wallet qt5
make -j 4 # Ajustez la valeur de l'option -j a votre nombre cores
su -c 'make install'

Ça risque de prendre un bout de temps (voir deux bouts, en fonction de votre CPU).

Une fois la compilation terminée, vous pouvez lancer :

bitcoind

Vérifiez que tout va bien. S’il a bien commencé à synchroniser la chaîne, il devrait vous sortir plein de lignes du style :

UpdateTip: new best=0000000000000793368a62b6995769ff74c146d0a1d214eaaf6261502be688a7 height=142344 version=0x00000001 log2_work=66.309681 tx=1359484 date='2011-08-24T05:07:03Z' progress=0.003804 cache=130.2MiB(967004txo)

Un nid structuré

On peut à présent créer un fichier de configuration dans :

/home/bitcoin/.bitcoin/bitcoin.conf

Il s’agit de l’emplacement de lecture par défaut. Sinon, lors du lancement de bitcoind, spécifiez l’option :

-conf=/autre/path/vers/la/conf

Les options de configuration sont disponibles ici, je vais laisser le strict minimum, mais je vous invite à fouiller dans cette liste pour trouver des options qui vous intéresseraient.

rpcuser=darosior
rpcpassword=unpasssecure
daemon=1
server=1
# Ici vous spécifiez par exemple un autre datadir

On va à présent créer le service systemd, stocké dans :

contrib/init

Dans ce dossier vous trouverez aussi des scripts pour d’autres gestionnaires que systemd.

On va l’adapter :

exit # On repasse root pour toucher à systemd
cp /home/bitcoin/bitcoin/contrib/init/bitcoind.service /etc/systemd/system/bitcoind.service
vim /etc/systemd/system/bitcoind.service

Mon fichier est le suivant, il peut y avoir des différences si vous avez changé 2-3 trucs :

[Unit] Description=Bitcoin daemon
After=network.target [Service] ExecStart=/usr/local/bin/bitcoind -daemon -conf=/home/bitcoin/.bitcoin/bitcoin.conf -pid=/home/bitcoin/.bitcoin/bitcoind.pid
# Creates /run/bitcoind owned by bitcoin
RuntimeDirectory=bitcoind
User=bitcoin
Type=forking
PIDFile=/home/bitcoin/.bitcoin/bitcoind.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

Ensuite, plus qu’à :

systemctl daemon-reload

Et :

systemctl start bitcoind

Un nid caché

Pour différentes raisons (au hasard, rendre possible l’accès à Bitcoin par une personne dans un pays qui bloque les connexions), vous pouvez vouloir rendre votre nœud accessible par tor. Si tor n’est pas encore installé :

apt install dirmngr

Puis ajoutez les dépôts de tor dans votre sources.list :

deb https://deb.torproject.org/torproject.org stretch main
deb-src https://deb.torproject.org/torproject.org stretch main

Et importez les clefs :

gpg --recv A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89
gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -

Et enfin :

apt update
apt install tor deb.torproject.org-keyring

Ensuite ajoutez l’utilisateur bitcoin au group tor :

usermod -aG debian-tor bitcoin

Puis modifiez :

/etc/tor/torrc

En ajoutant ceci :

ControlPort 9051
CookieAuthentication 1
CookieAuthFileGroupReadable 1

Si vous souhaitez ne vous connectez que par tor, vous pouvez ajouter ceci dans bitcoin.conf :

proxy=127.0.0.1:9050
listen=1
bind=127.0.0.1
onlynet=onion

Il vous suffit maintenant de redémarrer tor puis bitcoin :

systemctl restart tor@default
systemctl restart bitcoind

Voler de ses propres ailes

Vous avez à présent un noeud Bitcoin « up and running » (ou plutôt surement « syncing » pour l’instant ?), et pour aller plus loin vous pouvez vous référer au wiki, au Github, et à toute autre source d’information. Voici toutefois quelques choses qui pourraient vous aider :

Mettre à jour son node Bitcoin

systemctl stop bitcoind
su - bitcoin
cd /home/bitcoin
rm -r bitcoin/
git clone -b x.x https://github.com/bitcoin/bitcoin && cd bitcoin
./autogen.sh
./configure --enable-cxx --without-gui # Enlevez evidemment le without-gui si vous voulez le wallet qt5
make -j 4 # Ajustez la valeur de l'option -j a votre nombre cores
su -c 'make install'
exit # Repasser root
systemctl restart bitcoind

Parler à bitcoind sans passer par l’utilisateur bitcoin

Vous pouvez aussi faire un script dans :

/usr/local/bin

s’appelant bitcoin-cli et qui exécuterait les commandes passées en paramètre en tant que l’utilisateur bitcoin afin de ne pas avoir à chaque fois à faire

su - bitcoin

juste pour parler à bitcoind.

Antoine Poinsot

Yet another Bitcoin promoter. [email protected] ~ github.com/darosior ~ crypto-lyon.fr