Wiki di ZooBC
Sicurezza e architettura

Finalità e rollback

Un blocco su ZooBC diventa definitivo in due modi. Quando si trova a più di 720 blocchi (3 ore) di profondità, nessun nodo che resta al passo con la rete ne farà rollback. E quando un blocco spine co-firmato da due terzi dei seggi lo indica, o indica un blocco successivo, come proprio checkpoint, nessun nodo si riorganizzerà più al di sotto di esso, qualunque peso dichiari un ramo concorrente. Un nodo che si ritrova isolato dalla parte sbagliata di questi limiti non ci resta: si dichiara bloccato (wedged) e si ricostruisce dalla rete.

Rollback, entro un limite rigido

I nodi ZooBC seguono il ramo più pesante (vedi scelta del fork e difficoltà cumulativa). Quando un nodo viene a sapere di un ramo più pesante, fa rollback dei propri blocchi recenti fino al punto in cui i due rami si separano, poi applica i blocchi dell'altro ramo, verificandoli uno per uno. Un rollback riporta ogni tabella di stato all'altezza di destinazione a partire da righe versionate, compresa la coinbase dei blocchi rimossi.

Quel rollback ha un limite rigido, max_rollback_height: 720 blocchi su mainnet, 3 ore a 15 secondi per blocco, e 60 blocchi (15 minuti) su devnet. Un ramo che richiederebbe un rollback più profondo viene rifiutato, qualunque sia il suo peso.

Il limite è sicuro perché un nodo non fa mai rollback alla cieca. Scarica un ramo concorrente e lo pesa prima di toccare la propria catena: trova il vero punto di separazione, verifica la profondità prima di scaricare qualsiasi cosa, pesa il ramo pagina per pagina, rinuncia dopo un numero limitato di tentativi e fa rollback solo quando è dimostrato che il ramo è più pesante.

Caso 1: una separazione entro gli ultimi 720 blocchi viene annullata con un rollback e si applica il ramo più pesante. Caso 2: una separazione più profonda di 720 viene rifiutata; un nodo isolato più a lungo diventa bloccato e si ricostruisce da uno snapshot della spine quando i peer confermano il ramo più pesante.
Caso 1: una separazione entro gli ultimi 720 blocchi viene annullata con un rollback e si applica il ramo più pesante. Caso 2: una separazione più profonda di 720 viene rifiutata; un nodo isolato più a lungo diventa bloccato e si ricostruisce da uno snapshot della spine quando i peer confermano il ramo più pesante.

La soglia dei checkpoint

La catena spine aggiunge una seconda garanzia, più forte. Ogni blocco spine indica un blocco di riferimento della catena principale e lo fissa con precisione, tramite il suo hash e il suo peso, non solo la sua altezza. Una volta che un nodo memorizza un blocco spine con co-firme sufficienti, quell'altezza di riferimento diventa l'altezza finalizzata della catena.

Nessuna riorganizzazione la attraversa. Un nodo rifiuta un fork il cui punto di separazione si trova sotto l'altezza finalizzata prima ancora di scaricare un solo blocco, e rifiuta di nuovo se mai gli viene chiesto di rimuovere blocchi sotto di essa. Un blocco spine richiede le co-firme di due terzi dei seggi registrati, e ogni firmatario ne verifica prima il contenuto rispetto alla propria catena, quindi un checkpoint è una dichiarazione del registro nel suo insieme. Ogni nodo onesto lo considera definitivo non appena lo memorizza, senza attendere altri blocchi spine.

Perché il checkpoint è più profondo del limite di rollback

Qui si incontrano due numeri. Un nodo può fare rollback fino a 720 blocchi. E un checkpoint della spine, come lo snapshot che nomina, descrive la catena 760 blocchi sotto la punta (main_snapshot_min_height).

Se il checkpoint fosse meno profondo del limite di rollback, la spine potrebbe impegnarsi su un blocco che una riorganizzazione legittima potrebbe ancora sostituire, e il checkpoint firmato e la catena seguita da tutti non coinciderebbero. Il costruttore della genesi richiede quindi che main_snapshot_min_height superi max_rollback_height di almeno 20 blocchi. Mainnet usa 760 contro 720, un margine di 40 blocchi; devnet mantiene la stessa forma con 80 contro 60. Ogni blocco indicato da un checkpoint si trova già oltre qualsiasi rollback consentito.

Un righello che va indietro dalla punta: i blocchi da 0 a 720 possono ancora subire un rollback, da 720 a 760 c'è il margine di almeno 20, e a 760 il checkpoint e lo snapshot segnano ciò che è definitivo. Devnet: rollback 60, profondità 80.
Un righello che va indietro dalla punta: i blocchi da 0 a 720 possono ancora subire un rollback, da 720 a 760 c'è il margine di almeno 20, e a 760 il checkpoint e lo snapshot segnano ciò che è definitivo. Devnet: rollback 60, profondità 80.

Nodi isolati: blocco e ricostruzione

Un nodo rimasto isolato più a lungo del limite di rollback può scoprire che il resto della rete ha seguito un ramo più pesante fuori dalla sua portata. Non fa rollback verso di esso, ma non continua nemmeno da solo per sempre.

Quando almeno tre peer registrati confermano un ramo più pesante fuori dalla sua portata, il nodo si dichiara bloccato (wedged) e smette di produrre sul proprio ramo. Il rilevatore di blocco del nodo stesso, una regola locale, controlla anche se si verificano 10 risoluzioni di fork fallite consecutive alla stessa altezza, contro almeno 2 peer, nell'arco di almeno 1.800 secondi (30 minuti). Con auto_resync attivo, il comportamento predefinito dalla versione 0.5.8, un nodo bloccato scarta la propria catena locale e la ricostruisce dalla rete, partendo dai checkpoint della spine e dagli snapshot (vedi snapshot e fast sync).

Un nodo rimasto indietro segue il registro

Un nodo la cui punta è più vecchia di 7.200 secondi (2 ore) non si fida di qualunque peer dichiari di essere più avanti. Segue la punta che riportano almeno due terzi di un campione di peer registrati (almeno ceil(2 × n / 3) su n peer, con n almeno pari a 3).

A confronto con la finalità probabilistica

Nel Proof of Work, la fiducia in un blocco cresce con la sua profondità ma non diventa mai certezza; gli utenti di Bitcoin aspettano spesso sei blocchi prima di considerare definitivo un pagamento. ZooBC sostituisce questa abitudine con delle regole: un limite di rollback rigido di 3 ore e un checkpoint co-firmato circa una volta al giorno, sotto il quale la cronologia non cambia. Il prezzo è che un nodo isolato per più di 3 ore su un ramo di minoranza non può tornare indietro con un rollback; invece si ricostruisce.

Vedi anche