Wiki di ZooBC
Proof of Participation

Round prioritari, blocchi vuoti e il produttore precedente

Due regole decidono che cosa un produttore estratto può mettere nel suo blocco, e quando. Solo i produttori dei primi dieci round possono includere transazioni; i produttori successivi possono produrre solo blocchi vuoti. E il nodo che ha prodotto il blocco precedente viene retrocesso nell'estrazione successiva, quindi produce il blocco seguente solo come riserva tardiva. Entrambe le regole mantengono la catena in movimento qualunque cosa accada, lasciando le scelte importanti ai produttori che l'estrazione ha messo in testa.

Round prioritari

Ogni produttore ha una posizione: l'indice, contato da 0, dell'estrazione che lo ha designato. Il parametro max_priority_blocksmiths vale 10, quindi:

  • le posizioni da 0 a 9, cioè i round da 1 a 10, possono contenere transazioni;
  • dalla posizione 10 in poi (dal round 11 in avanti), il blocco non deve contenere transazioni. Può comunque contenere ricevute.

La regola viene verificata quando il blocco viene prodotto, nel pool dei blocchi candidati di ogni nodo, e da ogni validatore. Un blocco tardivo che include transazioni viene rifiutato.

I round da 1 a 10 possono contenere transazioni; i round da 11 a 14 producono solo blocchi vuoti, ricevute ammesse. Un produttore del round 12 produce un blocco vuoto e la coinbase viene comunque pagata.
I round da 1 a 10 possono contenere transazioni; i round da 11 a 14 producono solo blocchi vuoti, ricevute ammesse. Un produttore del round 12 produce un blocco vuoto e la coinbase viene comunque pagata.

La regola bilancia due obiettivi. La liveness non dipende mai dal fatto che i produttori in cima siano online: anche se molti nodi estratti sono fermi, qualcuno più in basso nella lista fa crescere la catena. Ma il diritto di scegliere le transazioni resta ai produttori con la priorità più alta, quindi un nodo in posizione bassa non guadagna nulla affrettandosi a mettere sulla catena un blocco pieno, o un blocco di transazioni scelte a mano.

Un blocco vuoto è un blocco completo

Un blocco vuoto è perfettamente valido. Contiene le ricevute che il suo produttore ha guadagnato, quindi il lavoro di inoltro del produttore conta comunque per il suo punteggio di partecipazione. Paga inoltre la coinbase prevista per il suo momento come qualsiasi altro blocco: dalla versione 0.5.8 la coinbase di ogni blocco deve corrispondere esattamente al piano, così la lotteria coinbase non salta mai un blocco (vedi supply ed emissione).

Le transazioni in sospeso non vanno perse. Aspettano nei pool dei nodi il blocco successivo il cui produttore può includerle.

Il produttore precedente viene retrocesso

Il produttore del blocco N resta nell'estrazione per il blocco N+1, ma le sue estrazioni contano come non anteriori al round 10, l'ultimo round che può contenere transazioni. Il peso del suo blocco è limitato allo stesso modo: nella formula del peso il suo numero di estrazioni k non è mai inferiore a 10, quindi se produce davvero il blocco N+1 come riserva, il blocco aggiunge al massimo un decimo del peso di un blocco di primo round (vedi scelta del fork e difficoltà cumulativa). In pratica il blocco N+1 lo produce un altro nodo estratto, ogni volta che uno è in grado di farlo.

La retrocessione non è una sanzione. Un'estrazione retrocessa non viene mai conteggiata come turno mancato, e il nodo mantiene il suo seggio e il suo punteggio.

L'estrazione per il blocco N+1: il produttore precedente D, estratto per primo, viene spostato al round 10; il nodo B, estratto per secondo, produce il blocco. D non viene mai rimosso, quindi la catena non si ferma mai.
L'estrazione per il blocco N+1: il produttore precedente D, estratto per primo, viene spostato al round 10; il nodo B, estratto per secondo, produce il blocco. D non viene mai rimosso, quindi la catena non si ferma mai.

Perché non lasciarlo produrre due volte di fila?

Il seed del blocco N+1 decide estrazioni che dipendono dal blocco N, come i risultati di giochi e scommesse on-chain (vedi seed del blocco (VRF) e app su ZooBC). Un nodo che avesse prodotto entrambi i blocchi avrebbe in mano il contenuto di un blocco e il seed che lo decide. La regola è che nessuno dovrebbe possedere sia una scommessa sia il seed che la risolve, finché un altro nodo è in grado di rispondere.

Perché non toglierlo dall'estrazione?

Togliere il produttore precedente farebbe alternare rigidamente i due nodi di una catena che ne ha due, e lascerebbe una catena con un solo nodo funzionante del tutto incapace di produrre. Retrocesso anziché rimosso, il produttore precedente resta il produttore di ultima istanza: se nessun altro consegna, può comunque produrre il blocco dal round 10, il cui obiettivo è 150 secondi dopo il blocco precedente. La catena non si ferma mai a causa di questa regola.

Vedi anche