Comment installer et configurer une blockchain et sa sidechain?

Laurent OLIVIER
ON-X Blockchain (Chain-Accelerator)
8 min readNov 25, 2020

--

· Introduction

· Nœud Horizen avec un script en bash pour une installation rapide et automatique

· Installation de la sidechain Zendoo avec un script en bash

· Transfert de la mainchain vers la mainchain et transfert au sein de la sidechain

· Conclusion

Introduction

Horizen, anciennement ZenCash, est une blockchain développée par Zen Blockchain Foundation. Celle-ci est un fork de Z-Classic qui a utilisé très tôt la cryptographie Zero-Knowledge Proof, la preuve à divulgation nulle de connaissance. Horizen blockchain est principalement basée sur la confidentialité, ils ont plusieurs projets en cours de développement, dont la sidechain Zendoo. Une sidechain est une seconde couche implémentée par-dessus la blockchain principale (mainchain), pour répondre à un besoin grandissant dans le domaine de la blockchain : la scalabilité.

Zendoo est un protocole de transfert inter-chaînes (2WP — 2 Way-Peg), qui permet d’envoyer des ZEN bilatéralement, entre la mainchain et la sidechain et inversement mais aussi d’effectuer des échanges entre les sidechains. Pour vérifier qu’une transaction est valide les noeuds des sidechains incluent dans le header block le hash du block précédent ainsi que l’arbre de Merkle. Grâce à l’intégration de la preuve à divulgation nulle de connaissance (Zk-SNARKs), les sidechains peuvent regarder ce qu’il se passe dans la mainchain, mais la mainchain ne peut regarder les opérations des sidechains. Chaque sidechain possède son propre SNARK, qui est utilisé pour les certificats de retrait. Il est possible de configurer chaque sidechains indépendamment en fonction des besoins de vos projets.

Pour vous renseigner davantage sur les différents protocoles de transferts je vous recommande le site de l’ Academie Horizen

Dans cet article nous allons vous montrer comment installer un nœud Horizen, ainsi que la sidechain Zendoo. Pour simplifier les différentes installations nous avons créé deux scripts en bash afin que vous puissiez procéder de manière automatique et rapide aux installations. Le premier permet d’installer et configurer un nœud Horizen et le deuxième permet d’y implémenter Zendoo.

Installation du nœud Horizen

Pour cela vous devez premièrement posséder un serveur VPS, une machine virtuelle ou un Raspberry Pi.

Dans notre cas nous avons installé le nœud sous Linux (Debian10). Puis rendez-vous sur le GitHub de ON-X blockchain afin de télécharger le script nommé eazen.sh. Celui-ci s’installe à partir du root, au lancement du script il vous faudra préciser dans quel utilisateur vous désirez installer le nœud.

Une fois Debian10 installer, rendez vous sur votre terminal. Il y a deux manières de lancer le script, la première est de créer un fichier à l’aide de la commande vi :

# vi eaZen.sh

puis de copier le script dedans. La deuxième manière de procéder est de lancer la commande :

# cd /home/<USER>/
# git clone https://github.com/chainaccelerator/eazen.git

Puis copier le script dans votre user. Tout cela dans le #ROOT.

# cd /home/<USER>/eazen/
# cp eaZen.sh /home/<USER>
# cd ..

La dernière étape consiste à donner les droits à ce script ce qui va permettre de l’exécuter, en tapant :

# chmod +x eaZen.sh
# exit

Exécutons à présent le script :

$ ./eaZen.sh 

L’installation du nœud peut prendre plusieurs dizaines de minutes en fonction de votre machine. À la fin de celui-ci, revenez à votre utilisateur en tapant exit. Vous n’aurez plus qu’à taper : zend.

Et voilà ! vous avez votre nœud Horizen! Vous pouvez configurer votre nœud en modifiant le fichier .conf :

~/.zen/zen.conf

If you wish to continue working on your terminal, insert:

daemon=1
showmetrics=0

dans ce même fichier. Puis retapez zend.

Création de la sidechain Zendoo

Nous allons la créer à l’aide du SDK disponible sur le github d’Horizen, qui permet de développer des applications blockchain totalement décentralisées. Pour cette installation nous avons également créé un script qui permet de l’installer de manière automatique et rapide. Dans ce script, nous allons déclarer la sidechain sur notre propre mainchain créée à l’aide du script précédent, actuellement il n’est pas possible de peg la sidechain à la mainchain en mainnet. Pour configurer la sidechain il faut peupler quelques blocs. Avant cela, il nous faut créer des clés cryptographiques dont des signatures Schnorr (un protocole d’authentification cryptographique, preuve du Zero Knowledge Proof) , de vérifications qui vont nous permettre de réaliser 4 types d’actions :

  • Forward Transfer (FT) — Trasfert vers l’avant
  • Withdrawal Certificate (WCert) — Certificat de retrait
  • Backward Transfer Request (BTR) — Transfert vers l’arrière
  • Ceased sidechain withdrawal (CSW) — Retrait de la sidechain interrompue, lorsqu’une sidechain ne soumet pas de certificat de retrait dans le délai imparti, elle devient inactive et aucun autre certificat de retrait ne sera accepté.
# cd /home/<USER>/eazen
# cp sceaZen.sh /home/<USER>
# cd ..

Préalablement, ajouter l’utilisateur au sudoers en root, nous conseillons de l’ajouter via la commande

# sudo visudo

à la toute fin du fichier rentrez:

<USER> ALL=(ALL:ALL) NOPASSWD:ALL

afin que le script ne soit pas interrompu par une demande de mot de passe.

Changer également la permission du script en rentrant:

# chmod +x ./sceaZen.sh
# exit

Puis lancer le script en $USER en renseignant votre user avec le paramètre -u

$ ./sceaZen.sh 

Dans ce script on y installe Java 8, Maven et Scala, puis le SDK de Zendoo. Ce script contient un générateur de chaîne de nombre aléatoire (open ssl), aucun risque qu’un autre utilisateur ait le même. Le bootstrap contenu dans le SDK va permettre de générer les différentes clés et signatures. Nous connectons cette sidechain à notre mainchain créée précédemment, pour activer les sidechains il faut impérativement créer 220 blocs, on y retrouve également plusieurs paramètres comme le nombre de tokens à envoyer à une adresse créée par le script, dans celui-ci on a choisi 100 ZEN et la fréquence en bloc entre deux transferts entre la sidechain et la mainchain. Il est possible de consulter les informations d’un transfert à l’aide de la commande gettransaction et de vérifier les ID de celui-ci. Dans ce script on mine également le transfert avec toujours la possibilité de vérifier l’ID du bloc avec la commande getblock.

Vous pouvez bien entendu changer les valeurs de tous ces paramètres et jouer avec le script!

Quelques commandes utiles:

#le nombre de blocs générer
zen-cli getblockcount
#générer un nombre de blocs
zen-cli generate <NOMBRE>
#permet de déclarer la sidechain
zen-cli sc_create
#obtenir les détails de la transaction ainsi que le nombre de confirmations
zen-cli gettransaction
#miner le bloc en question
zen-cli generate
#obtenir les informations d’un bloc
zen-cli getblock
#obtenir les informations d’une sidechain
zen-cli getscinfo
#obtenir les informations de la sidechain genesis
zen-cli getscgenesisinfo
#obtenir la balance de la mainchain
zen-cli getbalance

Vous pouvez vérifier si la sidechain (port 9084) et l’API (port 9085) sont bien connectés en rentrant la commande

netstat -plnt

Transferts entre la mainchain et la sidechain

Premièrement, vous pouvez retrouver toute la documentation de l’API sur http://127.0.0.1:9085/swagger

Nous avons également fait un petit script en python pour cela, transferZen.py.

# cd /home/<USER>/eazen/
# cp transferZen.py /home/<USER>/
# cd ..
# chmod +x transferZen.py
# exit
$ python3 transferZen.py

Voilà comment procéder de manière “manuel”:

Commençons par vérifier la balance de la mainchain et de la sidechain.

#obtenir la balance de la mainchain
$ zen-cli getbalance

Pour voir la balance de la sidechain:

$ curl -X POST "http://127.0.0.1:9085/wallet/balance" -H "accept: application/json" -H "Content-Type: application/json"

Pour envoyer des coins de la mainchain à la sidechain, vous aurez besoin de la la publicKey, la première adresse du wallet sur la sidechain, ainsi que de la SidechainID. Ces 2 informations sont présentes dans le fichier /SidechainSDK/keys.txt généré lors du script précédent ou alors avec la commande:

$ source .bashrc
$ echo $GKPUBLIC
$ echo $SCID

Ici, on envoie 100ZEN à la sidechain.

$ zen-cli sc_send "<GenerateKey PublicKey>" 100 "<SideChainID>"

Vous obtiendrez en retour l’ID de la transaction, que vous pouvez vérifier avec

#obtenir les détails de la transaction ainsi que le nombre de confirmations
$ zen-cli gettransaction

Il faut maintenant miner le bloc qui contient la transaction, des fees seront appliquées à la transaction. Sachant que vous minez le bloc vous obtiendrez les fees en retour, celles-ci s’annulent donc.

#miner le bloc
$ zen-cli generate 1

Si vous vérifiez la balance de la sidechain vous verrez qu’elle n’a pas encore bougé. Pour que la transaction soit prise en compte il faut générer un bloc supplémentaire. Pour cela nous aurons besoin de l’époque dans lequel nous sommes et du nombre de slots. Il y a dans une époque 720 blocs. Pour obtenir ces informations nous allons utiliser l’appel:

$ curl -X POST "http://127.0.0.1:9085/block/forgingInfo" -H "accept: application/json" -H "Content-Type: application/json"
{
"result" : {
"consensusSecondsInSlot" : 120,
"consensusSlotsInEpoch" : 720,
"bestEpochNumber" : 1,
"bestSlotNumber" : 720
}

Si, par exemple, vous êtes à l’époque 1 bloc “720. Il faut passer à la deuxième époque bloc #1. Si vous êtes à l’époque 2 bloc #10, il faut passer au bloc suivant soit 11ème bloc.

Générons à présent ce nouveau bloc:

$ curl -X POST "http://127.0.0.1:9085/block/generate" -H "accept: application/json"  -H "Content-Type: application/json" -d "{\"epochNumber\":2,\"slotNumber\":1}"$ curl -X POST "http://127.0.0.1:9085/block/generate" -H "accept: application/json"  -H "Content-Type: application/json" -d "{\"epochNumber\":2,\"slotNumber\":11}"

Vous obtiendez en retour un <blockID>. Pour voir ce qui est inscrit dans ce bloc vous avez l’appel:

$ curl -X POST "http://127.0.0.1:9085/block/findById" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"blockId\":\"<blockID>\"}"

Et voilà, vous avez effectuez une transaction entre la mainchain et la sidechain. Vous pouvez vérifier la balance de la sidechain. Celle-ci a été crédité de 100ZEN.

Transferts au sein de la sidechain

Effectuons maintenant un transfert au sein de la sidechain.

Créons premièrement une nouvelle adresse dans la sidechain.

$ curl -X POST "http://127.0.0.1:9085/wallet/createPrivateKey25519" -H "accept: application/json"

Envoyons 50 ZEN sur cette nouvelle adresse sans fee. Sur la sidechain c’est exprimé en zennies c’est-à-dire 1 ZEN = 100 millions de zennies.

$ curl -X POST "http://127.0.0.1:9085/transaction/sendCoinsToAddress" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"outputs\":[{\"publicKey\":\"<nouvelle adresse>\",\"value\":5000 000000}],\"fee\":0}"

Vérifions les transactions en attente. Si true alors on obtient le contenu d’une transaction. Si false on obtient les ID des transactions en attente.

$ curl -X POST "http://127.0.0.1:9085/transaction/allTransactions" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"format\":true}"

On peut générer ce bloc comme précédemment /block/generate/, rappelons qu’il faut regarder les forging info /block/forgingInfo/, puis vérifions qu’il n’y a plus de transactions en attente avec l’appel /transactions/allTransactions/. Pour finir regardons toutes les “Boxes” pour obtenir toutes les informations disponibles dans les wallets de la sidechain.

$ curl -X POST "http://127.0.0.1:9085/wallet/allBoxes" -H "accept: application/json" -H "Content-Type: application/json"

Vous y trouverez la balance de tous les wallets présent dans la sidechain.

Conclusion

Voilà !

Dans cet article et à l’aide de ces scripts vous avez installé un nœud Horizen, configuré et déclaré une sidechain sur votre mainchain Horizen, ainsi qu’effectuer un transfert entre la mainchain et la sidechain, puis un transfert au sein de la sidechain.

Le wallet user et developpeur friendly Sphere by Horizen et en particulier la version 2.0 beta va permettre d’effectué ce genre de transferts beaucoup plus facilement. Avec toujours la possibilité d’utiliser la messagerie crypté zenChat. Les messages ZenChat sont stockés en permanence dans la blockchain pour éviter les fuites de métadonnées et sont cryptés avec des algorithmes tels que AES-256 avec Perfect Forward Secrecy (PFS).

Je tiens à remercier Xavier Garreau, vous trouverez le fonctionnement des scripts plus en détail sur son site internet.

Nous sommes aussi les organiseurs de la Paris Blockchain Week Summit. Celle-ci se déroulera le 9 et 10 décembre 2020. N’hésitez pas à vous renseigner sur l’évènement! Rob Viglione, le co-fondateur de Horizen sera présent!

Retrouvez ON-X blockchain sur https://www.on-x.com/services/blockchain

--

--