Les Sidechains Horizen : le noeud zend_oo

Une introduction pratique aux sidechains Horizen.

Les sidechains sont LA nouvelle fonctionnalité de l’écosystème Horizen.

Les sidechains sont indépendantes mais intéragissent avec la mainchain Horizen. Elles permettent à tout un chacun de créer une blockchain à partir d’un modèle, en ne modifiant que ce qui est nécessaire à l’application originale.

Créer une sidechain à partir de la mainchain, c’est un peu comme l’héritage de classe en programmation orientée objet. Tu vas dériver une sidechain à partir d’un modèle fonctionnel, mais tu peux y apporter les modifications qui te sont nécessaires.

La première étape consiste à disposer d’une version de noeud Horizen disposant de la prise en charge des sidechains.

Le plan du dossier : Les Sidechains Horizen

  1. Zend_oo, le node de la MainChain Horizen : Tu es ici 🙂
  2. Création de ma première sidechain
  3. Transferts entre chaînes
  4. Bonus : Gagner des ZEN : Le Faucet en détail
  5. Bonus : Monter un secure node ZEN en 20 minutes

Zend_oo

Zend_oo est la version beta du prochain processus Zend. Cette version introduit les sidechains et la capacité de la mainchain de les gérer et de communiquer avec elles.

L’objetif de ce premier tutoriel consiste à installer Zend_oo sur un VPS.

Mise en place d’un noeud zend_oo

On va commencer par créer un noeud zend_oo, pour avoir un noeud de la future génération à disposition.

J’ai utilisé à cette fin un VPS Digital Ocean, mais n’importe quel VPS ferait l’affaire. J’ai choisi le plus petit ($5/mois) en Debian 10. Les temps de compilation sont plus longs que sur un monstre, mais ça réduit les coûts du test.

Une fois connecté au VPS, je crée un utilisateur zendoo que j’ajoute au groupe sudo et je lui affecte un mot de passe :

# groupadd zendoo
# useradd -g zendoo -m -s /bin/bash zendoo
# adduser zendoo sudo
# passwd zendoo

J’ajoute également un peu de swap à ce vps, sinon, la compilation n’arrivera pas au bout par manque de mémoire (et c’est loooong de tout recommencer) :

# fallocate -l 4G /swapfile
# chmod 600 /swapfile
# mkswap /swapfile
# swapon /swapfile
# echo '/swapfile none swap sw 0 0' >>/etc/fstab

C’est prêt ! Je bascule sur l’user zendoo pour la suite et je me place dans son répertoire :

$ su zendoo
$ cd 

Je fais les mises à jour du système et télécharge les prérequis :

$ sudo apt-get update
$ sudo apt-get -y upgrade
$ sudo apt-get -y install build-essential pkg-config libc6-dev m4 g++-multilib autoconf libtool ncurses-dev unzip git python zlib1g-dev bsdmainutils automake curl wget

Je clone le dépôt des sources et compile zend_oo :

$ git clone https://github.com/ZencashOfficial/zend_oo.git
$ cd zend_oo
$ ./zcutil/build.sh -j$(nproc)

Je télécharge les fichiers nécessaires. Je n’ai pas approfondi ce que faisait cette étape pour être honnête :

$ ./zcutil/fetch-params.sh

En lançant zend une première fois, il va créer le fichier de configuration :

$ ./src/zend

Je l’édite pour spécifier que je souhaite utiliser le testnet et je relance :

$ sed -i -e "s/#testnet=0/testnet=1/" ~/.zen/zen.conf
$ ./src/zend

Voilà, je dispose de mon propre node zend_oo ! Je peux le quitter avec la combinaison de touches Ctrl+C, comme indiqué.

Libérer de l’espace disque

Le répertoire des sources et les binaires intermédiaires prennent énormément de place sur le disque. Si comme moi, tu utilises un petit vps pour les tests, je te recommande de supprimer tout cela.

Je crée un répertoire zen dans le répertoire personnel de l’utilisateur, j’y déplace les binaires et je supprime le répertoire zend_oo :

$ mkdir zen
$ mv zend_oo/src/zen-* ./zen/
$ mv zend_oo/src/zend ./zen/
$ rm zend_oo/ -rf

Ajout au PATH

Pour une utilisation plus facile des binaires ZEN, j’ajoute le nouveau répertoire au PATH en ajoutant le contenu suivant au fichier ~/.bashrc :

# ZEN binaries Path
export PATH=~/zen:$PATH

Mode non interactif

Le principe du node, c’est aussi de ne pas avoir à rester connecté à le regarder tourner. On peut donc le lancer en mode non interactif, en daemon (ou démon par abus de langage).

Cela se fait en lançant zend -daemon au lieu de zend tout court ou, de façon plus pérenne, en ajoutant une ligne au fichier de configuration (~/.zen/zen.conf) :

daemon=1

En procédant ainsi, il n’est plus possible d’arrêter zend par un Ctrl+C. Il faut utiliser zen-cli pour le stopper (zen-cli stop). Et/ou, récupérer le PID de zend dans la liste des processus et lui envoyer un kill :

$ zend
Zen server starting
$ zen-cli stop
Zen server stopping

ou :

$ ps x
  PID TTY      STAT   TIME COMMAND
 1492 ?        SLsl   4:29 zend
15373 pts/0    S      0:00 bash
15376 pts/0    R+     0:00 ps x
$ kill 1492

Bootstrap

Pour accélérer la synchronisation du node, on va utiliser un bootstrap. Précision utile toutefois : pour l’instant la synchronisation au testnet n’est pas nécessaire pour les sidechains. On utilisera pour l’instant Zend_oo en mode tests de régression (argument -regtest ou regtest=1 dans le fichier de configuration)… Je laisse toutefois la méthode ici, elle servira plus tard.

Pour ma part, j’ai stoppé zend et supprimé tout le contenu du répertoire ~/.zen/testnet3 . Les bootstraps sont à récupérer ici : https://bootstraps.ultimatenodes.io/ et plus précisément dans le cas qui m’intéresse : https://bootstraps.ultimatenodes.io/sc/. On récupère le lien vers le bootstrap du jour. On le décompresse et on supprime l’archive. Par exemple :

$ cd ~/.zen/testnet3
$ wget https://bootstraps.ultimatenodes.io/horizen/masternode-sc/horizen_masternode_sidechains_blockchain_2020-07-07_06-00-01_UTC.tar.gz
$ tar xvzf horizen_masternode_sidechains_blockchain_2020-07-07_06-00-01_UTC.tar.gz
$ rm horizen_masternode_sidechains_blockchain_2020-07-07_06-00-01_UTC.tar.gz

Comme recommandé, on ajoute txindex=1 au fichier de configuration.

On peut alors lancer zend.

Tests

Si la ligne daemon=1 a été ajoutée au fichier de configuration, le node se lance tout bêtement en tapant zend.

On peut surveiller ce que fait le daemon dans les fichiers debug.log du sous répertoire zen/testnet et interagir avec lui grâce au client zen-cli ou via des appels RPC. Par exemple :

$ zen-cli getinfo
$ zen-cli getblockchaininfo
...

Au lancement, le node peut ne pas répondre correctement :

error code: -28
error message:
Loading block index...

Il faut attendre que cette première étape soit terminée avant d’avoir un node réactif. Une fois terminé, zen-cli getinfo retourne des infos de ce type :

{
  "version": 2010002,
  "protocolversion": 170003,
  "walletversion": 60000,
  "balance": 0.00000000,
  "blocks": 669612,
  "timeoffset": 0,
  "connections": 2,
  "proxy": "",
  "difficulty": 14.49267470145953,
  "testnet": true,
  "keypoololdest": 1594157359,
  "keypoolsize": 101,
  "paytxfee": 0.00000000,
  "relayfee": 0.00000100,
  "errors": ""
}

Le plan du dossier : Les Sidechains Horizen

  1. Zend_oo, le node de la MainChain Horizen : Tu es ici 🙂
  2. Création de ma première sidechain
  3. Transferts entre chaînes
  4. Bonus : Gagner des ZEN : Le Faucet en détail
  5. Bonus : Monter un secure node ZEN en 20 minutes

Liens

Le README en anglais sur GiHub : https://github.com/ZencashOfficial/zend_oo/blob/sidechains_testnet/README.md

Présentation des sidechains dans l’Academy Horizen Academy (VF) : https://academy.horizen.global/fr/horizen/expert/sidechains/