Wiki di ZooBC
Proof of Participation

L'estrazione: chi produce il prossimo blocco

Nel Proof of Participation nessuno fa a gara per produrre un blocco. Per ogni nuova altezza, un'estrazione casuale sul registro dei nodi designa i produttori in ordine: la prima estrazione designa il produttore del round 1, la seconda il produttore del round 2, e così via. Ogni nodo esegue la stessa estrazione sugli stessi dati e ottiene la stessa lista, quindi ogni nodo sa chi può produrre il blocco successivo e rifiuta un blocco proveniente da chiunque altro.

Una lotteria che tutti possono ripetere

Un'estrazione equa ha bisogno di una casualità che nessuno controlla e che tutti possono riprodurre. ZooBC la prende dal blocco precedente. Ogni blocco porta un seed di 64 byte, un valore che il suo produttore non può scegliere (vedi seed del blocco (VRF)). Il seed avvia un generatore di numeri pseudocasuali, e ogni numero prodotto dal generatore sceglie una voce dalla lista dei nodi che possono essere estratti.

Poiché il seed di un blocco esiste solo quando quel blocco esiste, nessuno conosce in anticipo l'ordine per il blocco successivo: di norma l'ordine è noto solo con un blocco di anticipo. (Un attaccante che detiene molti seggi può a volte vedere più avanti; vedi seed del blocco (VRF).) E poiché ogni nodo ha lo stesso blocco precedente e lo stesso registro, ogni nodo calcola la stessa lista. Non c'è alcun enigma da risolvere, nessun turno pubblicato e nessun coordinatore.

Il seed del blocco precedente viene sottoposto a hash con il tag zbc-blocksmith e alimenta un generatore che designa il produttore di ogni round; ogni nodo calcola la stessa lista.
Il seed del blocco precedente viene sottoposto a hash con il tag zbc-blocksmith e alimenta un generatore che designa il produttore di ogni round; ogni nodo calcola la stessa lista.

La lista da cui si estrae

L'estrazione sceglie dall'insieme selezionabile:

  • il registro attivo al blocco precedente, cioè i nodi ammessi (registrati); i nodi in coda non ne fanno parte;
  • ordinato per id del nodo, dal più basso al più alto (l'id di un nodo è ricavato dai primi 8 byte della sua chiave del nodo);
  • meno ogni nodo con una sospensione in corso (vedi turni mancati, sospensione ed espulsione). Se toglierli non lasciasse nessuno, si usa invece l'intero insieme attivo.

Se ogni nodo attivo è sospeso, il miglior nodo in coda che ha mantenuto la sua presenza viene aggiunto come candidato alla ripresa (vedi coda), così che la catena possa sempre ripartire; un blocco prodotto da lui lo ammette subito.

I blocchi vengono giudicati rigorosamente rispetto al registro com'era al blocco precedente, senza ripiegare su nessun'altra altezza. Un blocco prodotto da un nodo che non è stato estratto per il suo round viene rifiutato da ogni nodo.

Il generatore

La ricetta esatta, che ogni implementazione deve seguire bit per bit:

h = SHA3-256("zbc-blocksmith" ‖ seed of the previous block)
v = bytes 24 to 31 of h, read as a big-endian 64-bit number
Splitmix64(v) seeds a xoroshiro128+ generator
each draw: r = the next non-negative 63-bit number
the draw names entry (r mod n) of the selectable set, n = its size

L'estrazione 1 designa il produttore del round 1, l'estrazione 2 il produttore del round 2, e così via (vedi round, tempi e finestre). Le estrazioni sono indipendenti, quindi lo stesso nodo può comparire più di una volta nella stessa lista.

Il tag zbc-blocksmith tiene questa estrazione separata dalle altre scelte casuali ricavate dai seed dei blocchi, ognuna delle quali usa il proprio tag: zbc-coinbase per la lotteria coinbase, zbc-receipt e zbc-receipt-datum per le ricevute, zbc-topology-v2 per la topologia dei peer e zbc-apps per le app.

Ogni seggio ha la stessa possibilità

Ogni estrazione sceglie ogni voce dell'insieme selezionabile con la stessa probabilità. Nient'altro entra in gioco: non l'hardware del nodo, non il saldo del suo proprietario, non il suo stake e nemmeno il suo punteggio di partecipazione. Un operatore che detiene 3 seggi attivi su 30 produce circa un blocco su dieci.

Questo è il primo obiettivo di progetto del Proof of Participation: un potere di produzione dei blocchi uniforme. L'unica via per avere più potere è avere più seggi, e i seggi arrivano solo attraverso la coda, un'ammissione alla volta, al ritmo fissato dal protocollo (vedi ritmo di ammissione). Tenere il punteggio fuori dall'estrazione è una scelta deliberata: un nodo con un punteggio alto guadagna di più, ma non produce più blocchi, non sceglie più seed e non ha più occasioni per escludere transazioni.

Due affinamenti

Vedi anche