Choix de branche et difficulté cumulée
Il arrive que deux versions de la chaîne s’affrontent pendant un moment, par exemple lorsque le réseau est scindé durant quelques minutes. Chaque nœud ZooBC suit alors la branche dont la difficulté cumulée est la plus grande : un total cumulé des poids des blocs, dans lequel le bloc d’un producteur tiré tôt pèse plus qu’un bloc tardif. La règle est la même arithmétique sur chaque nœud, si bien que le réseau converge sans que personne ne choisisse de vainqueur.
Plus lourde, pas plus longue
Chaque bloc ajoute au total cumulé un montant d’autant plus faible que son producteur figurait loin dans le tirage de cette hauteur. Dans sa forme la plus simple, un bloc ajoute 1 000 000 divisé par le rang du producteur dans le tirage : un bloc du premier producteur tiré ajoute 1 000 000, un bloc du troisième environ 333 333.
Une chaîne de blocs à l’heure pèse donc plus lourd qu’une chaîne dont les producteurs n’ont cessé de manquer leur tour, même lorsque la seconde est plus longue. Trois blocs du premier tour pèsent 3 000 000 ; quatre blocs du troisième tour pèsent environ 1 333 332.
Les autres solutions ne fonctionneraient pas. Compter les transactions permettrait à un producteur de gonfler son bloc pour gagner. Le « premier vu » diffère d’un nœud à l’autre à cause des délais du réseau, si bien que les nœuds pourraient rester divisés pour toujours. Et aucune autorité ne désigne une branche comme officielle.
Le poids exact d’un bloc
À partir de la version 0.5.8, l’incrément d’un bloc est :
increment = floor(1,000,000 × |S| / (k × |A|))
- S est l’ensemble de tirage au bloc précédent : les nœuds actifs moins les nœuds suspendus.
- A est le registre actif complet au bloc précédent. La part |S| / |A| n’est jamais supérieure à 1.
- k compte les tirages jusqu’à la dernière apparition du producteur dans les tours allant jusqu’au tour du bloc : 1 pour le producteur tiré en premier qui horodate à l’heure, 3 pour un producteur désigné par le troisième tirage. (Si le producteur n’y figure pas, on retient sa première apparition dans les 2 × n premiers tirages, n étant le nombre de nœuds de l’ensemble de tirage, et à défaut une position dans l’ordre des hachages.)
Deux planchers empêchent un bloc de prétendre à plus qu’il ne mérite. k n’est jamais inférieur au tour dans lequel tombe l’horodatage du bloc, de sorte qu’un horodatage tardif ne peut pas conserver le poids d’un tour précoce (voir les tours et leur cadence). Et pour le producteur du bloc précédent, k n’est jamais inférieur à son tour de rétrogradation, 10 (voir le producteur précédent).
La part de l’ensemble de tirage compte quand le réseau se scinde. Si chaque côté d’une scission suspend les nœuds qu’il n’entend pas, les deux côtés ajouteraient sinon 1 000 000 par bloc à l’heure et paraîtraient aussi lourds l’un que l’autre. Avec la part, un côté qui tourne sur 3 des 11 sièges ajoute au plus 272 727 par bloc, contre 727 272 pour le côté qui en a 8. Bloc pour bloc, le côté qui détient le plus de sièges est le plus lourd.
Chaque bloc porte sa difficulté cumulée sous forme d’une suite de chiffres décimaux. Chaque validateur la recalcule et refuse un bloc qui l’indique incorrectement. Deux totaux se comparent d’abord par leur longueur, puis chiffre par chiffre.
Le score de participation ne joue aucun rôle dans tout cela : le poids tient compte des positions dans le tirage et de l’ensemble de tirage, pas des scores.
Égalités exactes
Les égalités exactes se produisent, par exemple lorsque deux branches de même longueur sont toutes deux composées de blocs du premier tour produits à l’heure. À partir de la version 0.5.8, les hachages des blocs au sommet des deux branches sont comparés en tant qu’octets, et le hachage le plus bas l’emporte. Un nœud bascule vers une branche de poids égal dont le hachage de sommet est inférieur au sien, conserve la sienne dans le cas contraire, et ne demande l’avis de personne. Chaque nœud applique la même comparaison aux deux mêmes hachages, si bien que l’ensemble du réseau converge d’un coup.
Peser une branche avant de basculer
L’affirmation d’un pair selon laquelle sa branche est plus lourde ne prouve rien par elle-même. Un nœud pèse une branche concurrente avant de toucher à sa propre chaîne :
- Il trouve le dernier bloc commun aux deux chaînes.
- Il récupère par pages la branche qui suit ce bloc, en vérifiant la signature de chaque en-tête et les liens entre les blocs.
- Il recalcule le poids de chaque bloc en rejouant le registre et les suspensions propres à cette branche à partir du bloc commun, puisqu’ils peuvent différer de l’autre côté d’une scission.
- Il s’arrête dès que la branche est plus lourde que sa propre chaîne, et c’est seulement alors qu’il revient en arrière et l’applique. Une branche qui finit plus légère, ou qui ne parvient pas à prendre le dessus dans un nombre borné de blocs, est refusée sans aucun retour arrière.
Un pair dont la difficulté annoncée diffère de la valeur recalculée est enregistré comme ayant menti.
Les retours arrière ont des limites strictes : jamais plus de 720 blocs (3 heures) sur le mainnet, et jamais en deçà du dernier point de contrôle cosigné sur la chaîne dorsale. Voir la finalité et le retour arrière.
Nœuds à la traîne et sondages des pairs
Un nœud dont le sommet date de plus de 7 200 secondes (2 heures) ne fait pas confiance au premier pair venu qui prétend être en avance : il suit le sommet que signalent au moins les deux tiers d’un échantillon de pairs enregistrés. Les autres sondages de pairs qu’un nœud peut effectuer, pour confirmer une branche plus lourde ou vérifier son état de santé, relèvent de la politique locale, pas du consensus.