[testnet] Comment déployer un nœud Dusk ?

Dusk Logo

Site web : dusk.network

Ce guide est une traduction libre et légèrement modifiée de la documentation officielle pour le déploiement d’un nœud Dusk, plus communément appelé node provisioner.

Configuration Requise

  • système d’exploitation : Debian GNU/Linux

  • architecture : x86-64

  • espace disque : 50 Gio NVMe

  • mémoire : 4 Gio de RAM


Avant-propos

Les futures commandes à taper dans une console sont précédées par une légende pour indiquer sur quel environnement elles doivent être exécutées.

Exemple avec une commande qui devra être tapée dans la console de l’ordinateur (PC) :

🖥️ Ordinateur (PC)
echo 'Coucou depuis le PC !'

Et une commande qui devra être tapée dans la console du serveur (VPS, pour Virtual Private Server) sur lequel le nœud sera déployé :

☁️ Serveur (VPS)
echo 'Coucou depuis le serveur !'

Astuce

Chaque commande peut être copiée/collée directement depuis cet article vers la console (il y a une icône qui apparait en haut à droite de chaque bloc de code quand la souris passe dessus). Quand il y a une partie de la commande a modifier manuellement :

  • je le préciserai en amont ;

  • la légende du bloc de code contiendra l’émoji ✍️ ;

  • la/les ligne en question sera surlignée.

Astuce

Afin de vérifier qu’une commande se soit terminée avec succès, la dernière ligne affichée dans la console, après l’avoir exécutée, devra être « OK ». Si ce n’est pas le cas, il y a eu une erreur.


Créer un Compte

Rendez-vous sur le wallet Dusk pour créer un compte.

Prudence

Bien garder les 12 mots de la seed phrase quelque part en sécurité.


Hébergement

Créé un compte sur Contabo, et utiliser ce lien vers le serveur à louer avec la bonne configuration présélectionnée. À l’heure où j’écris ces lignes, la première facture est de 21,12 €, puis 15,06 €/mois.

Vérifier la configuration sélectionnée :

  • CPU : 6 vCPU Cores

  • RAM : 16 GB RAM

  • Region : United Kingdom

  • Storage Type : 200 GB NVMe

  • Image: Debian 12

Attention

Ne pas choisir la région European Union (Germany) car il y a des soucis avec leur DNS et la synchonisation du nœud sera problématique voire impossible.

Configuration SSH

Lorsque le serveur sera opérationnel et que son adresse IP sera connue, configurons l’accès SSH sur le PC (remplacer ADRESSE_IP par l’adresse IP du serveur) :

🖥️ Ordinateur (PC) ✍️
cat << EOF >> ~/.ssh/config
Host dusk
    User root
    HostName ADRESSE_IP
    Port 22
EOF

Connexion

Se connecter en SSH au serveur (utiliser le mot de passe que défini sur Contabo) :

🖥️ Ordinateur (PC)
ssh dusk

Installation

Mise à Jour

Mettre à jour le système d’exploitation, puis redémarrer :

☁️ Serveur (VPS)
apt update \
    && apt full-upgrade -y \
    && apt autoremove -y \
    && apt install -y unattended-upgrades \
    && reboot

Patienter quelques secondes et se reconnecter au serveur.

Pare-feu

Installer et configurer le pare-feu pour autoriser seulement les connexions entrantes sur les ports SSH et du nœud :

☁️ Serveur (VPS)
apt install -y ufw \
    && ufw limit ssh \
    && ufw allow 8080/tcp \
    && ufw allow 9000/udp \
    && ufw enable \
    && echo 'OK'

Serveur NTP

Pour être compétitif, le nœud doit rester synchronisé par rapport à ses pairs. Voyons comment faire en sorte d’utiliser un service NTP efficace.

D’abord, vérifier que le fuseau horaire est correct :

☁️ Serveur (VPS)
timedatectl

Exemple de sortie

               Local time: Fri 2024-02-16 22:41:05 CET
           Universal time: Fri 2024-02-16 21:41:05 UTC
                 RTC time: Fri 2024-02-16 21:41:05
                Time zone: Europe/Berlin (CET, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Si le fuseau horaire est incorrect…

Time.is est un service en ligne qui permet de trouver le nom du fuseau horaire d’une ville donnée. Dans le champ de recherche, entrer « Paris », par exemple, puis valider en appuyant sur Entrée. Dans la page résultante, rechercher le texte « The IANA time zone identifier » ; en l’occurrence ça donne « The IANA time zone identifier for Paris is Europe/Paris ». Le fuseau horaire est Europe/Paris, et voici comment spécifier cette valeur au serveur :

☁️ Serveur (VPS) ✍️
timedatectl set-timezone Europe/Paris

Puis, installer le service NTP :

☁️ Serveur (VPS)
apt install -y chrony \
    && echo 'OK'

Et vérifier qu’il est fonctionnel :

☁️ Serveur (VPS)
chronyc tracking

Exemple de sortie

Reference ID: B90D9447 (185.13.148.71)
Stratum     : 3
Ref time (UTC)  : Fri Feb 16 21:37:09 2024
System time : 0.000273747 seconds fast of NTP time
Last offset : +0.000051004 seconds
RMS offset  : 0.001002014 seconds
Frequency   : 12.120 ppm fast
Residual freq   : +0.002 ppm
Skew        : 0.183 ppm
Root delay  : 0.012908236 seconds
Root dispersion : 0.000253640 seconds
Update interval : 128.4 seconds
Leap status : Normal

Dusk

Télécharger et exécuter le script d’installation automatique pour Dusk :

☁️ Serveur (VPS)
apt install -y jq net-tools unzip \
    && curl -sL https://github.com/dusk-network/node-installer/releases/download/v0.2.0/node-installer.sh | sh \
    && echo 'OK'

Commandes

Ces commandes seront pratiques plus tard afin de déterminer l’état du nœud :

☁️ Serveur (VPS)
cat << EOF >> ~/.profile

# Dusk specific commands
alias balance='rusk-wallet balance --spendable'
alias stake-info='rusk-wallet stake-info'
alias rewards='rusk-wallet stake-info --reward'
alias logs='tail -f /var/log/rusk.log'
alias chosen='zgrep execute_state_transition /var/log/rusk.log-*.gz ; grep execute_state_transition /var/log/rusk.log'
alias current='curl -s http://127.0.0.1:8080/02/Chain --data-raw '"'"'{"topic":"gql","data":"query{block(height:-1){header{height}}}"}'"'"' | jq .block.header.height'
alias latest='curl -s https://api.dusk.network/v1/stats | jq .lastBlock'
alias blocks='echo "Current: \$(current)" ; echo "Latest : \$(latest)"'
EOF

Charger les commandes :

☁️ Serveur (VPS)
source "${HOME}/.profile"

balance

Affiche le nombre de nDUSK disponible sur le wallet.

blocks

Affiche le résultat des commandes latest et current.

chosen

Lorsque le nœud est à jour, que les tokens sont en staking et qu’au minimum 2 époques sont passées, cette commande permet de voir quand le nœud est sélectionné pour créer un bloc.

current

Cette commande renvoie le dernier bloc de la blockchain.

latest

Retourne le dernier bloc synchronisé par le nœud.

logs

Affiche les logs pour suivre l’avancée de la synchronisation du nœud.

rewards

Connaître le montant des récompenses accumulées.

stake-info

Affiche le nombre de tokens en staking.


Configuration

Mot de Passe

Stocker le mot de passe du wallet Dusk afin de ne plus avoir à la taper pour toutes les futures commandes rusk-wallet (source) :

☁️ Serveur (VPS) ✍️
echo "export RUSK_WALLET_PWD='MOT_DE_PASSE_DU_WALLET'" >> ~/.profile \
    && source "${HOME}/.profile"

Tester que le mot de passe est visible (il devrait s’afficher, suivi de « OK ») :

☁️ Serveur (VPS)
echo "${RUSK_WALLET_PWD}" \
    && echo 'OK'

Importer le Compte

Attention

Les 12 mots de la seed phrase doivent être entrés en minuscule, chacun séparé par un espace.

☁️ Serveur (VPS)
rusk-wallet restore

Exporter les Clefs de Consensus

☁️ Serveur (VPS)
rusk-wallet export -d /opt/dusk/conf -n consensus.keys \
    && echo "DUSK_CONSENSUS_KEYS_PASS=${RUSK_WALLET_PWD}" > /opt/dusk/services/dusk.conf

Exécution

Et c’est parti, démarrons le nœud :

☁️ Serveur (VPS)
service rusk start

Staking

Attention

Lors du premier lancement, ne commencer à staker des tokens que lorsque le nœud approche la fin de sa synchronisation (quand il reste moins de 4 320 blocs à récupérer).

C’est la dernière étape pour pouvoir créer des blocs et participer au réseau.

Stake

Pour l’exemple, plaçons 1 000 nDUSK en staking (c’est le minimum requis, lien vers le fausset) :

☁️ Serveur (VPS)
rusk-wallet stake --amt 1000

Exemple de sortie

✔ Please enter wallet password: · [hidden]
2024-02-16T06:42:38.853692Z  INFO rusk_wallet::io::status: status="Opening notes database"
2024-02-16T06:42:39.410372Z  INFO rusk_wallet::io::status: status="Getting cached note position..."
2024-02-16T06:42:39.410540Z  INFO rusk_wallet::io::status: status="Fetching fresh notes..."
2024-02-16T06:42:39.486784Z  INFO rusk_wallet::io::status: status="Connection established..."
2024-02-16T06:42:39.490624Z  INFO rusk_wallet::io::status: status="Streaming notes..."
2024-02-16T06:42:40.226524Z  INFO rusk_wallet::io::status: status="Fetching stake..."
2024-02-16T06:42:40.294510Z  INFO rusk_wallet::io::status: status="Stake received!"
Staking address: [REDACTED]
2024-02-16T06:42:40.298475Z  INFO rusk_wallet::io::status: status="Requesting stct proof..."
2024-02-16T06:42:45.970020Z  INFO rusk_wallet::io::status: status="Stct proof success!"
2024-02-16T06:42:45.974639Z  INFO rusk_wallet::io::status: status="Fetching opening notes..."
2024-02-16T06:42:47.099239Z  INFO rusk_wallet::io::status: status="Opening notes received!"
2024-02-16T06:42:47.099421Z  INFO rusk_wallet::io::status: status="Fetching anchor..."
2024-02-16T06:42:47.204651Z  INFO rusk_wallet::io::status: status="Anchor received!"
2024-02-16T06:42:47.227090Z  INFO rusk_wallet::io::status: status="Proving tx, please wait..."
2024-02-16T06:43:08.214350Z  INFO rusk_wallet::io::status: status="Proof success!"
2024-02-16T06:43:08.219467Z  INFO rusk_wallet::io::status: status="Attempt to preverify tx..."
2024-02-16T06:43:08.427675Z  INFO rusk_wallet::io::status: status="Preverify success!"
2024-02-16T06:43:08.427721Z  INFO rusk_wallet::io::status: status="Propagating tx..."
2024-02-16T06:43:08.527562Z  INFO rusk_wallet::io::status: status="Transaction propagated!"
2024-02-16T06:43:08.597338Z  INFO rusk_wallet::io::status: status="Waiting for confirmation... (1/30)"
2024-02-16T06:43:09.685356Z  INFO rusk_wallet::io::status: status="Waiting for confirmation... (2/30)"
2024-02-16T06:43:10.810684Z  INFO rusk_wallet::io::status: status="Waiting for confirmation... (3/30)"
2024-02-16T06:43:11.896795Z  INFO rusk_wallet::io::status: status="Waiting for confirmation... (4/30)"
2024-02-16T06:43:13.002293Z  INFO rusk_wallet::io::status: status="Waiting for confirmation... (5/30)"
[TRANSACTION HASH REDACTED]

Indication

La commande précédente ne peut pas être utilisée à plusieurs reprises pour augmenter le nombre de tokens à staker.

Voici la procédure pour staker plus de tokens (remplacer AMOUNT par le nombre de tokens) :

☁️ Serveur (VPS) ✍️
rusk-wallet unstake \
    && rusk-wallet stake --amt AMOUNT

Astuce

Plus il y a de tokens en staking, plus il y a de chances d’être sélectionné.

Slashing

Le slashing est un système de protection qui pénalise les mauvais comportements. Lorsque ça arrive au nœud, une partie des récompenses est perdue, et s’il n’y en a pas, alors la participation au réseau est stoppée jusqu’à l’époque suivante.

Raisons

Dans l’immédiat, la seule raison connue est quand un pair trouve que le nœud a mis trop de temps pour valider un bloc. Il n’y a rien à faire pour éviter ça, juste espérer qu’avoir un serveur NTP performant aide à prévenir cela.


Débogage

Section pour les cas où le système ne fonctionne pas comme prévu.

Block Mode Error

Relancer la commande pour exporter les clefs de consensus.

Repartir de Zéro

Si nécessaire, repartir de zéro :

☁️ Serveur (VPS)
service rusk stop \
    && rm -rvf /opt/dusk/rusk/chain.db \
    && rm -rvf /opt/dusk/rusk/state \
    && rm -rvf ~/.dusk/rusk-wallet/cache \
    && service rusk start \
    && echo 'OK'

Règles du Pare-feu

Liste des règles actives :

☁️ Serveur (VPS)
ufw status verbose

Voici la sortie attendue :

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     LIMIT IN    Anywhere
8080/tcp                   ALLOW IN    Anywhere
9000/udp                   ALLOW IN    Anywhere
22/tcp (v6)                LIMIT IN    Anywhere (v6)
8080/tcp (v6)              ALLOW IN    Anywhere (v6)
9000/udp (v6)              ALLOW IN    Anywhere (v6)

Liste des ports réellement ouverts :

☁️ Serveur (VPS)
lsof -i -P -n

Exemple de sortie

COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      530    root    3u  IPv4   2288      0t0  TCP *:22 (LISTEN)
sshd      530    root    4u  IPv6   2290      0t0  TCP *:22 (LISTEN)
chronyd 37323 _chrony    5u  IPv4 264489      0t0  UDP 127.0.0.1:323
chronyd 37323 _chrony    6u  IPv6 264490      0t0  UDP [::1]:323
rusk    38995    dusk   23u  IPv4 269825      0t0  UDP *:46317
rusk    38995    dusk   24u  IPv6 269826      0t0  UDP *:41981
rusk    38995    dusk   25u  IPv4 269827      0t0  UDP ADRESSE_IP:9000
rusk    38995    dusk   27u  IPv4 269831      0t0  TCP 127.0.0.1:8080 (LISTEN)

🔗 Liens Utiles

📜 Historique

2024-03-25

Mise à jour de la version du script d’installation de Dusk (0.1.90.2.0) pour la migration depuis l’ITN vers le testnet « Nocturne ».

2024-03-16

Mise à jour de la version du script d’installation de Dusk (0.1.80.1.9).

2024-03-13

Tri alphabétique des commandes.

Mise à jour de la version du script d’installation de Dusk (0.1.70.1.8).

2024-03-08

Amélioration de la commande chosen pour prendre en compte les fichiers de log archivés.

2024-03-06

Ajout de la section commandes.

Mise à jour de la version du script d’installation de Dusk (0.1.60.1.7).

2024-03-03

Installation de unattended-upgrades pour garder le système d’exploitation à jour et réduire le temps de maintenance.

2024-01-02

Mise à jour de la version du script d’installation de Dusk (0.1.50.1.6).

Changement de région pour le serveur (European Union (Germany)United Kingdom) pour pallier les soucis de DNS.

2024-02-29

Mise à jour de la version du script d’installation de Dusk (0.1.40.1.5).

2024-02-22

Mise à jour de la version du script d’installation de Dusk (0.1.20.1.3).

Mise à jour de la version du script d’installation de Dusk (0.1.30.1.4).

2024-02-21

Mise à jour de la version du script d’installation de Dusk (0.1.10.1.2).

2024-02-19

Mise à jour de la version du script d’installation de Dusk (0.1.00.1.1).

2024-02-17

Règle SSH du pare-feu plus protectrice.

2024-02-16

Premier jet.