[testnet] Comment déployer un nœud Dusk ?¶
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. Système d’exploitation : Ubuntu 24.04 Architecture : x86-64 Espace disque : 50 Gio NVMe Mémoire : 4 Gio de RAMConfiguration Requise¶
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) :
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é :
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: Ubuntu 24.04
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) :
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 défini sur Contabo) :
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 :
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 :
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 :
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 :
timedatectl set-timezone Europe/Paris
Puis, installer le service NTP :
apt install -y chrony \
&& echo 'OK'
Et vérifier qu’il est fonctionnel :
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 :
apt install -y jq net-tools unzip \
&& curl -sL https://github.com/dusk-network/node-installer/releases/download/v0.4.0/node-installer.sh | sh \
&& echo 'OK'
Commandes¶
Ces commandes seront pratiques plus tard afin de déterminer l’état du nœud :
cat << EOF >> ~/.profile
# Dusk specific commands
alias balance='rusk-wallet balance --spendable'
alias blocks='echo "Current: \$(current)" ; echo "Latest : \$(latest)"'
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='ruskquery block-height'
alias logs='tail -f /var/log/rusk.log'
alias rewards='rusk-wallet stake-info --reward'
alias stake-info='rusk-wallet stake-info'
EOF
Charger les commandes :
source "${HOME}/.profile"
balance
¶
Affiche le nombre de nDUSK disponible sur le wallet.
blocks
¶
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) :
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 ») :
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.
rusk-wallet restore
Exporter les Clefs de Consensus¶
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 :
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. Pour l’exemple, plaçons 1 000 nDUSK en staking (c’est le minimum requis, lien vers le fausset) : Exemple de sortie Prudence 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 Astuce Plus il y a de tokens en staking, plus il y a de chances d’être sélectionné. 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. 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.Stake¶
rusk-wallet stake --amt 1000
✔ 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]
AMOUNT
par le nombre de tokens) :rusk-wallet unstake \
&& rusk-wallet stake --amt AMOUNT
Slashing¶
Raisons¶
Débogage¶
Section pour les cas où le système ne fonctionne pas comme prévu. Relancer la commande pour exporter les clefs de consensus. Si nécessaire, repartir de zéro : Liste des règles actives : Voici la sortie attendue : Liste des ports réellement ouverts : Exemple de sortieBlock Mode Error¶
Repartir de Zéro¶
echo 'Y' | ruskreset \
&& service rusk start \
&& echo 'OK'
Règles du Pare-feu¶
ufw status verbose
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)
lsof -i -P -n
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-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.5
→0.4.0
).Changement du système d’exploitation du serveur VPS pour supporter la nouvelle version de Dusk (
Debian 12
→Ubuntu 24.04
).- 2024-10-21
Mise à jour de la version du script d’installation de Dusk (
0.3.2
→0.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.0
→0.3.2
).- 2024-03-25
Mise à jour de la version du script d’installation de Dusk (
0.1.9
→0.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.8
→0.1.9
).- 2024-03-13
Tri alphabétique des commandes.
Mise à jour de la version du script d’installation de Dusk (
0.1.7
→0.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.6
→0.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.5
→0.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.4
→0.1.5
).- 2024-02-22
Mise à jour de la version du script d’installation de Dusk (
0.1.2
→0.1.3
).Mise à jour de la version du script d’installation de Dusk (
0.1.3
→0.1.4
).- 2024-02-21
Mise à jour de la version du script d’installation de Dusk (
0.1.1
→0.1.2
).- 2024-02-19
Mise à jour de la version du script d’installation de Dusk (
0.1.0
→0.1.1
).- 2024-02-17
Règle SSH du pare-feu plus protectrice.
- 2024-02-16
Premier jet.