Il seed del blocco (VRF)
Ogni blocco ZooBC porta un seed di 64 byte, la fonte di casualità della catena. Decide chi può produrre il blocco successivo, chi vince la lotteria coinbase, quali ricevute un produttore presenta e come i peer vengono assegnati gli uni agli altri. Dalla versione 0.5.8 il seed è l'output di una funzione casuale verificabile (VRF): per un dato produttore e un dato seed precedente esiste esattamente un valore valido, e una breve prova nell'intestazione del blocco permette a ogni nodo di verificarlo.
Perché il seed non deve poter essere scelto
Se un produttore potesse scegliere il seed del suo blocco tra più candidati, potrebbe orientare l'estrazione successiva dei produttori verso sé stesso o un complice, sbilanciare la lotteria coinbase o decidere l'esito di una scommessa di un'app. Una semplice firma digitale non basterebbe come seed: per lo stesso messaggio possono esistere più firme valide, quindi un produttore potrebbe provarne diverse e tenere quella che preferisce.
Una VRF chiude questa porta. Funziona come una firma che ha un solo risultato valido: chi detiene la chiave può calcolare l'output e una prova, chiunque abbia la chiave pubblica può verificare la prova, e ogni prova valida per la stessa chiave e lo stesso input dà lo stesso output.
Come si produce un seed
- L'input, chiamato alpha, è l'hash SHA3-256 del seed di 64 byte del blocco precedente (32 byte).
- Il produttore esegue ECVRF su Ed25519, in una variante ZooBC, con la sua chiave del nodo (vedi chiavi di un nodo).
- L'output è il nuovo seed di 64 byte. La prova è di 80 byte: un punto della curva di 32 byte, una sfida di 16 byte e uno scalare di 32 byte.
- La prova va nell'intestazione del blocco, coperta dalla firma del blocco: vengono firmati 284 byte di intestazione (204 byte di altri campi più la prova di 80 byte) e sottoposti a hash 348 byte.
I validatori richiedono la prova, la verificano con la chiave del produttore su alpha e rifiutano un blocco il cui seed non sia l'output della prova.
Nulla del nuovo blocco è un input: né le sue transazioni, né il suo timestamp. Un produttore non può quindi orientare il seed riordinando il proprio blocco, e la catena dei seed può essere verificata da qualsiasi blocco fino al blocco genesi, il cui seed è tutto a zero. Un numero casuale generato dal computer del produttore non potrebbe essere verificato da nessuno, ed è per questo che non se ne usa alcuno.
La variante ZooBC
L'ECVRF di ZooBC è una variante di ECVRF-EDWARDS25519-SHA512-TAI. L'hash verso la curva accetta solo punti candidati di ordine primo e li usa senza il cofattore, e la verifica rifiuta anche una prova la cui sfida o il cui scalare sia zero. Una libreria RFC 9381 standard dà quindi output diversi; chi scrive un nodo o un verificatore deve implementare la variante.
Per circa una coppia di chiave e input su 15 milioni (una probabilità di (15/16)^256, circa 6,7 × 10^-8) non esiste alcuna prova valida. Il produttore estratto non può allora produrre quel blocco, e il turno passa al produttore del round successivo.
L'unica leva rimasta: astenersi
Un produttore estratto a cui non piace il seed che il suo blocco porterebbe ha una sola opzione: trattenere il blocco. Il turno passa allora al nodo estratto successivo, 15 secondi più tardi, che produce il blocco con il proprio seed, altrettanto imprevedibile. Trattenere il blocco rilancia i dadi una volta; non sceglie mai il risultato.
E ha anche un prezzo. Il produttore saltato conta un turno mancato ed è «mancante» fino al suo prossimo blocco, senza guadagnare nulla e perdendo punteggio di partecipazione (vedi turni mancati, sospensione ed espulsione). Il blocco successivo pesa meno nella scelta del fork. L'analisi di progetto del Proof of Participation stima la probabilità che un avversario che detiene una frazione a dei seggi possa prevedere il seed con n blocchi di anticipo in circa a elevato alla n: con un terzo dei seggi, circa 1 su 27 per tre blocchi.
Due ulteriori regole chiudono le porte laterali:
- Un cambio di chiave del nodo ha effetto solo 120 blocchi (30 minuti) dopo il blocco che lo include, così un produttore non può orientare il prossimo seed di un complice con una rotazione della chiave firmata in anticipo.
- Il produttore del blocco precedente viene retrocesso nell'estrazione successiva, così nessun nodo detiene sia il contenuto di un blocco sia il seed che lo decide, finché un altro nodo è in grado di rispondere (vedi round prioritari, blocchi vuoti e il produttore precedente).
Che cosa decide il seed
- l'estrazione dei produttori per il blocco successivo (vedi estrazione);
- i vincitori della lotteria coinbase;
- le ricevute che un produttore deve presentare (vedi ricevute e topologia della rete);
- la topologia dei peer, dal seed del primo blocco di ogni periodo di 40 blocchi;
- le estrazioni casuali delle app.
I seed sono pubblici: chiunque può leggerli dalla catena e ripetere ognuna di queste estrazioni.