Le bloc de genèse
Chaque chaîne ZooBC commence par un bloc de genèse, le bloc 0. Ce n’est pas un message et il ne porte aucune transaction : il représente tout l’état de départ de la chaîne, des comptes approvisionnés jusqu’au moindre paramètre de consensus. L’ensemble est engagé dans un seul hachage, et ce hachage est l’identité de la chaîne. Changez un seul solde et vous obtenez une autre chaîne.
Construit à partir d’une configuration
Une chaîne est créée hors ligne à partir d’un fichier de configuration. Il n’y a pas de transaction de genèse : la configuration est l’état. Elle définit :
- les comptes approvisionnés et leurs soldes, dont l’éventuelle trésorerie des applis qui approvisionne le pool des apps ;
- les jetons de genèse et leurs soldes : chaque chaîne possède les mêmes 14 pièces de genèse, comme ZUSD et ZBTC (jetons et marchés) ;
- les calendriers d’acquisition (vesting) ;
- les nœuds enregistrés, ou sièges de genèse : 11 sur chaque chaîne, détenus par la ZooBC Foundation, chacun avec un solde de fonctionnement de 10 ZBC sur le propre compte du nœud ;
- les paramètres de consensus, de l’intervalle entre blocs aux prix de départ, et la hauteur d’activation de chaque règle ;
- les clés qui ont un rôle, comme l’autorité de publication (versions et mises à jour), et les adresses de garde des pièces de pont (pont et les monnaies enveloppées).
Le constructeur de genèse additionne chaque crédit et refuse d’écrire une genèse dont le total dépasserait le plafond d’émission de 33 333 333,33333333 ZBC. Ce qu’il ne distribue pas devient la réserve de la coinbase, libérée sur 15 ans (offre et l’émission). Aucune coinbase n’est versée aux hauteurs 0 et 1.
Un seul hachage pour tout le départ
Le constructeur réunit tout ce qui compte dans un seul hachage de configuration. Le hachage de genèse est ensuite dérivé de la version du bloc, de sa hauteur, de son horodatage, d’un hachage précédent nul et de ce hachage de configuration. Le bloc de genèse lui-même porte une graine, une clé de producteur, une signature et un hachage précédent entièrement à zéro, et son hachage est la valeur dérivée de la configuration, pas un hachage de ses propres octets. Deux valeurs sont lues mais non engagées : total_supply et node_operating_balance.
Modifier n’importe quelle valeur engagée donne un nouveau hachage de genèse, et donc une autre chaîne.
L’identité de la chaîne
Le hachage de genèse est la seule identité d’une chaîne : il n’existe pas d’octet d’identifiant de réseau.
- Les nœuds comparent leurs hachages de genèse lorsqu’ils se connectent, et refusent un pair dont le hachage diffère.
- Chaque signature de transaction le couvre. Le signataire signe SHA3-256("ZBC-TX" ‖ hachage de genèse ‖ les octets de la transaction non signée), si bien qu’une transaction signée pour une chaîne est invalide sur toutes les autres (signatures liées à la chaîne).
- Un nœud l’indique comme
genesis_hashà/api/v1/node/info, pour qu’un portefeuille puisse savoir à quelle chaîne il s’adresse. - Un réseau de test relancé reçoit un nouveau hachage.
C’est pourquoi le devnet, le testnet et le mainnet ne partagent ni soldes ni signatures (devnet, testnet et mainnet).
Un nœud ne construit jamais lui-même une genèse : le bloc 0 doit déjà se trouver dans sa base de données au démarrage (faire tourner un nœud).
Pas de clé maîtresse
La genèse ne contient aucune clé capable de réécrire la chaîne plus tard. Les règles et les paramètres ne changent que par de nouvelles versions, qui portent les hauteurs auxquelles les règles s’appliquent, et par les votes de prix bornés des sièges du registre (votes de prix). Aucune clé ne modifie une règle, un paramètre ou un solde en signant un message, et un binaire de nœud en désaccord avec les hauteurs de règles enregistrées pour sa chaîne refuse de fonctionner. À partir de la version 0.5.8, les 121 règles de consensus sont toutes en vigueur dès la hauteur 0.