Round, tempi e finestre
ZooBC punta a un blocco ogni 15 secondi. Dopo ogni blocco, il tempo viene diviso in round di 15 secondi, e l'estrazione designa un produttore per round. Il timestamp di un blocco lo colloca in un round, e solo un nodo estratto per quel round o per il round precedente può produrlo. La regola dà alla catena un ritmo costante e garantisce che un produttore assente ritardi il blocco successivo di 15 secondi, mai di più.
Round e obiettivi
Sia P il timestamp del blocco precedente. Il round r ha il suo obiettivo a P + 15 × r: il round 1 a 15 secondi dal blocco precedente, il round 2 a 30 secondi, il round 3 a 45 secondi, e così via. Il produttore del round 1 punta a datare il suo blocco esattamente all'obiettivo. Se resta silenzioso, il blocco lo produce il produttore del round 2, puntando a 30 secondi; e così via lungo la lista.
Le altezze non vengono mai saltate. Quando un produttore è assente, il blocco successivo arriva semplicemente 15 secondi più tardi, alla stessa altezza, dal produttore seguente nella lista. Ogni nodo estratto prima del produttore effettivo conta un turno mancato (vedi turni mancati, sospensione ed espulsione).
Due round per ogni produttore
Un produttore estratto nel round i può produrre un blocco del round i o del round i + 1. Quindi un nodo del round 1 in ritardo può ancora consegnare durante il round 2, mentre anche il nodo del round 2 ne ha diritto. In ogni momento due nodi estratti hanno diritto a produrre, e la catena non resta mai in attesa di un singolo nodo. Né aspetta che qualcuno venga sospeso: la sospensione richiede quattro turni mancati di fila e toglie un nodo solo dalle estrazioni future.
In quale round cade un timestamp
Il round di un blocco con timestamp T è:
round(T) = 1 + floor((T − P − 15 + 7) / 15) (and never less than 1)
Ogni round ha anche una finestra di accettazione di 14 secondi, da 7 secondi prima del suo obiettivo a poco meno di 7 secondi dopo. In secondi interi:
| Round | Obiettivo | Secondi che la formula assegna | Finestra di accettazione (obiettivo ± 7 s) |
|---|---|---|---|
| 1 | P + 15 | fino a P + 22 | da P + 8 a P + 21 |
| 2 | P + 30 | da P + 23 a P + 37 | da P + 23 a P + 36 |
| 3 | P + 45 | da P + 38 a P + 52 | da P + 38 a P + 51 |
| 4 | P + 60 | da P + 53 a P + 67 | da P + 53 a P + 66 |
L'ultimo secondo che la formula assegna a ogni round (P + 22, P + 37, P + 52, ...) cade un secondo oltre la finestra di quel round. I validatori verificano il timestamp di un blocco rispetto alla finestra del suo round con 2 secondi di tolleranza, quindi anche questi secondi di giuntura vengono accettati.
Il round conta due volte. Decide chi può produrre il blocco, e limita il peso del blocco nella scelta del fork: un blocco non viene mai pesato come migliore del round in cui cade il suo timestamp, quindi un produttore estratto nel round 2 che appone un timestamp nel round 3 non pesa più di un blocco del round 3.
Regole dell'orologio che ogni nodo applica
- Un blocco datato meno di 13 secondi dopo il suo padre viene rifiutato perché prodotto troppo in fretta (l'intervallo di 15 secondi meno 2 secondi di tolleranza). Datare un blocco subito, appena ci si accorge di un vuoto, è quindi impossibile.
- Un blocco datato più di 7.200 secondi (2 ore) avanti rispetto all'orologio di un nodo viene rifiutato da quel nodo finché il suo orologio non lo raggiunge.
- Dopo uno stallo di oltre un'ora (il limite di recupero di 3.600 secondi), un blocco viene comunque accettato se proviene dal produttore che l'estrazione si aspetta, così una catena ferma può ripartire.
Le finestre in gioco sono due. Un produttore estratto nel round i deve datare il suo blocco entro la finestra di creazione di quel round, da 7 secondi prima dell'obiettivo del round a 27 secondi dopo, che si estende nel round successivo. I validatori richiedono inoltre che il timestamp cada nella finestra di accettazione del round in cui si trova, con i 2 secondi di tolleranza.
Politica di temporizzazione locale
Due tempistiche sono una politica propria di ciascun nodo, non regole di consenso. Il produttore estratto per primo invia il suo blocco a P + 15; gli altri inviano il loro alla fine della finestra del proprio round meno 5 secondi (e mai prima di P + 15). E circa una volta al secondo ogni nodo applica, tra i blocchi candidati che detiene, quello con la posizione più bassa la cui finestra è aperta.
Per confronto, Bitcoin punta a un blocco ogni dieci minuti. Il ritmo di 15 secondi di ZooBC è lo stesso su ogni catena ZooBC: un giorno equivale a 5.760 blocchi (vedi blocchi e tempo).