Doppia firma (equivocazione)
L'equivocazione, o doppia firma, si ha quando un produttore firma due blocchi diversi sullo stesso blocco padre. Nodi diversi potrebbero allora vedere per primi blocchi diversi, e la rete potrebbe dividersi per un po'. ZooBC la affronta in tre modi: un nodo onesto non lo fa mai, nemmeno dopo un crash; qualsiasi nodo registrato che vede due blocchi di questo tipo può dimostrarlo sulla catena con un EquivocationReport; e al produttore viene addebitato un turno mancato, con la perdita di reddito e di punteggio che ne consegue.
Che cosa conta come equivocazione
Quando un nodo viene estratto per produrre, costruisce un blocco sopra la punta attuale della catena, il suo padre. Equivocazione significa firmare due blocchi con intestazioni diverse su quello stesso padre. Un blocco in ritardo non è equivocazione: aggiunge solo meno peso al suo ramo (vedi scelta del fork e difficoltà cumulativa). Nemmeno produrre blocchi ad altezze diverse è equivocazione; ogni altezza ha il proprio padre.
Un produttore onesto non firma mai due volte
Un produttore ricorda, per ogni padre, il blocco che ha firmato, e conserva questa informazione anche su disco, così un riavvio non gliela fa dimenticare. Se viene estratto di nuovo per lo stesso padre, reinvia il blocco che ha già firmato invece di produrne uno nuovo.
C'è un'eccezione voluta. Oltre il limite di recupero, 3.600 secondi dopo il padre, una catena che si è fermata deve poter ripartire. Un produttore può allora firmare un nuovo blocco per quel padre, senza che gli venga addebitato, e in seguito reinvia quel blocco. Allo stesso modo, una coppia di blocchi i cui timestamp stanno a cavallo del limite di recupero (esattamente uno dei due più di 3.600 secondi dopo il padre) è la ripresa di una catena ferma, non un'equivocazione.
Rilevamento
Un nodo che riceve da un produttore registrato due intestazioni firmate validamente sullo stesso padre le tratta come una prova:
- registra il produttore come bugiardo accertato, il che lo mette nella lista nera come peer e lo disconnette, a meno che questo non isoli il nodo dalla rete;
- invia un EquivocationReport per ogni coppia di padre e produttore;
- passa comunque entrambi i blocchi alla validazione come di consueto; la scelta del fork decide quale sopravvive, e in caso di parità esatta vince su ogni nodo il ramo con l'hash di punta più basso.
L'EquivocationReport
Il report (tipo di transazione 60) contiene la prova stessa: le due intestazioni firmate, ciascuna seguita dalla firma di 64 byte del produttore. Con intestazioni di 284 byte il corpo è di 704 byte: una lunghezza di 4 byte, l'intestazione 1, la firma 1, una lunghezza di 4 byte, l'intestazione 2, la firma 2.
La catena verifica tredici condizioni, in quest'ordine:
- che il tipo di report sia attivo;
- che la commissione sia esattamente 0, perché segnalare è un compito dei nodi registrati;
- che il corpo sia decodificabile e che ogni intestazione abbia la dimensione di un'intestazione firmata: 204 byte, o 284 con la prova del seed;
- che le due intestazioni siano diverse;
- che la chiave del produttore, all'offset 76, sia la stessa in entrambe;
- che l'hash del padre, all'offset 172, sia lo stesso in entrambe;
- che entrambe le firme siano valide per quella chiave del produttore;
- che il padre sia un blocco di questa catena;
- che la coppia non stia a cavallo del limite di recupero di un'ora;
- che il report arrivi non oltre 720 blocchi dopo l'altezza dell'equivocazione;
- che il produttore sia un nodo registrato;
- che chi segnala sia un nodo registrato;
- che a questo produttore non sia già stata addebitata quell'altezza.
Dichiarare di aver visto un secondo blocco non dimostra nulla; le due firme sì. Non serve alcun voto dei seggi, perché chiunque può verificare delle firme.
Il costo
Un report valido addebita al produttore un turno mancato, una sola volta per produttore e per altezza. Secondo le regole decise per la versione 0.5.8, una doppia firma dimostrata rende inoltre il nodo mancante fino al suo prossimo blocco: nessuna quota di coinbase, commissioni o longevità, e un punteggio di partecipazione in calo. Quattro turni mancati di fila sospendono un nodo. Vedi turni mancati, sospensione ed espulsione.
Nessun saldo si muove. Chi segnala non viene pagato, e nulla viene tolto allo stake del produttore: ZBC non viene mai bruciato (vedi ZBC non viene mai bruciato).