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.

Astuce

🫶 Adresse Dusk pour les pourboires
VKZpBrNtEeTobMgYkkdcGiZn8fK2Ve2yez429yRXrH4nUUDTuvr7Tv74xFA2DKNVegtF6jaom2uacZMm8Z2Lg2J

🔗 Liens Utiles

Configuration Requise

  • Système d’exploitation : Ubuntu 24.04

  • 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

La documentation officielle traite de Digital Ocean, et il est possible d’utiliser Hetzner ou encore Vultr. Ici, nous parlerons de ce dernier.

Créé un compte sur Vultr et déployer un nouveau produit avec ces caractéristiques :

  • Type : Shared CPU ‣ High Performance ‣ vhp-2c-4gb-intel (Intel, 2 vCPU, 4 GB RAM, 100 GB NVMe)

  • Location : selon les préférences

  • Operating System: Ubuntu 24.04 x64

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 fourni sur Vultr) :

🖥️ Ordinateur (PC)
ssh dusk

Important

Il est vivement recommandé de désactiver l’accès SSH par mot de passe pour favoriser l’utilisation d’une clé. Un mini guide est disponible ici : Comment paramétrer SSH pour un accès par clé.

 _______             .___       ________               __
 \      \   ____   __| _/____   \______ \  __ __ _____|  | __
 /   |   \ /  _ \ / __ _/ __ \   |    |  \|  |  /  ___|  |/ /
/    |    (  <_> / /_/ \  ___/   |    `   |  |  \___ \|    <
\____|__  /\____/\____ |\___  > /_______  |____/____  |__|_ \
        \/            \/    \/          \/          \/     \/

🛠️ 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 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)
curl -sL https://github.com/dusk-network/node-installer/releases/latest/download/node-installer.sh | bash

🎛️ Commandes

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

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

# Dusk
alias balance='rusk-wallet balance --spendable 2>/dev/null'
alias logs='tail -f /var/log/rusk.log'
alias rewards='rusk-wallet stake-info --reward 2>/dev/null'
alias stake-info='rusk-wallet stake-info 2>/dev/null'
EOF

Charger les commandes :

☁️ Serveur (VPS)
source ~/.profile

balance

Affiche le nombre de DUSK disponible sur le wallet.

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.

ruskquery block-height

Affiche le dernier bloc synchronisé.

ruskquery peers

Affiche le nombre de connexions à d’autres nœuds.

⚙️ 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 ~/.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

Pour démarrer le nœud :

☁️ Serveur (VPS)
service rusk start

🪙 Staking

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

Prudence

À chaque fois que des tokens sont ajoutés en staking, le nœud sera incorporé à la blockchain 2 époques plus tard (c’est-à-dire 4 320 blocs), cette opération n’est pas immédiate.

Pendant cette période d’attente, il est toutefois possible d’augmenter le nombre de tokens en staking sans pénalité.

Stake

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

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

Astuce

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

Stake More

Une fois que des tokens sont en staking, il est possible d’en rajouter de deux manières.

Avec Pénalité

Augmenter le nombre de tokens « à la volée » donnera lieu à une pénalité (soft slashing en anglais) de 10% : soit 10% du montant sera bloqué et récupérable seulement quand la commande unstake sera utilisée.

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

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

Sans Pénalité

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

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

💰 Récompenses

Il y a deux moyens de récupérer des récompenses :

  1. Lorsque le nœud est sélectionné pour générer un bloc : récupération de 70% des tokens émis + une part variable suivant le nombre de voteurs inclus (non modifiable).

  2. Lorsque le nœud est sélectionné en tant que voteur et inclus dans le bloc généré : récupération d’une fraction des 10% des tokens réservés aux voteurs.

Pour des informations techniques complètes, lire Economic Protocol Design (section Incentives goals) et le code source.

Prudence

Afin de pouvoir retirer ses récompenses, il faut qu’il y ait des tokens en staking.

La commande suivante permet de récupérer les récompenses (remplacer AMOUNT par le nombre de tokens, en option) :

☁️ Serveur (VPS)
rusk-wallet withdraw [--amt AMOUNT]

Slashing

Le slashing est un système de protection qui pénalise les mauvais comportements. Quand ç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. Plus d’information sur Slashing mechanism.

🌡️ Supervision

Il existe plusieurs projets permettant de suivre l’état du nœud, voici celui que j’utilise : BoboTiG/dusk-monitor.

🐛 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)
echo 'Y' | ruskreset \
    && 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
9000/udp                   ALLOW IN    Anywhere
22/tcp (v6)                LIMIT IN    Anywhere (v6)
9000/udp (v6)              ALLOW IN    Anywhere (v6)

Avertissements dans les logs

Pour les trouver, utiliser cette commande :

☁️ Serveur (VPS)
zgrep WARN /var/log/rusk*.log

Avertissements connus :

  1. Cet avertissement n’est pas important et peut être ignoré :

    2025-01-22T23:07:33.710209Z  WARN node::databroker: error on handling msg: could not find locator block
    
  2. Peut être ignoré si exceptionnel. Cela veut dire que le nœud a temporairement pris du retard dans la synchronisation. Peut donner lieu à un soft slash si le nœud est sélectionné tout en état en retard à plusieurs reprises :

    2025-01-22T23:26:14.069521Z  WARN node::chain::acceptor: event="missed iteration" height=133665 iter=0 generator="REDACTED"
    

Erreurs dans les logs

Pour les trouver, utiliser cette commande :

☁️ Serveur (VPS)
zgrep ERROR /var/log/rusk*.log

Erreurs connues :

  1. Cette erreur n’est pas importante et peut être ignorée :

    2025-01-13T11:01:23.140197Z ERROR kadcast::handling: Invalid Id Header { binary_id: BinaryID { bytes: [173, 236, 205, 149, 2, 31, 24, 69, 160, 37, 18, 19, 190, 133, 175, 232], nonce: [118, 0, 0, 0] }, sender_port: 9000, network_id: 1, reserved: [0, 0] } - from REDACTED
    
  2. Cette erreur n’est pas importante et peut être ignorée (elle sera bientôt de l’histoire ancienne) :

    2025-01-22T00:13:52.189187Z ERROR main{round=125324 iter=0 name=Ratification pk="REDACTED"}: dusk_consensus::execution_ctx: phase handler err: VoteAlreadyCollected
    

📜 Historique

Historique complet

2025-02-22

Mise à jour définitive de la version du script d’installation de Dusk (0.5.4latest).

2025-02-14

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

2025-01-23

Correction des chiffres liés aux récompenses.

Suppression des alias blocks et generated. Ils n’étaient plus vraiment pertinents depuis l’arrivée des outils de supervision (f03701d).

Ajout des commandes ruskquery block-height et ruskquery peers.

Ajout du projet DuskMan dans la section Supervision.

Ajout de la section Avertissements dans les logs.

Ajout de la section Erreurs dans les logs.

2025-01-11

Ajout de la section Supervision.

Correction du code de l’alias generated pour trier correctement les fichiers de log.

2025-01-08

Suppression de l’alias accepted. La notion de blocs générés versus blocs acceptés était erronée, il n’y a en réalité que des blocs générés. Dans le cas ou le bloc généré est à une itération supérieure à zéro, il s’agit d’une action permettant de proposer un bloc quand l’autre nœud sélectionné n’arriverait pas à fournir le bloc à temps.

Simplification des alias blocks et generated.

Amélioration de l’alias generated pour trier par numéro de bloc.

2025-01-05

Mise à jour de la version du script d’installation de Dusk (0.5.20.5.3) pour le kick-off du mainnet !

Ajout des alias accepted et generated.

L’alias blocks affiche désormais toutes les informations utiles pour connaître les statisriques du nœud.

Suppression des alias chosen, current et latest.

2025-01-04

Ajout de la section Stake More.

2025-01-03

Mise à jour de la version du script d’installation de Dusk (0.5.10.5.2) pour le second dry-run du mainnet.

Suppression de l’ouverture du port 8080/TCP (utile seulement pour les nœuds de type archive).

Simplification de l’alias latest.

2025-01-02

L’alias latest utilise désormais une requête HTTP vers l’URL officielle du nœud plutôt que le nœud local (59d594e).

2025-01-01

Changement d’hébergeur pour cause de mauvaises performances (Contabo → Vultr).

Ajout de la section Récompenses.

2024-12-30

Amélioration de l’alias chosen (0907b1453f84d7).

2024-12-28

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

Simplification de la commande d’installation de Dusk.

2024-12-27

Mise à jour de la version du script d’installation de Dusk (0.4.00.5.0) pour la migration depuis le testnet « Nocturne » vers le premier dry-run du mainnet.

Correction de la commande d’installation de Dusk (shbash).

Suppression du lien vers le fausset du testnet.

2024-12-15

Ajout de l’avertissement quant à l’utilisation d’un mot de passe pour accéder au serveur via SSH.

2024-12-12

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

Changement du système d’exploitation du serveur VPS pour supporter la nouvelle version de Dusk (Debian 12Ubuntu 24.04).

2024-10-21

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

Correction du lien vers le fausset (https://docs.dusk.network/itn/testnet-faucet/https://docs.dusk.network/operator/nocturne/testnet-faucet/).

2024-10-10

Simplification de la commande pour Repartir de Zéro.

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

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.