Forger node & Staking sur Horizen EON

On va voir ensemble comment monter un forger node, un validateur sur l’EVM d’Horizen : EON et comment fonctionne le staking Horizen EON !

Prérequis matériels

On commence par vérifier les prérequis sur la page de la documentation :
–> https://docs.horizen.io/horizen_eon/staking/forger_node

Au niveau stockage, on devra avoir un full node pour la mainchain Horizen et un full node pour la sidechain EON. Lors de l’écriture de ce tutoriel, il fallait déjà plus de 100Go, donc prévoir large !

Il manque également un prérequis très important au niveau du CPU. Ce dernier doit prendre en charge adx et bmi2. On les retrouve dans la ligne flags de la sortie de la commande cat /proc/cpuinfo sous linux.

Reste à trouver un serveur qui correspond à tous ces prérequis. A titre indicatif, j’ai monté mon node sur un serveur de la gamme éco chez OVH : le SYS-5-SSD-32.

Installation du serveur

Ce tutoriel s’appuie sur une base Ubuntu 22.04

Prérequis logiciels

Une fois connecté en tant qu’utilisateur ubuntu, on installe les prérequis logiciels :

sudo apt install jq docker docker-compose-v2 pwgen

S’autoriser Docker

La manière la plus simple d’installer les nodes consiste à utiliser docker. On ajoute donc l’utilisateur ubuntu au groupe docker :

sudo adduser ubuntu docker

Il faudra se déconnecter puis se reconnecter à l’utilisateur ubuntu pour que la modification soit prise en compte.

Clonage du projet & configuration

On clone le projet compose-evm-simplified du github Horizen en local :
https://github.com/HorizenOfficial/compose-evm-simplified/

git clone https://github.com/HorizenOfficial/compose-evm-simplified.git

Cela crée un répertoire compose-evm-simplified qui va nous permettre de lancer nos nodes.

On se déplace dans le répertoire compose-evm-simplified.

cd compose-evm-simplified

Et on initialise le projet pour un forger node sur EON :

./scripts/init.sh

Si vous obtenez l’erreur ci-dessous :

=== Checking all the requirements ===

verify_required_commands Error: 'docker compose' v2 is required to run this script, see installation instructions at 'https://docs.docker.com/compose/install/'.

Assurez vous que vous avez bien installé docker compose v2 :

$ docker compose version
Docker Compose version 2.20.2+ds1-0ubuntu1~22.04.1

Si c’est bien le cas, alors vous pouvez supprimer ou commenter la ligne 17 du script scripts/utils.sh :

(docker compose version 2>&1 | grep -q v2) || fn_die "${FUNCNAME[0]} Error: 'docker compose' v2 is required to run this script, see installation instructions at 'https://docs.docker.com/compose/install/'."

Et vous pourrez alors relancer le scipt.

$ ./scripts/init.sh

=== Checking all the requirements ===

What kind of node type would you like to run:
1) rpc
2) forger
#? 2

You have selected: forger

What network would you like to setup 'eon' (mainnet) or 'gobi' (testnet):
1) eon
2) gobi
#? 1

En réponse aux questions du script, choisir forger puis eon.

Si c’est une première installation, répondez no à « Do you want to import an already existing seed phrase for your wallet »

Le script génère alors une clé, à conserver en lieu sûr ! Donc, on l’enregistre et on valide en répondant yes à la question « Do you confirm you safely stored your Wallet Seed Phrase ? (‘yes’) »

Répondez également no aux questions suivantes :

  • Do you want to change the user (please answer ‘no’ if you don’t know what you are doing) ? (‘yes’ or ‘no’)
  • Do you want to change the datadir (please answer ‘no’ if you don’t know what you are doing) ? (‘yes’ or ‘no’)

Le script se termine alors en indiquant les étapes suivantes :

Zend

On commence par lancer zend, le node de la mainchain.

docker compose -f /home/ubuntu/compose-evm-simplified/deployments/forger/eon/docker-compose.yml up -d zend

Et on doit ensuite attendre qu’il soit totalement synchronisé. C’est à dire que la blockheight locale soit synchronisée avec la blockheight de la mainchain.

On retrouve la valeur locale avec la commande suivante :

$ docker exec zend gosu user zen-cli getblockcount
12640

La valeur de la mainchain est indiquée sur l’explorer : https://explorer.horizen.io/

Voilà, on a quelques heures devant nous !

Une fois que les 2 valeurs sont identiques, on peut lancer le node EON, le bien nommé evmapp.

EVMApp

La commande pour lancer le node EON est la suivante :

docker compose -f /home/ubuntu/compose-evm-simplified/deployments/forger/eon/docker-compose.yml up -d

On doit attendre un petit moment après le retour de la commande que les clés soient générées avant que le node se mette vraiment à synchroniser.

On peut vérifier où il en est grâce à la commande suivante :

docker logs --tail 20 evmapp

Une fois que c’est le cas, on utilise la commande suivante pour connaître l’avancement de la synchronisation :

$ docker exec evmapp gosu user bash -c 'curl -sXPOST "http://127.0.0.1:9545/block/best" -H "accept: application/json" | jq '.result.height''
14607

Et maintenant, c’est la sidechain EON que l’on doit synchroniser. Le dernier bloc étant disponible sur l’explorer EON : https://eon-explorer.horizenlabs.io/

Voilà, tu as (à nouveau) quelques heures devant toi …

Génération des clés pour le staking

Une fois le node synchronisé avec EON, on peut générer les clés qui seront nécessaires pour le staking et pour accéder aux récompenses :

./scripts/forger/generate_keys.sh

Le script demande pour quelle chain on souhaite générer des clés puis affiche des informations à conserver précieusement !!

$ ./scripts/forger/generate_keys.sh

=== Checking all the requirements ===

What network would you like to generate the keys on 'eon' (mainnet) or 'gobi' (testnet):
1) eon
2) gobi
#? 1

You have selected: eon
Checking if the node is reachable...

Generated VRF Key Pair.
VRF Public Key         : 077a630643a7962c4cac0e6eb9ec5b1e6c105b182ec1d45ca942a75150d8e70d00
VRF Private Key        : 03b3a5a6091266dead46f45a30d821646959ca286c0c3b2700f55e0c7577bffa16077a630643a7962c4cac0e6eb9ec5b1e6c105b182ec1d45ca942a75150d8e70d00

Generated Block Sign Key Pair.
Block Sign Public Key  : 1299365076853fc2ea837f03cd58e78f6ca2603f2b32b88551f7dee105a9ce54
Block Sign Private Key : 00e8f760c0cf4c21b9fda240112833abe2d6f09071a9025a88547e457a14c606aa1299365076853fc2ea837f03cd58e78f6ca2603f2b32b88551f7dee105a9ce54

Generated Ethereum Address Key Pair.
Ethereum Address                    : 0x504205be49b1920af14f5cd505e6ec1b889ac06c
Ethereum Private Key                : 05a665b8558711816ce79f8ee8eac7487292b24ce3b493a2ed631e3b79c293c1d5
Ethereum Private Key for MetaMask   : 0xa665b8558711816ce79f8ee8eac7487292b24ce3b493a2ed631e3b79c293c1d5

=== STORE ALL THESE VALUES IN A SAFE PLACE ===```

Pour le staking, on aura besoin des 2 clés VRF Public Key et Block Sign Public Key.

Ethereum Address indique l’adresse sur laquelle seront versés les revenus du forger node.
Pour gérer ce wallet, on doit en importer la clé privée donnée plus bas. Si on choisit de gérer les revenus du node via metamask, dans cet exemple on importera la clé 0xa665b8558711816ce79f8ee8eac7487292b24ce3b493a2ed631e3b79c293c1d5 pour avoir accès à l’adresse 0x504205be49b1920af14f5cd505e6ec1b889ac06c.

Le node est à présent opérationnel et prêt à recevoir ses stakes.

Le staking

Horizen fournit des outils facilitant le staking en 2 versions. Une version remix destinée à être uploadée et utilisée dans l’éditeur web Remix et une version js destinée à être utilisée avec NodeJS en local.
Pour creer des scripts et automatisations, on utilisera plutôt la version js, mais pour faire stake de temps en temps, la version remix est parfaite.

Le code est disponible ici : https://github.com/HorizenOfficial/eon-smart-contract-tools/

On télécharge un ZIP, on le décompresse et on uploade le contenu du dossier remix dans un wordkspace vierge sur Remix

Dans l’onglet Deploy and run transactions, on doit sélectionner « Injected Provider – Metamask » pour envoyer les transactions avec Metamask.

Note sur les frais
Le calcul des frais est erroné. Il est possible de forcer la valeur ou accepter celle proposée, les frais effectifs sont de toutes façons actuellement toujours inférieurs à 0.01 $ZEN comme on peut le voir sur la page du smart contract de staking sur l’explorer : https://eon-explorer.horizenlabs.io/address/0x0000000000000000000022222222222222222222

Fonctionnement des scripts Remix

Le plus simple des scripts pour vérifier que tout va bien est stakeOf.js qui retourne le nombre de $ZEN stakés pour l’adresse appelante. Il ne nécessite aucune modification. Clic droit sur le nom du fichier et Run :

Allez, on stake maintenant !

On y va ! On va utiliser le script delegate.js. Avant de l’exécuter, on doit modifier 3 lignes dans le script :

Ici, on mets le montant en $ZEN à staker :

const AMOUNT = "42";

Pour les 2 valeurs, on récupère les infos fournies par le script generate_keys.sh de tout à l’heure. Elles sont différentes pour tous les nodes. Utilisez les votres, bien sûr …

const YOUR_BLOCK_SIGN_PUBKEY = "1299365076853fc2ea837f03cd58e78f6ca2603f2b32b88551f7dee105a9ce54";
const YOUR_VRF_PUBKEY = "077a630643a7962c4cac0e6eb9ec5b1e6c105b182ec1d45ca942a75150d8e70d00";

Une fois les 3 valeurs modifiées, on enregistre le script et Run

On obtient en réponse des infos dans un json dont une, notamment, est très importante, c’est le stakeId. Qui sera nécessaire (dans cette version du staking) pour unstake. Notez là donc avec soin.

A noter : Ce stakeId peut être retrouvé grâce au script getPagedForgersStakesByUser.js qui liste l’intégralité des stakes d’une adresse :

Unstaking

A noter que dans la version actuellement en production du staking au moment de la rédaction de ce tuto, on devait activer eth_sign dans Metamask pour pouvoir utiliser les fonctions de unstaking. Pour l’activer, dans les Paramètres, suivre Paramètres avancés et activer Requêtes Eth_sign le temps de faire les opérations de unstaking.


Pour unstaker, on utilise le script withdraw.js en modifiant la variable STAKE_ID :

const STAKE_ID = "0x28bff643e1d1141ac24c0835837b584f9975617fbbb3714e86fbcab5a578ce5f";

Une signature et une transaction plus tard, c’est de retour dans le wallet.

Conclusion

Voila ce tutoriel de découverte des Forger nodes et du staking sur Horizen EON est maintenant terminé. Si tu as eu un souci à le suivre, tu peux me contacter sur twitter (euh X, pardon) et sur le Discord Horizen !

Liens