La double signature (équivocation)
L’équivocation, ou double signature, désigne le fait qu’un producteur signe deux blocs différents sur le même bloc parent. Des nœuds différents pourraient alors voir des blocs différents en premier, et le réseau pourrait se scinder pendant un moment. ZooBC y répond de trois façons : un nœud honnête ne le fait jamais, même après un plantage ; tout nœud enregistré qui voit deux blocs de ce genre peut le prouver sur la chaîne avec un EquivocationReport ; et le producteur se voit imputer un tour manqué, avec la perte de revenu et de score qui s’ensuit.
Ce qui constitue une équivocation
Quand un nœud est tiré pour produire, il construit un bloc au-dessus du sommet de la chaîne, son parent. L’équivocation consiste à signer deux blocs aux en-têtes différents sur ce même parent. Un bloc en retard n’est pas une équivocation : il ajoute seulement moins de poids à sa branche (voir le choix de branche). Produire des blocs à des hauteurs différentes n’en est pas une non plus ; chaque hauteur a son propre parent.
Un producteur honnête ne signe jamais deux fois
Un producteur retient, pour chaque parent, le bloc qu’il a signé, et conserve aussi cet enregistrement sur disque, si bien qu’un redémarrage ne le lui fait pas oublier. S’il est tiré à nouveau pour le même parent, il renvoie le bloc qu’il a déjà signé au lieu d’en produire un nouveau.
Il existe une exception délibérée. Au-delà de la limite de récupération, 3 600 secondes après le parent, une chaîne à l’arrêt doit pouvoir repartir. Un producteur peut alors signer un nouveau bloc pour ce parent, sans que cela lui soit imputé, et il renvoie ensuite ce bloc. De même, une paire de blocs dont les horodatages chevauchent la limite de récupération (exactement l’un des deux à plus de 3 600 secondes après le parent) constitue la reprise d’une chaîne à l’arrêt, pas une équivocation.
Détection
Un nœud qui reçoit deux en-têtes valablement signés d’un même producteur enregistré sur un même parent les traite comme une preuve :
- il enregistre le producteur comme menteur avéré, ce qui le place sur liste noire en tant que pair et le déconnecte, sauf si cela devait couper le nœud du réseau ;
- il soumet un EquivocationReport par parent et par producteur ;
- il transmet malgré tout les deux blocs à la validation comme d’habitude ; le choix de branche désigne le survivant, et en cas d’égalité exacte, la branche dont le sommet a le hachage le plus bas l’emporte sur chaque nœud.
L’EquivocationReport
Le rapport (transaction de type 60) porte la preuve elle-même : les deux en-têtes signés, chacun suivi de la signature de 64 octets du producteur. Avec des en-têtes de 284 octets, le corps fait 704 octets : une longueur sur 4 octets, l’en-tête 1, la signature 1, une longueur sur 4 octets, l’en-tête 2, la signature 2.
La chaîne effectue treize vérifications, dans cet ordre :
- le type de rapport est actif ;
- les frais sont exactement de 0, car le signalement est un devoir des nœuds enregistrés ;
- le corps se décode correctement, et chaque en-tête a la taille d’un en-tête signé : 204 octets, ou 284 avec la preuve de graine ;
- les deux en-têtes sont différents ;
- la clé du producteur, à l’offset 76 (en octets), est la même dans les deux ;
- le hachage du parent, à l’offset 172, est le même dans les deux ;
- les deux signatures se vérifient sous cette clé de producteur ;
- le parent est un bloc de cette chaîne ;
- la paire ne chevauche pas la limite de récupération d’une heure ;
- le rapport arrive au plus tard 720 blocs après la hauteur de l’équivocation ;
- le producteur est un nœud enregistré ;
- le rapporteur est un nœud enregistré ;
- ce producteur n’a pas déjà été pénalisé pour cette hauteur.
Affirmer avoir vu un second bloc ne prouve rien ; les deux signatures, si. Aucun vote des sièges n’est nécessaire, car chacun peut vérifier des signatures.
Le coût
Un rapport valide impute au producteur un tour manqué, une fois par producteur et par hauteur. Selon les règles décidées pour la version 0.5.8, une double signature avérée rend aussi le nœud manquant jusqu’à son prochain bloc propre : ni coinbase, ni part des frais ou de la longévité, et un score de participation en baisse. Quatre tours manqués d’affilée suspendent un nœud. Voir les tours manqués.
Aucun solde ne bouge. Le rapporteur n’est pas payé, et rien n’est prélevé sur la mise du producteur : le ZBC n’est jamais brûlé (voir pourquoi aucun ZBC n’est brûlé).