La chaîne dorsale
Chaque nœud ZooBC conserve deux chaînes. La chaîne principale produit un bloc toutes les 15 secondes et transporte les transactions. À côté d’elle tourne la dorsale : un bloc par jour sur le mainnet, sans aucune transaction. Un bloc dorsal consigne ce dont le registre dans son ensemble se porte garant, à savoir un point de contrôle de la chaîne principale, les clés de nœud qui ont rejoint ou quitté le registre et les manifestes des derniers instantanés, et il nécessite les signatures de deux tiers des sièges. La dorsale devient ainsi l’ancre de la finalité et le point de départ de chaque nouveau nœud.
Ce que contient un bloc dorsal
- Un point de contrôle. Chaque bloc dorsal nomme un bloc de référence de la chaîne principale assez profond pour être réglé : 760 blocs (3 heures 10 minutes) sous le sommet principal au moment où le bloc dorsal est produit, et jamais plus bas que la référence du bloc dorsal précédent. Il copie la racine de Merkle de ce bloc, et son hachage de charge utile s’engage sur le hachage propre et la difficulté cumulée du bloc de référence, de sorte que le point de contrôle fixe un bloc exact, et pas seulement une hauteur.
- Les changements de clés publiques. Les clés de nœud ajoutées au registre ou retirées depuis le bloc dorsal précédent.
- Les manifestes d’instantanés. Pour chaque instantané récent de l’état de la chaîne principale : le hachage du fichier entier, le hachage de chaque segment, la hauteur de référence, une expiration et le hachage de genèse de la chaîne principale (voir instantanés et synchronisation rapide).
La dorsale produit un bloc par spine_smithing_period : 86 400 secondes, soit un par jour, sur le mainnet et le testnet, et 3 600 secondes, soit un par heure, sur le devnet, où la profondeur du point de contrôle est de 80 blocs (20 minutes).
Cosigné par deux tiers des sièges
Un bloc dorsal porte une signature agrégée : un compteur de 4 octets suivi, pour chaque signataire, de sa clé de nœud de 32 octets et de sa signature Ed25519 de 64 octets, toutes portant sur les mêmes 204 octets d’en-tête. Le hachage du bloc est le SHA3-256 des octets d’en-tête et du champ de signature entier.
Le nombre de signatures requis est :
required = max(spine_min_signatures, ceil(n × 67 / 100))
où n est la taille de la liste des signataires. Avec 11 sièges, 11 × 67 / 100 = 7,37, arrondi à l’entier supérieur, soit 8. L’arrondi se fait vers le haut à dessein : 7 serait inférieur aux deux tiers de 11.
La dorsale compte chaque siège de sa liste des signataires, suspendu ou non. C’est le seul décompte aux deux tiers dans lequel les sièges suspendus comptent encore, de sorte qu’un point de contrôle parle toujours au nom de deux tiers de l’ensemble des sièges (voir règles des deux tiers).
Si trop de sièges ont disparu et que la dorsale s’arrête, le seuil se relâche en une seule étape : après 3 périodes de dorsale sans bloc dorsal stocké (3 jours sur le mainnet), plus de la moitié suffit, soit 6 sur 11. Aucun des deux seuils ne peut descendre sous spine_min_signatures, qui vaut 5 sur toutes les chaînes. Exiger les 11 signatures permettrait à un seul siège manquant d’arrêter la dorsale.
Les signataires vérifient avant de signer
Un siège ne signe jamais à l’aveugle. Avant de cosigner une proposition, chaque signataire vérifie que :
- les changements de clés sont identiques aux changements de son propre registre sur le même intervalle ;
- chaque manifeste pour sa chaîne est identique à son propre instantané, hachage pour hachage ; un signataire qui n’a pas l’instantané s’abstient ;
- le bloc de référence est assez profond et ne recule pas ;
- il n’a pas déjà cosigné un autre bloc à cette hauteur de dorsale.
Lorsqu’un nœud stocke un bloc dorsal, il en vérifie à nouveau le contenu, ainsi que le tirage du producteur et la difficulté du bloc.
Qui propose, et quand
Le producteur de la dorsale est tiré dans la liste des signataires : c’est le signataire d’indice LE64(SHA3-256(seed ‖ "spine" ‖ round)) mod n, où la graine est celle du bloc principal à la hauteur de référence du bloc dorsal précédent, de sorte que chaque validateur peut refaire le tirage. Sur le mainnet, un tour de dorsale dure 100 secondes, la fenêtre de création est de 300 secondes et la tolérance de 150 secondes ; un signataire refuse une proposition plus ancienne que sa fenêtre de collecte de 60 secondes. Un bloc dorsal qui arrive plus tôt que le précédent plus la période, moins la tolérance, est refusé.
Les blocs dorsaux ne sont jamais vides. Entre des dorsales concurrentes, celle qui porte le plus de signatures l’emporte. Un nœud pèse une dorsale concurrente avant de revenir en arrière sur quoi que ce soit, ne ramène jamais sa dorsale en deçà de l’épingle de version, et restaure sa propre dorsale si l’autre ne parvient pas à s’appliquer.
À quoi sert la dorsale
- La finalité. Aucun nœud ne réorganise la chaîne principale sous le dernier point de contrôle dorsal stocké (voir finalité et retour arrière).
- La synchronisation rapide. Un nouveau nœud synchronise d’abord la dorsale : ses manifestes indiquent quel instantané récupérer, et ses changements de clés indiquent à quelles clés de nœud se fier (voir instantanés et synchronisation rapide).
- L’archive. C’est le stockage décentralisé, et non chaque nœud, qui conserve chaque instantané depuis le bloc zéro, si bien que n’importe qui peut remonter la dorsale jusqu’à n’importe quel instantané passé et reconstruire l’état de ce moment-là (voir archive et la lecture du passé).
La dorsale est conservée par chaque nœud, pas par la ZooBC Foundation, et rien ne s’y échange.