Vai al contenuto
buybitcoinsmart

Glossario / Protocollo e aggiornamenti

Compact block relay

Noto anche come BIP152.

Che cos'è il compact block relay?
Il compact block relay sostituisce un nuovo blocco sulla rete con un elenco di identificatori da sei byte, che il nodo ricevente confronta con le transazioni che già possiede e ricompone localmente.

Specificato nel BIP-152.

Due peer che osservano entrambi la mempool condividono già quasi tutte le transazioni del blocco successivo, quindi inviarle una seconda volta è uno spreco. Matt Corallo ha specificato la soluzione come BIP152 e Bitcoin Core l'ha attivata nella versione 0.13.0, pubblicata il 23 agosto 2016. Per chi gestisce un nodo a casa è la differenza tra una bolletta del traffico dati tollerabile e una intollerabile.

Come funziona

Il compact block relay aggiunge quattro messaggi al protocollo, e quello interessante è cmpctblock, che descrive un blocco senza contenerlo.

Un cmpctblock porta l'intestazione di 80 byte, un nonce di 8 byte scelto dal mittente e poi un identificatore corto di sei byte per ogni transazione del blocco. Questi identificatori derivano da SipHash-2-4, con chiave ricavata dallo SHA-256 dell'intestazione concatenata con quel nonce. Il nonce è ciò che rende sicuro lo schema: gli identificatori cambiano per ogni blocco e per ogni mittente, quindi nessuno può preparare in anticipo due transazioni i cui identificatori collidano e blocchino la ricostruzione su tutta la rete in una volta.

Alcune transazioni viaggiano per intero invece che per identificatore. La coinbase sempre, dato che nessun peer può averla vista prima, e un mittente può precaricare qualsiasi altra transazione che sospetti il destinatario non abbia.

La ricostruzione avviene poi sul lato ricevente. Il nodo calcola l'hash di ogni transazione della propria mempool con la stessa chiave, cerca ogni identificatore corto e completa il blocco. Mantiene anche una piccola riserva aggiuntiva di transazioni espulse e sostituite di recente, che recupera quelle uscite dalla mempool pochi istanti prima. Tutto ciò che manca ancora viene richiesto per posizione con getblocktxn, e il mittente restituisce solo quelle transazioni in un messaggio blocktxn.

Due cose impongono di ripiegare sul download del blocco intero: troppe transazioni mancanti perché valga la pena un viaggio di andata e ritorno, oppure due transazioni diverse che producono lo stesso identificatore di sei byte. Sei byte consentono 281 mila miliardi di valori, quindi le collisioni accidentali sono rarissime, e quelle deliberate sono proprio ciò che il nonce esclude.

L'annuncio ha due modalità. In modalità a bassa larghezza di banda un peer annuncia un nuovo blocco e attende che gli venga richiesto. In modalità ad alta larghezza di banda, che un nodo attiva per non più di tre peer, il cmpctblock viene inviato nell'istante in cui il blocco arriva, risparmiando un viaggio di andata e ritorno sul percorso in cui la velocità di propagazione conta di più.

Dove lo vedi

Il compact block relay è visibile nel log del tuo nodo, una riga per blocco, e leggerlo è il modo più rapido per giudicare se un nodo è in salute.

Bitcoin Core stampa un riepilogo della ricostruzione che indica quante transazioni sono state precaricate, quante sono venute dalla mempool, quante dalla riserva aggiuntiva e quante è stato necessario richiedere. Su una macchina in funzione da ore il conteggio delle richieste è di solito zero o quasi. Su una macchina avviata dieci minuti fa la mempool è quasi vuota, quasi tutto va scaricato e i primi blocchi arrivano lentamente.

Da qui una regola pratica per chi gestisce un nodo per verificare il proprio saldo invece di fidarsi di un sito web: lascialo in funzione. Un nodo riavviato poco prima che ti serva è un nodo che scarica blocchi interi, e la sua visione della punta della catena resterà indietro rispetto a un explorer pubblico finché la mempool non si riempie di nuovo.

Da non confondere con

Domande frequenti

Il compact block relay cambia ciò che conta come blocco valido?

No. Cambia solo il modo in cui i byte viaggiano tra i peer. Il nodo ricevente convalida da zero il blocco ricomposto secondo le stesse regole di consenso, quindi un blocco che arriva in forma compatta viene controllato con esattamente lo stesso rigore di uno scaricato per intero.

Perché il mio nodo scarica blocchi interi dopo un riavvio?

Perché la ricostruzione richiede una mempool popolata. Un nodo appena avviato ha quasi nulla con cui confrontare gli identificatori corti, quindi deve richiedere la maggior parte di ogni blocco. Il comportamento si corregge da solo entro un'ora circa, man mano che la mempool si riempie.

Termini correlati

Altro in Protocollo e aggiornamenti

Leggi questa pagina in inglese