Setup un node Stellar

Setup un node Stellar

Bonjour à tous, je vais aujourd’hui décrire les étapes de mise en place d’un noeud sur le réseau Stellar. Etant donné que les noeuds sont au coeur du consensus, il est important qu’il y en est beaucoup pour plus de décentralisation.

Tout d’abord, contrairement à Bitcoin et tous ses enfants plus ou moins éloignés, il ne s’agit pas de juste faire un :

./bitcoind -mesoptions

Sur le réseau Stellar, les noeuds participent (ou plutôt peuvent participer) activement au consensus : il y a donc une partie nécessaire de compréhension et de paramétrage.

Si vous êtes novice, je vous conseille fortement de lire la section « get started » de la documentation avant de continuer.

I – Mise en situation

La plupart d’entre vous doivent déjà savoir ce qui va être expliqué dans cette partie, mais elle est nécessaire à la compréhension de la partie suivante. Si vous connaissez déjà bien le réseau et/ou vous êtes pressés, vous pouvez passer directement à la deuxième partie.

Sur Stellar, il n’y a pas de miner. Les transactions sont validées par certains node en respectant des règles bien précises : c’est le Stellar consensus protocol. Parler trop longtemps du SCP m’éloignerait du sujet de cet article et présenterait un risque certain de mal de tête. Je vous renvoie néanmoins vers des informations le concernant sur la doc officielle de Stellar, classées du plus gros mal de tête à la simple BD : Adventures in Galactic Consensus. Vous trouverez sur cette doc également bon nombre d’informations très utiles, détaillées et expliquées.

Il y a différents types de node : c’est pour ça que je dis que seulement certains node participent au consensus. En voici un récapitulatif, pris encore une fois de la doc :

Stellar all node types

J’ai choisi de monter un full node, vous pouvez faire comme moi ou sauter des étapes en fonction de vos besoins. Si vous êtes pressés vous avez une image docker que vous pouvez trouver ici. Pour ubuntu vous avez un paquet stellar-quickstart, vous pouvez trouver toutes les informations le concernant ici. Si vous êtes prêts à vous faire mal je vous invite à me suivre dans le paragraphe suivant 😉 .

II – Préparatifs

Pour commencer sur de bonnes bases, et être sûr que ça marchera chez vous comme chez moi j’ai tout fait sur une fresh install d’une Debian 9 :

screenshot terminal

Si vous avez la même version que moi normalement ça devrait le faire. Je vous laisse le soin de préparer et sécuriser votre environnement, ce n’est pas le sujet.

On va compiler les sources, mais tout d’abors il nous faut les dépendances, vous pouvez en trouver un récapitulatif ici ou ici. Evidemment, certaines ne sont pas sur les dépôts sinon ce serait trop simple 😉 .

Bon on commence avec celles présentes :

screenshot terminal 2

(Sur ce screen j’ai oublié git, curl et build-essential, pensez à les rajouter)

A présent on va récupérer le paquet libq5 : vous pouvez le récupérer ici, en fonction de votre architecture (uname -m).

screenshot terminal 3

On va maintenant passer à gcc-5, vous pouvez essayer avec une autre (>=5), j’en ai essayé plusieurs et j’ai pris la première qui compilait. Les paquets gcc-5 et g++-5 ne sont que sur les dépôts unstable, donc :

apt --fix-broken install # gcc-5 et g++-5 sont presents mais sans dependance
echo "deb http://ftp.fr.debian.org/debian unstable main contrib non-free" >> /etc/apt/sources.list
apt update
apt install gcc-5/unstable # Le '/unstable' pour ne prendre que le paquet dans le depot unstable et ses dependances dans le stable (pour eviter un conflit)
apt install g++-5/unstable # Idem
cat /etc/apt/sources.list |grep -v "$(tail -n 1 /etc/apt/sources.list)" > /etc/apt/sources.list
apt update

III – Compilation

Bon cette fois on devrait être bons, si vous avez un problème n’hésitez pas à poser vos questions dans les commentaires.

On va fetch la dernière version (la 9.1.0 au moment où j’écris l’article),

screenshot 4 terminal clone stellar

et la compiler.

./autogen.sh
./configure CC=gcc-5 CXX=g++-5
make # Ou make -j x
make check
su -c "make install"

A présent vous avez le temps de boire un café, ou plus originalement traduire le whitepaper du dernier shitcoin à ce jour pour gagner un bounty.

Si vous avez des erreurs de compilation à répétition, notamment « internal compiler error », et que vous avez déjà essayé de changer de compilateur et/ou de version (git checkout), pensez à enlever l’option ‘-j’ et à vérifier votre niveau de rame et de CPU disponibles.

 

IV – Configuration

On va installer postgresql et créer une db pour stellar. Donc :

apt update
apt install postgresql

screenshot postgresql

On va aussi créer un user stellar et des dossiers pour les logs et la chaîne (stockées dans des « buckets » -> cf ici)

screenshot log stellar

Puis on va enfin créer/modifier le fichier de configuration. On va partir de celui-là et le modifier. Vous pouvez partir d’un autre (tel que stellar-core_example.cfg) plus complet, ou vous inspirer d’autres disponibles ici, ou simplement faire

less stellar-core/docs/stellar-core_example.cfg

maintenant que vous l’avez en local 😉 . Pour ma part je partira de l’exemple que je vous ai indiqué donc :

stellar-core configuration example wget github

Ouvrez ensuite le fichier de configuration avec votre éditeur préféré pour la modifier. Voici ma configuration, vous pouvez vous en servir en tant qu’exemple ou modèle, mais aussi modifier ou ajouter des paramètres en fonction de vos besoins (j’ai par exemple baissé le paramètre TARGET_PEER_CONNECTIONS à 6 pour limiter l’usage de bande passante, mais si ce n’est pas un problème vous pouvez très bien le laisser à la valeur par défaut (8)).

Je vais expliquer ma configuration ligne par ligne, en commençant par ce que j’ai enlevé du fichier de départ. Vous pouvez trouver ici une explication détaillée de tous les paramètres (ou la plupart).

J’ai modifié DATABASE avec les valeurs utilisées lors de la préparation de postrgesql :

DATABASE="postgresql://dbname=stellar user=stellar"

J’ai supprimé le paramètre FAILURE_SAFETY pour les raisons décrites ici.
Puis j’ai supprimé le paramètre CATCHUP_RECENT puisqu’il indique le nombre de ledger (les blocs sur le réseau Stellar) à récupérer : on veut un full node et on indiquera plutôt

CATCHUP_COMPLETE=true

J’ai ensuite modifié NODE_NAMES. Alors là vous faites un peu votre sauce avec les validators dont vous pouvez trouver les adresses ici : https://github.com/stellar/docs/blob/master/validators.md, https://dashboard.stellar.org/. J’ai pris ceux que je préfère : c’est à dire les plus près de moi et si possible des moins grosses entreprises (mystellar, stellarpool).

EDIT : Comme par hasard je parlais ci-dessus de mystellar et stellarpool, ils m’ont causé, avec goodx, des problèmes pour avoir un quorum (« state »: »joinig scp ») car ils étaient down. Je vous conseille donc de faire bien attention aux node que vous indiquerez dans KNOWN_PEERS et le quorum set un peu plus bas, et de bien check sur le dashboard s’ils sont available. (J’ai changé ma conf sur github, cf ci-dessus, mais je laisse celle-là ici avec l’edit en guise de prévention)

NODE_NAMES=[
"GCJCSMSPIWKKPR7WEPIQG63PDF7JGGEENRC33OKVBSPUDIRL6ZZ5M7OO  tempo.eu.com",
"GDHV7FL7JP6LUEWWYUOA4C3QAFQ4LZ6OHFBWFIL6IFIS3AOBI2DHV62F  stronghold3",
"GASN57EFNZWME73BJXYZUTCD34EPX4KIIZQTQDTMBWWVH6JIZJUCBGQX  goodx",
"GAEEH4TBR7YQQWKJ2FIT57HXZZTMK2BX5LY4POJUYFSEZ7Y2ONHPPTES  ibm1",
"GAENPO2XRTTMAJXDWM3E3GAALNLG4HVMKJ4QF525TR25RI42YPEDULOW  ibm2",
"GCJWQ4C5VQKLAVHT2Y6CA7TIM3VBEH62E7LKTIQQJDBZFLMZPFY3ITTV  mystellar",
"GDC5AL22QGBBMTKNCUCP7WPZZRLAFJJCW3IATOJCURZH4Z67FDMJ6MST  stellarpool",
"GCGB2S2KGYARPVIA37HYZXVRM2YZUEXA6S33ZU5BUDC6THSB62LZSTYH  sdf_watcher1",
"GCM6QMP3DLRPTAZW2UZPCPX2LF3SXWXKPMP3GKFZBDSF3QZGV2G5QSTK  sdf_watcher2",
"GABMKJM6I25XI4K7U6XWMULOUQIQ27BCTMLS6BYYSOWKTBUXVRJSXHYQ  sdf_watcher3"]

Pour le paramètre KNOWN_PEERS pareil j’ai mis les URL des node de mon choix :

KNOWN_PEERS=[
"stellar1.tempo.eu.com",
"validator3.stellar.stronghold.co",
"de.stellar.goodx.network",
"it.stellar.ibm.com",
"uk.stellar.ibm.com",
"mystellar.tools",
"stellarpool.net",
"core-live-a.stellar.org:11625",
"core-live-b.stellar.org:11625",
"core-live-c.stellar.org:11625"]

Et enfin le QUORUM_SET : j’ai supprimé la table pour le chemin « basic » et seulement ajouté les variables définies dans NODE_NAMES dans la liste des VALIDATORS, laissant tous les autres paramètres par défaut.

[QUORUM_SET] VALIDATORS=[
"$stronghold3", "$goodx", "$tempo.eu.com", "$ibm1", "$ibm2", "$mystellar", "$stellarpool"
]

Voici à présent les paramètres que j’ai rajouté :

LOG_FILE_PATH="/var/log/stellar/stellar-core.log"
BUCKET_DIR_PATH="/var/stellar/buckets"

Logique, ceux que l’on vient de créer.

CATCHUP_COMPLETE=true
NODE_IS_VALIDATOR=true

On récupère (CATCHUP) toute la chaîne et on participe au consensus (à la validation des transactions). J’ai aussi set

TARGET_PEER_CONNECTIONS=6

pour me connecter à moins de pair et ainsi utiliser moins de bande passante.

Afin de vous identifier (comme les node dont on a stocké leur id dans des variables avec NODE_NAMES) vous faites un petit

stellar-core --genseed

et vous copiez le contenu de la secret seed (== la clef privée == le pass commençant avec un « S ») dans un paramètre en haut du fichier de configuration, comme suit :

NODE_SEED="S********************************************* self"

V – Lancement de stellar-core

On crée une nouvelle db pour stellar comme ça :
screenshot stellar-core --new-db
On pourrait lancer le node en lançant seulement la commande « stellar-core« , mais on préfèrera créer un service. Cette partie est honteusement copiée de ce post.

On crée un fichier /etc/systemd/system/stellar-core.service :

[Unit] Description=Stellar Core
After=postgresql.service [Service] StandardOutput=null
ExecStart=/usr/local/bin/stellar-core –conf /etc/stellar/confperso.cfg
User=stellar
Group=stellar
WorkingDirectory=/home/stellar
Restart=on-failure [Install] WantedBy=default.target

Et on peut maintenant lancer et activer stellar-core de cette façon :

systemctl start stellar-core
systemctl enable stellar-core

Et pour voir où en est le node :

su -c "stellar-core --conf /etc/stellar/confperso.cfg --c 'info'" stellar

Le champ « state » passera par « joining scp », le temps qu’il observe un quorum, puis « catching up » le temps qu’il récupère l’histoire, et s’il arrive enfin à « synced! », félicitations votre node est opérationnel.

VI – Annexes

  • Pensez à ouvrir le port 1625 pour communiquer avec les autres node mais à bien fermer le 1626 sans quoi on pourrait envoyer des commandes à stellar-core tout simplement par HTTP sans authentification.
  • Une fois que tout est prêt vous pouvez submit une PR ici pour que d’autre validator ajoute le votre, car il est inutile de valider si personne ne vous « écoute ».
  • J’ai fait un script (EDIT: le script est encore en cours de rédaction) qui rassemble tout, vous pouvez l’éxécuter ou juste le comparer avec vos commandes si vous avez un problème.

Sources

https://github.com/stellar/stellar-core/blob/master/

  • https://www.stellar.org/developers/stellar-core/software/admin.html
  • https://galactictalk.org/d/20-setting-up-stellar-core-on-centos-7

Related posts

Leave a Reply