ZYCORD docs
Français
ZycordDocsMinage

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.

S'il ne cesse jamais de dire cela, votre horloge est fausse

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.

Pourquoi une adresse de paiement à usage unique fait perdre de l'argent en silence

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ôleBudgetPourquoi
Nœud vérificateur~1 Gio pour le moteurLe 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 GioAlloue 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éseaurandomx_key_intervalPause de minage, approximativement
mainnet2048 blocsune toutes les ~17 heures
testnet public512 blocsune 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.