Glossaire
Certificat, fold, omission, dépôt, séquenceur, chemin forcé. Plusieurs de ces mots signifient ici quelque chose de plus étroit qu'ailleurs, et deux ou trois nomment des événements pour lesquels la plupart des chaînes n'ont pas de mot.
Le vocabulaire qu'emploie ce protocole, au sens où il l'emploie. Plusieurs de ces mots signifient ici quelque chose de plus étroit qu'ailleurs, et deux d'entre eux — l'omission et le rejet — nomment des événements pour lesquels la plupart des chaînes n'ont pas de mot faute d'équivalent.
Certificat#
L'unique type de transaction de Zycord. Un certificat porte l'état qu'il a lu et l'état qu'il a écrit, plus le programme qui les relie, les signatures qui l'autorisent, un dépôt, un TTL, et une enchère dans chacun des deux marchés de frais. Parce qu'il porte ses propres entrées et sorties, vérifier s'il est valide n'exige aucun état.
Fold#
La boucle déterministe qui fait avancer le registre. Elle parcourt les certificats d'un bloc dans un ordre canonique — d'abord les fills, puis tous les certificats ordinaires, puis les certificats forcés — et vérifie pour chacun si ses lectures déclarées tiennent encore : si oui elle valide les écritures, si non elle procède à son omission. Le fold effectue des comparaisons, des additions et des écritures sur un ensemble de travail clé-valeur en mémoire chaude — aucune exécution de code, aucune vérification de signature, aucune réexécution, et aucune arithmétique sur courbe elliptique. C'est la seule étape du système qui ne se parallélise pas.
Omission#
Ce qui arrive à un certificat dont les lectures déclarées ne tiennent plus, dont les deltas sortiraient de la plage de 256 bits, ou qui écrirait sous une adresse dépensée. Rien n'est écrit, des frais d'omission fixes de 1 000 000 drops (0,01 ZCD) sont brûlés sur son dépôt et ne paient personne, le reste du dépôt est restitué, et le bloc reste valide. Celui qui a nommé le dépôt paie : l'auteur d'un certificat ordinaire, qui a choisi les lectures, ou le séquenceur d'un fill. Un utilisateur ne paie jamais l'omission d'un fill. L'omission est une sémantique, non un échec : l'inclusion et l'application sont des événements distincts, si bien qu'un producteur de blocs ne peut jamais produire un bloc invalide en incluant un certificat périmé.
Rejet#
Un non-événement non facturé. Un certificat dont le dépôt ne peut pas être réservé — la cellule de dépôt est déjà dépensée, ou contient moins que le montant que le certificat réserve — est rejeté : porté dans le bloc, non facturé, non marqué comme vu, et libre d'être resoumis contre un dépôt frais. Les utilisateurs honnêtes ne perdent donc rien aux courses sur leur propre cellule de dépôt.
Dépôt#
La cellule qui répond d'un certificat : une cellule de solde natif d'une adresse d'utilisateur, le montant qui y est réservé, et le slot de monnaie vers lequel le reste revient. Aucun certificat n'existe sans dépôt, et la cellule de dépôt porte toujours une signature. L'omission ne doit pas être gratuite, sinon le mempool est submergé ; le dépôt est ce qui donne un propriétaire à chaque conflit. Un fill effectue son dépôt sur le solde persistant de son séquenceur, et c'est pourquoi c'est le séquenceur et non l'utilisateur qui paie lorsqu'un fill est omis ; un certificat forcé est quant à lui payé sur le paiement de son intent ouvert. Les garants (underwriters) et les certificats assurés du livre blanc v1.0 ont disparu ; c'est ce qui les a remplacés.
Cellule#
La valeur à un slot — un entier non signé de 256 bits stocké en gros-boutien sur 32 octets. Zéro est absence : un slot jamais écrit et un slot écrit à zéro sont le même slot. C'est une exigence de consensus, non une commodité : cela garde la racine d'état fonction de l'état plutôt que de l'historique qui l'a produit.
Adresse à usage unique (0x01)#
Une adresse dont l'autorité de signature est brûlée définitivement par son premier débit. Payer une adresse à usage unique fraîchement dérivée est le chemin rapide sans contention, et en dériver une nouvelle par paiement est ce qui rend un paiement non reliable au suivant. Le prix en est que “en dépenser une partie” n'est pas quelque chose qu'une adresse à usage unique sait faire — voyez la règle 1 du portefeuille.
Adresse persistante (0x02)#
Une adresse réutilisable. Elle ne peut jamais entrer dans le registre des dépensées, elle n'a donc aucune surface de nuisance par brûlage. Les commerçants, les adresses de dons, les dépôts d'un séquenceur et les paiements de minage en utilisent une ; zycordd --payout refuse toute autre chose.
Registre des adresses dépensées#
L'ensemble de consensus permanent des adresses à usage unique dont l'autorité a été brûlée. Les valeurs de cellules sous une adresse dépensée peuvent être élaguées après l'horizon d'annulation, mais jamais l'entrée du registre — c'est elle qui empêche l'adresse d'être ressuscitée. Environ 33 octets par adresse, pour toujours : le problème ouvert que le protocole assume, partagé structurellement avec toute conception à ensemble de nullificateurs.
Valide et applicable#
Deux prédicats qu'une chaîne conventionnelle confond. Valide est sans état, parallèle, et vérifiable par quiconque à partir des seuls octets du certificat. Applicable est avec état, séquentiel, et décidé seulement par la position dans le registre. Deux certificats valides peuvent déclarer la même valeur d'entrée pour le même slot ; un seul au plus peut être applicable.
Delta gardé#
Une discipline d'accès dans laquelle un certificat affirme un prédicat sur un slot — balance ≥ 10 — sans lire la valeur dans le calcul, et écrit un delta signé. Un nombre quelconque de débits et de crédits gardés sur le même slot commutent, si bien qu'une omission ne survient que sur un découvert réel et non simplement parce que le solde a changé. Cette seule discipline couvre les transferts, les frappes à offre plafonnée, les autorisations et les parts de coffre, et elle n'est jamais soumise à un séquenceur : un jeton séquencé accepte toujours chaque transfert de quiconque.
Delta pur#
Un delta signé sans garde. Il ne peut jamais entrer en conflit et ne donne jamais lieu à une omission. Pourboires, compteurs, accumulateurs, décomptes de récompenses.
Lecture exacte#
La discipline de style SLOAD : la lecture renvoie la valeur du slot dans le calcul et y arrime le certificat. Logique arbitraire, conflits sur les slots chauds, et domaine des séquenceurs.
Séquenceur#
Un service hors chaîne qu'un contrat choisit pour sérialiser son trafic à lecture exacte. L'enregistrement de chaque contrat contient une clé de séquenceur : tant qu'elle est non nulle, une lecture exacte, une garde d'égalité ou un set sur les cellules de ce contrat exige la signature de cette clé ; tant qu'elle est nulle, le contrat est ouvert, et protégé uniquement par son code. Le séquenceur exécute les intents des utilisateurs et publie les résultats sous forme de fills. On lui fait confiance pour la vivacité, jamais pour la sûreté : il ne peut pas changer ce que fait un intent, seulement le moment, et un fill construit sur un mensonge est omis aux frais du séquenceur. S'il cesse de servir, le chemin forcé demeure.
Intent#
Ce qu'un utilisateur signe au lieu d'un certificat pour appeler un contrat séquencé : la cible et les calldata, un budget parallèle, un nonce, une fenêtre de 8 blocs au plus, l'adresse persistante du séquenceur, des bornes sur le résultat, le paiement dû à chaque séquenceur, les payeurs à usage unique qui le financent, et des sorties de monnaie. Une borne est un prédicat sur une cellule que l'appel écrit — final-at-least, final-at-most, delta-at-least ou delta-at-most — et au moins une doit nommer une cellule que l'appel a écrite. L'intent est toute l'autorisation de l'utilisateur, et ses paiements ne se règlent que si le fill s'applique.
Fill#
Le certificat qu'un séquenceur publie pour un intent. Son programme est l'intent, son dépôt provient du propre solde persistant du séquenceur, et son identifiant est le hachage de l'intent, si bien que deux fills d'un même intent partagent un identifiant et qu'un seul peut être facturé. Les fills viennent en premier dans l'ordre du fold, chacun dès que chaque pipeline dont il fait partie est prêt.
Reçu#
La réponse signée d'un séquenceur à un intent, renvoyée en quelques millisecondes, bien avant qu'un bloc n'existe : l'identifiant de l'intent, le seq du pipeline et le résultat. C'est une pré-confirmation — la promesse du séquenceur, non celle de la chaîne, et définitive seulement lorsque le fill s'applique. Parce que les reçus sont signés, deux reçus d'une même clé qui donnent un même seq à des intents différents, ou des résultats différents à un même intent, sont une preuve que chacun peut vérifier à partir des octets. Le consensus ne le punit pas ; les utilisateurs s'en vont.
Pipeline#
La chaîne conserve, pour chaque paire de clé de séquenceur et de contrat, le dernier seq appliqué. Un fill n'entre que lorsque ce compteur se trouve un cran en dessous de son seq, et le compteur n'avance que lorsque le fill s'applique, si bien que les fills d'un séquenceur se valident dans l'ordre où il les a signés, quel que soit l'ordre dans lequel un producteur les a reçus. Un fill omis retient les fills construits derrière lui jusqu'à ce que le séquenceur reconstruise à partir du même numéro.
Compteur fence#
Un compteur dans l'enregistrement de chaque contrat. Un fill déclare le compteur fence des contrats sur lesquels il a été construit, et ne peut pas entrer si l'un d'eux a bougé. Il avance lorsqu'un certificat forcé qui atterrit fixe l'une des cellules du contrat, et lorsque la cellule de séquenceur du contrat est écrite — si bien que le chemin forcé et un changement de séquenceur invalident chaque fill construit sur l'état qu'ils ont modifié, sans que personne soit facturé. Une lecture ou un delta ne le fait pas bouger, pas plus qu'un certificat forcé qui a échoué. Le séquenceur reconstruit et ne perd que de la latence.
Coséquençage#
Un appel qui traverse des contrats liés à des séquenceurs différents atterrit comme un unique fill portant la signature de chaque séquenceur dont il touche le chemin exact, jusqu'à 16, chacun avec un seq dans son propre pipeline et chacun payé de ce que l'intent lui attribue. La manière dont ils se coordonnent est hors chaîne et libre par conception ; la chaîne voit un seul certificat, atomique par construction.
Annuaire des séquenceurs#
L'endroit où un séquenceur annonce son service : un certificat d'annuaire émis depuis son adresse persistante lie sa clé à une chaîne de 1 à 256 octets d'ASCII imprimable, typiquement une URL. L'entrée expire 259 200 blocs (environ 90 jours) après le TTL du certificat d'annonce sauf renouvellement, et un retrait la supprime immédiatement. Le consensus stocke la chaîne et ne l'interprète jamais — c'est de la découverte, pas de l'autorisation. Un nœud la sert sur /directory.
Chemin forcé#
Le chemin lent qui n'a besoin d'aucun séquenceur. Un utilisateur signe un intent ouvert et le relaie au réseau ; un producteur de blocs exécute les intents ouverts qu'il choisit contre l'état de fin de bloc et en ajoute les résultats comme certificats forcés, les derniers certificats du bloc. L'inclusion est l'application : il n'y a ni file, ni bail, ni quota, ni échéance. Un bloc porte au plus 16 certificats forcés, chacun avec au plus 4 000 unités de dérivation de budget parallèle (200 000 gas machine), ce qui explique pourquoi chaque sortie qu'offre un contrat doit tenir dans ce budget. Un certificat forcé dont l'appel échoue (revert) atterrit tout de même, comme FORCED_FAILED : ses payeurs paient, la monnaie revient à l'utilisateur, et rien d'autre n'est écrit.
Intent ouvert#
Un intent sans séquenceur nommé et sans co-séquenceurs, financé par les propres payeurs à usage unique de l'utilisateur. Il circule dans le mempool en tant qu'intent, non en tant que certificat, et son paiement couvre les frais du certificat forcé : la part des frais de base est brûlée et le reste va au producteur. zcd wallet open-intent en signe un, et zcd wallet intent --fallback en signe un lorsque le séquenceur ne sert pas l'original.
cEVM#
L'unique machine virtuelle : un dialecte de la machine virtuelle d'Ethereum adapté aux certificats. Le stockage est déclaré plutôt que découvert, des opcodes sont ajoutés pour les gardes, les deltas et la désignation du séquenceur d'un contrat, les opcodes sans référent ici sont supprimés, et NUMBER et TIMESTAMP répondent à partir de la balise d'époque. Active à partir de l'Ère 1, avec une bibliothèque standard en priorité delta pré-déployée à des adresses connues. Solidity et son outillage se transposent.
Balise d'époque#
Des cellules réservées que le protocole écrit une fois par époque : le numéro d'époque, la hauteur de l'en-tête qui l'a ouverte, un mot d'entropie et, à partir de l'Ère 1, l'heure de cet en-tête. Les programmes ne doivent pas lire directement des valeurs ambiantes comme l'horodatage ou la hauteur — cela ferait de l'exécution une fonction d'autre chose que les lectures déclarées — ils lisent donc la balise comme n'importe quel autre slot, idéalement avec une garde d'intervalle. Ses valeurs sont constantes pendant toute une époque. Le mot d'entropie est une sortie de preuve de travail et il est impropre aux loteries de forte valeur.
Époque#
2 880 blocs — environ une journée avec des blocs de 30 secondes, et à partir de la bascule vers la preuve d'enjeu 17 280 slots de 5 secondes, toujours une journée. L'unité selon laquelle la subvention diminue, la cible de capacité séquentielle évolue, et la balise est rafraîchie.
TTL#
La hauteur avant laquelle un certificat doit être validé pour être valide. Bornée par le consensus à 240 blocs (environ deux heures), 1 440 blocs à partir de la bascule vers la preuve d'enjeu, ce qui permet d'élaguer l'ensemble des vus. Inclure un certificat déjà vu ou expiré rend le bloc invalide — si bien qu'une signature n'est facturable qu'une fois au plus, et seulement à une position que son signataire a acceptée en signant.
Gas séquentiel et gas parallèle#
Les frais se scindent en deux marchés : un pour la mutation d'état séquentielle, qui est rare, et un pour la vérification parallèle, qui ne l'est pas. Une vérification de signature ne concourt donc pas dans la même enchère qu'une écriture de stockage, et c'est ce qui rend la cryptographie lourde bon marché par conception. Dans les deux, les frais de base sont brûlés et les frais de priorité paient le producteur sur les certificats qui s'appliquent, et sur eux seuls ; les frais d'un certificat omis sont brûlés en totalité.
Ère#
Une étape du protocole, conditionnée par une hauteur compilée dans les versions publiques et, dans l'Ère 2, par l'enjeu mesuré sur la chaîne entre des bornes de hauteur — jamais par une date du calendrier ni par un vote. L'Ère 0, en service depuis le bloc 0 : le minage, les actifs natifs, les deux marchés de frais, la répartition de la subvention et la trésorerie, qui s'accumule, scellée. L'Ère 1 à la hauteur 80 640 sur le mainnet, vers le 4 novembre 2026, et depuis la hauteur 2 880 sur le testnet public : la cEVM, les séquenceurs, les intents et les fills, l'annuaire et le chemin forcé. L'Ère 2, la preuve d'enjeu : l'engagement s'ouvre à l'époque 182, vers le 7 avril 2027 ; la rampe démarre lorsque l'enjeu actif détient 10 % de l'offre pendant 30 époques, à l'époque 273 au plus tard ; la bascule vers l'enjeu seul suit lorsque la rampe s'achève. L'Ère S ajouterait les paiements confidentiels, seulement après des audits indépendants, et ne fait pas partie de la spécification actuelle. Les ères 2 et S sortent chacune comme une version à part entière, par hard fork. L'engagement d'enjeu ne fait pas partie de l'Ère 1.
Preuve d'enjeu#
Le consensus de l'Ère 2, dans lequel le droit de produire le bloc suivant est tiré au sort selon l'enjeu au lieu d'être vendu contre des hashs, et l'intervalle entre blocs passe de 30 à 5 secondes. Tout le reste demeure : chaque nœud contrôle chaque certificat à partir de ses octets, le fold et les deux marchés de frais sont inchangés, et un certificat invalide à l'intérieur d'un bloc rend toujours le bloc invalide. Le calcul qu'un mineur dépensait en hashs, un producteur le dépense en vérification. Elle entre en vigueur par une rampe et une bascule, et jusqu'à la bascule les blocs sont minés. Spécifiée au §11 du livre blanc.
Enjeu#
De la pièce native engagée dans la production de blocs. BOND déplace un solde d'une adresse persistante vers une cellule d'enjeu liée à cette adresse, dont la clé est la clé qui signe les blocs, et UNBOND le restitue après un délai de sortie plus long que l'horizon d'annulation. Un enjeu devient actif une époque après son engagement, si bien que des enjeux ne peuvent pas être créés et abandonnés en série. La caution minimale est de 1 000 ZCD ; une clé, un enjeu. L'engagement s'ouvre avec l'Ère 2, à l'époque 182.
Pool et délégation#
Un pool est un enjeu qui accepte la délégation. DELEGATE fait pointer une caution vers la clé d'un pool, à partir d'un minimum inférieur à celui d'une caution de production, et le solde ne quitte jamais le délégateur, qui peut le rediriger ou le désengager sous le même délai de sortie. Le poids d'un pool dans le tirage est sa propre caution plus ce qui lui est délégué, et le fold répartit sa récompense une fois par époque entre le pool, à la marge qu'il a déclarée, et ses délégateurs, au prorata de l'enjeu. Un délégateur n'est jamais sanctionné : si un pool commet une double signature, seule sa propre caution est brûlée. À ne pas confondre avec un pool de minage, qui est hors chaîne et hors du consensus.
Slot#
Sous preuve d'enjeu, un intervalle de 5 secondes dans lequel un bloc peut être produit, par le producteur tiré au sort pour lui avec une probabilité proportionnelle à l'enjeu, à partir d'une graine fixée lors de l'époque précédente. Une époque compte 17 280 slots. Un slot sans bloc reste vide et ne paie rien, et parmi les chaînes valides, celle qui occupe le plus de slots l'emporte. Ailleurs, un slot est un emplacement de stockage, (address, word), dont la valeur est une cellule.
Rampe#
L'entrée dans l'Ère 2 : 90 époques pendant lesquelles chaque bloc est encore miné et porte aussi la signature de l'enjeu tiré au sort pour sa hauteur. Le staker touche k/180 de la part du producteur, où k commence à 1 et augmente de un à chaque époque qui franchit la porte : au moins 90 % des blocs de l'époque signés, et un enjeu actif d'au moins 10 % de l'offre. Un bloc miné sans la signature est valide et ne paie personne : la part de son producteur et ses frais de priorité sont brûlés. La rampe démarre lorsque l'enjeu actif détient 10 % de l'offre pendant 30 époques, et à l'époque 273 au plus tard. À ne pas confondre avec la rampe d'émission de 30 jours ; voir émission.
Bascule#
Le bloc auquel la preuve de travail prend fin : le premier bloc de l'époque qui suit la 90e époque à franchir la porte de la rampe, à l'époque 363, vers le 5 octobre 2027, au plus tard si la porte ne la suspend jamais. À partir de lui, les blocs arrivent en slots de 5 secondes, une époque compte 17 280 slots, et chaque bloc paie un sixième du taux de l'époque ; les plafonds par bloc sont divisés par six et chaque nombre de blocs qui mesure le temps est multiplié par six, si bien que la capacité et les durées par jour restent les mêmes. Un bloc est alors final à une profondeur de 120 blocs, 10 minutes, là où la preuve de travail en demandait 20.
Double signature#
Deux en-têtes signés par une même clé pour un même slot : la seule faute punie par le consensus sous preuve d'enjeu. Comme un certificat invalide, la double signature est une preuve en un seul message que chacun peut vérifier à partir des octets. Un certificat de signalement porte les deux en-têtes, et le fold brûle la propre caution du signataire, retire sa clé de l'ensemble actif et verse une fraction à l'auteur du signalement. Rien de ce que fait un producteur n'atteint la pièce de quelqu'un d'autre : les délégations d'un pool reviennent à leurs délégateurs.
Émission#
Le ZCD n'existe que sous forme de subvention de bloc, et le bloc 0 n'en paie aucune. Le taux commence à 21 ZCD par bloc et diminue à chaque frontière d'époque par une arithmétique entière exacte — E(n) = max(tail, E(n−1) − floor(E(n−1) / 1054)) — et se divise par deux environ tous les deux ans jusqu'à atteindre la queue perpétuelle de 0,33 ZCD par bloc à l'époque 4 376, vers l'année 12. Les 86 400 premiers blocs (30 jours) forment une rampe : le bloc h paie h/86 400 du taux que paie le bloc 86 400, et ce que la rampe retient, environ 907 917 ZCD, n'est jamais reversé. À partir de la bascule vers la preuve d'enjeu, chaque bloc paie un sixième du taux de l'époque, si bien qu'une journée paie autant. zcd emission --height N affiche la subvention à n'importe quelle hauteur.
Répartition de la subvention#
Chaque subvention de bloc, et jamais les frais, est répartie 94 / 3 / 3 par le consensus dès le bloc 0 : 94 % au producteur du bloc après une maturité de deux heures (240 blocs, 1 440 sous preuve d'enjeu), 3 % à l'adresse persistante du fondateur jusqu'à l'époque 1 095 (trois ans), et 3 % à la trésorerie, qui reçoit aussi les 3 % du fondateur à partir de ce moment. Pendant la rampe de la preuve d'enjeu, les 94 % du producteur sont eux-mêmes partagés entre le mineur et le staker tiré au sort. C'est une règle appliquée à chaque bloc miné, non une allocation à la genèse : il n'y a pas de premine.
Trésorerie#
Le solde natif de l'adresse du protocole. Aucune clé n'a pour hash cette adresse, aucun certificat ne peut la débiter, et la genèse ne nomme aucun quorum. Elle est créditée de 3 % de chaque subvention de bloc à partir du bloc 1 et de 6 % à partir de l'époque 1 095. Aucun chemin de dépense n'existe dans le protocole : un tel chemin ne peut être ajouté que par une mise à niveau ultérieure, avec des signataires choisis par la communauté et non par le fondateur, et l'engagement pris au lancement est qu'il ne viendra pas avant la hauteur 259 200, vers le 5 janvier 2027.
Proposition d'intendance#
Une proposition soumise à l'examen de la communauté, non une règle de consensus. Elle suggère comment la trésorerie pourrait être dépensée pendant ses trois premières années : cinq sièges dotés de chartes publiques — développeur principal, développeur relecteur, mineur, communauté, représentant du public — avec 3 sur 5 pour dépenser, et 4 sur 5, rendu public 20 160 blocs avant de prendre effet, pour remplacer un détenteur, faire tourner les clés, dépenser la réserve ou amender une charte. Les budgets sont des parts des entrées de la trésorerie, jamais des sommes fixes. Rien de ce qu'elle contient n'engage tant que la mise à niveau de la trésorerie ne fixe pas un jeu de clés. Le texte se trouve dans le document compagnon.
RandomX#
La fonction de preuve de travail, optimisée pour les processeurs généralistes afin que le matériel ordinaire reste compétitif ; le mainnet et le testnet public utilisent randomx-v2. C'est un paramètre de consensus, non un réglage : un binaire qui ne peut pas calculer le pow_engine d'un réseau refuse de démarrer plutôt que de retomber sur autre chose.
Racine d'état#
L'engagement sur la totalité de l'état à une hauteur donnée. Un nœud la recalcule au démarrage et refuse de tourner si celle qui est stockée diverge, et elle sert aussi de garde différentielle en production entre nœuds : deux implémentations qui atteignent des racines différentes depuis une même suite de blocs ont trouvé un bogue chez l'une des deux.
Où chaque terme est défini de façon normative#
Cette page est une aide à la lecture. Les définitions qui lient sont dans la spécification et les vecteurs de référence ; le raisonnement est dans le livre blanc, v2.0, et son document compagnon, Launch, Eras and Parameters, qui régit l'émission, les ères et chaque valeur de paramètre. La section de vocabulaire propre à l'implémentation se trouve dans docs/ARCHITECTURE.md.