Minage
Preuve de travail avec RandomX, sur le processeur déjà présent dans votre ordinateur. Aucune ferme d'ASIC à concurrencer et aucun premine — les pièces viennent du minage et de nulle part ailleurs.
L'essentiel en un mot#
# A payout address. The node never sees the key behind it.
zcd wallet new --out miner.json
# Mine to it.
zycordd --testnet --dir ./testnet \
--mine --payout $(zcd wallet address --key miner.json)
Sur le testnet public et sur le mainnet, ce sont les binaires -randomx —
zcd-randomx et zycordd-randomx. Un binaire compilé sans le tag refuse
de démarrer plutôt que de retomber sur le moteur de développement. Voyez
Installation.
Démarrez-le quand vous voulez#
Un nœud démarré avant l'heure du premier bloc de son réseau ne mine pas en avance et n'a pas besoin d'être redémarré à l'heure dite. Il refuse de construire un bloc dont sa propre horloge n'a pas atteint l'horodatage, attend, et commence de lui-même. Il le dit pendant qu'il attend, avec l'heure qu'il attend et le temps restant :
waiting to mine: the next block cannot be dated before 2026-10-01T00:00:01Z
(unix 1790812801), and this node's clock reads 2026-09-30T20:12:31Z - 3h47m30s
to wait. Leave this running: mining starts on its own and there is nothing to
restart or reconfigure.
C'est un refus de miner, non un refus de tourner : le nœud s'appaire, se synchronise et sert son RPC tout du long. Le message se répète toutes les dix minutes, afin qu'une longue attente ne ressemble pas à un blocage.
L'attente est calculée d'après l'horloge de cette machine : une horloge réglée avec des jours de retard attend des jours. Vérifiez-la avant de vérifier quoi que ce soit d'autre.
Ce refus est aussi ce qui rend possible de publier une heure de démarrage tout court. Sans lui, le mineur datait
son en-tête en avant, jusqu'au plancher médian, qui avant la genèse est genesis_time
lui-même — un démarrage anticipé produisait donc une chaîne privée que personne d'autre ne pouvait juger et, parce que la
règle de difficulté mesure les temps de résolution déclarés, une chaîne dont la cible se durcissait à chaque bloc
contre des intervalles sans rapport avec le temps réellement écoulé. Personne n'avait à être malhonnête pour
cela ; c'est ce que faisait le fait de le laisser tourner la nuit.
L'adresse de paiement doit être persistante#
Ce doit être une adresse persistante (0x02) — zcd wallet
address en imprime une par défaut — et zycordd refuse toute autre
chose plutôt que d'avertir. Le nœud ne voit jamais la clé qui la contrôle, et ne pourrait pas
dépenser la récompense s'il le voulait.
Un paiement vers une adresse à usage unique (0x01) mine correctement jusqu'au jour où vous dépensez une fois depuis elle.
Ce débit marque l'adresse comme dépensée pour toujours, et le fold brûle toute récompense en cours de maturation qui lui est adressée
à partir de ce même bloc — l'anneau de maturité tourne après que les certificats du bloc ont été appliqués, si bien que
le bloc portant la dépense est déjà le premier bloc qui perd de l'argent, et tout ce qui reste dans l'anneau parmi vos
coinbase_maturity derniers blocs part avec lui.
Rien ne signale d'erreur. La seule trace est sur la ligne de bloc de ce nœud :
matured=0, qui est aussi ce qu'imprime une case d'anneau ordinairement vide, et un
burned= qui a discrètement absorbé toute la part du producteur à côté des frais de base et
d'omission qu'il rapporte d'habitude. Aucun de ces champs ne dit « coinbase ». Une adresse persistante ne peut jamais entrer
dans le registre des dépensées, la défaillance est donc supprimée plutôt que restreinte — voyez
la règle 3 du portefeuille.
Maturité du coinbase#
Les récompenses arrivent à maturité après coinbase_maturity blocs — 100 aussi bien sur le
mainnet que sur le testnet public. Jusque-là, elles sont visibles dans l'état et non dépensables, ce qui est
ce qui finance les premiers dépôts sur une chaîne sans premine : pendant à peu près les cent premiers
blocs, seuls les mineurs peuvent transiger.
Le mainnet n'a pas de faucet et n'en aura pas, si bien que sur le mainnet cette montée en charge est toute la distribution : miner pour jouer. Le testnet public a un faucet, financé par le minage comme tout le reste sur lui, parce qu'un réseau dont les pièces ne valent rien ne perd rien à laisser quelqu'un répéter un portefeuille avant de répéter un mineur.
Ce qu'il en coûte de le faire tourner#
La fonction de travail est un paramètre de consensus, pas un réglage. zcd
params l'imprime :
proof of work randomx-v1 (re-keyed every 2048 blocks, 64-block lag)
Mémoire#
La vérification demande environ 256 Mio par époque de clé conservée, et la table en conserve deux afin qu'une réorganisation traversant une frontière de clé n'en reconstruise pas une par bloc. Prévoyez davantage que cette table, car la table n'est pas la borne. Un cache est résident dès l'instant où il est alloué et le remplissage Argon2 qui le rend coûteux vient après — jusqu'à deux de plus sont donc vivants pendant leur construction — et une entrée évincée pendant que quelque chose s'en sert encore conserve tout ce qu'elle détient jusqu'à ce que cet utilisateur la lâche, ce que fait un mineur pendant un remplissage de jeu de données.
| Rôle | Budget | Pourquoi |
|---|---|---|
| Nœud vérificateur | ~1 Gio pour le moteur | Le pic de cache contre la table à deux entrées a été mesuré à 1280 Mio avec les deux effets simultanés — et non les 512 Mio que la table laisse supposer. |
| Nœud mineur | ~3,3 Gio | Alloue en plus le jeu de données d'environ 2 Gio, et c'est le cas qui immobilise un emprunteur pendant le remplissage. |
Une machine qui vérifie confortablement ne peut pas nécessairement miner.
Fils d'exécution#
--mine-threads vaut par défaut un par cœur. Cela ne change rien à la validité ; c'est
la vitesse à laquelle ce nœud cherche une solution.
Ce qui se passe lors d'un changement de clé#
La fonction de travail est re-clefée tous les randomx_key_interval blocs. Un nœud mineur
reconstruit alors le jeu de données de ~2 Gio et cesse de miner pendant ce temps — de l'ordre de
dix secondes, selon la machine ; mesurez la vôtre à partir de la première frontière dans le journal.
Il continue de vérifier tout du long, et une reconstruction ne peut pas le bloquer : un en-tête d'une
époque de clé autre que celle en cours de minage est vérifié sur le cache de 256 Mio propre à cette époque, que le
jeu de données ne touche pas. Les deux calculent des empreintes identiques, la seule différence qu'une reconstruction apporte
à la vérification est donc la vitesse. Le cache de l'époque suivante est préchauffé sur les
randomx_key_lag derniers blocs de l'époque.
| Réseau | randomx_key_interval | Pause de minage, approximativement |
|---|---|---|
| mainnet | 2048 blocs | une toutes les ~17 heures |
| testnet public | 512 blocs | une toutes les ~4 heures |
L'intervalle plus court du testnet est délibéré : répéter cette frontière plus souvent fait partie de ce que le réseau existe pour mesurer. Construire à l'avance le jeu de données de l'époque suivante est possible — la clé vient de la hauteur, elle est donc connue bien avant la frontière — et n'est délibérément pas fait : cela suppose d'en détenir deux, 4 Gio, pour épargner une pause qui coûte à un mineur quelques secondes par jour.
Arrêter un nœud mineur#
SIGTERM (ou Ctrl-C) l'arrête, et il s'arrête promptement : un seul signal
atteint chaque boucle, non pas celle qui se trouve attendre sur le canal.
Un arrêt qui survient pendant un changement de clé attend la fin du remplissage du jeu de données
— le moteur ne libérera pas un tampon de ~2 Gio tant que des appels de hachage y lisent encore, ce
qui est un use-after-free en C qu'aucun outillage Go ne signalerait. C'est un arrêt qui attend un événement fixe
plutôt qu'un arrêt qui court contre lui : mesuré sur dix exécutions, l'instant de sortie n'a pas bougé quelle que soit l'avance du
signal, tandis que l'attente est passée de 4,5 s à 0,7 s, sans aucun SIGSEGV.
Prévoyez donc un délai d'arrêt supérieur au temps de remplissage de votre machine. Un second SIGTERM
n'attend pas — le premier rend le signal au système d'exploitation, si bien que
presser Ctrl-C à nouveau pendant cette pause tue le processus immédiatement.
Les pools, et pourquoi il n'y en a pas#
Il n'en existe aucun au lancement et aucun n'est officiel. Le nœud mine en solo dès la sortie de la boîte, et à la difficulté de la genèse c'est la manière sensée d'entrer. Si des pools apparaissent, ce sont des tiers ; appliquez-leur le scepticisme que vous appliqueriez n'importe où.
Les botnets, nommés plutôt que niés#
Le minage CPU les attire. Toute monnaie minable au CPU les a combattus et ce projet ne s'attend pas à faire exception. Le compromis est pris en connaissance de cause : une distribution faussée par des botnets reste plus large qu'une distribution décidée dans une vente, et garder compétitif l'ordinateur portable que vous possédez déjà est toute la raison d'être de RandomX.
Le regarder travailler#
L'explorateur testnet affiche chaque bloc et chaque certificat,
y compris la page qu'aucun explorateur d'une autre chaîne ne peut afficher : si chaque certificat a été appliqué, ou
omis et facturé, et quelle lecture déclarée a cessé de tenir. Votre propre nœud répond aux mêmes
questions sur /status, /head et /metrics — voyez
la surface en lecture seule.