La graine du bloc (VRF)
Chaque bloc ZooBC porte une graine de 64 octets, la source d’aléa de la chaîne. Elle décide qui peut produire le bloc suivant, qui gagne la loterie coinbase, quels reçus un producteur présente et comment les pairs sont assignés les uns aux autres. À partir de la version 0.5.8, la graine est la sortie d’une fonction aléatoire vérifiable (VRF) : pour un producteur donné et une graine précédente donnée, il existe exactement une valeur valide, et une courte preuve dans l’en-tête du bloc permet à chaque nœud de la vérifier.
Pourquoi la graine ne doit pas pouvoir être choisie
Si un producteur pouvait choisir la graine de son bloc parmi plusieurs candidates, il pourrait orienter le tirage des producteurs suivant vers lui-même ou vers un complice, fausser la loterie coinbase ou décider de l’issue du pari d’une appli. Une simple signature numérique ne suffirait pas comme graine : plusieurs signatures valides peuvent exister pour un même message, si bien qu’un producteur pourrait en essayer plusieurs et garder celle qui lui convient.
Une VRF ferme cette porte. Elle fonctionne comme une signature qui n’aurait qu’un seul résultat valide : quiconque détient la clé peut calculer la sortie et une preuve, quiconque possède la clé publique peut vérifier la preuve, et toutes les preuves valides pour une même clé et une même entrée donnent la même sortie.
Comment une graine est produite
- L’entrée, appelée alpha, est le hachage SHA3-256 de la graine de 64 octets du bloc précédent (32 octets).
- Le producteur exécute ECVRF sur Ed25519, dans une variante ZooBC, avec sa clé de nœud (voir les clés de nœud).
- La sortie est la nouvelle graine de 64 octets. La preuve fait 80 octets : un point de la courbe de 32 octets, un défi de 16 octets et un scalaire de 32 octets.
- La preuve est placée dans l’en-tête du bloc, que couvre la signature du bloc : 284 octets d’en-tête sont signés (204 octets d’autres champs plus la preuve de 80 octets) et 348 octets sont hachés.
Les validateurs exigent la preuve, la vérifient sous la clé du producteur sur alpha, et refusent un bloc dont la graine n’est pas la sortie de la preuve.
Rien du nouveau bloc ne sert d’entrée : ni ses transactions, ni son horodatage. Un producteur ne peut donc pas orienter la graine en réarrangeant son bloc, et la chaîne des graines peut être vérifiée depuis n’importe quel bloc jusqu’au bloc de genèse, dont la graine ne contient que des zéros. Un nombre aléatoire issu de l’ordinateur du producteur ne pourrait être vérifié par personne : c’est pourquoi aucun n’est utilisé.
La variante ZooBC
L’ECVRF de ZooBC est une variante d’ECVRF-EDWARDS25519-SHA512-TAI. Le hachage vers la courbe n’accepte que des points candidats d’ordre premier et les utilise sans le cofacteur, et la vérification refuse en outre une preuve dont le défi ou le scalaire est nul. Une bibliothèque RFC 9381 standard donne donc des sorties différentes ; quiconque écrit un nœud ou un vérificateur doit implémenter la variante.
Pour environ une paire clé-entrée sur 15 millions (une probabilité de (15/16)^256, soit environ 6,7 × 10^-8), aucune preuve valide n’existe. Le producteur tiré ne peut alors pas produire ce bloc, et le tour passe au producteur du tour suivant.
Le seul levier restant : s’abstenir
Un producteur tiré à qui déplaît la graine que porterait son bloc n’a qu’une option : retenir le bloc. Le tour passe alors au nœud tiré suivant, 15 secondes plus tard, qui produit le bloc avec sa propre graine, tout aussi imprévisible. Retenir son bloc relance les dés une fois ; cela ne choisit jamais le résultat.
Cela a aussi un prix. Le producteur sauté compte un tour manqué et reste « manquant » jusqu’à son prochain bloc propre : il ne gagne rien et perd du score de participation (voir les tours manqués). Le bloc produit plus tard pèse moins dans le choix de branche. L’analyse de conception de la preuve de participation estime à environ a puissance n la probabilité qu’un adversaire détenant une fraction a des sièges puisse prédire la graine n blocs à l’avance : avec un tiers des sièges, environ 1 sur 27 pour trois blocs.
Deux règles supplémentaires ferment les portes dérobées :
- Un changement de clé de nœud ne prend effet que 120 blocs (30 minutes) après le bloc qui l’inclut ; un producteur ne peut donc pas orienter la graine suivante d’un complice au moyen d’un changement de clé signé à l’avance.
- Le producteur du bloc précédent est rétrogradé dans le tirage suivant, si bien qu’aucun nœud ne détient à la fois le contenu d’un bloc et la graine qui le règle tant qu’un autre nœud est en mesure de répondre (voir le producteur précédent).
Ce que décide la graine
- le tirage des producteurs du bloc suivant (voir le tirage) ;
- les gagnants de la loterie coinbase ;
- les reçus qu’un producteur doit présenter (voir les reçus) ;
- la topologie des pairs, à partir de la graine du premier bloc de chaque période de 40 blocs ;
- les tirages aléatoires des applis.
Les graines sont publiques : chacun peut les lire sur la chaîne et refaire chacun de ces tirages.