Glossario / Protocollo e aggiornamenti
Bit di versione
- Che cosa sono i bit di versione?
- I bit di versione trattano il campo di versione da 32 bit in un'intestazione di blocco come una fila di interruttori indipendenti, così i miner possono segnalare il supporto per più soft fork contemporaneamente.
Specificato nel BIP-9.
Un bit di versione rappresenta un soft fork in attesa, conteggiato su una finestra fissa di blocchi. Il BIP-9 offre i bit da 0 a 28, e un deployment passa allo stato LOCKED_IN quando 1.916 blocchi in un periodo di 2.016 blocchi impostano il suo bit, oppure fallisce a un timeout suggerito di un anno. Leggere quei segnali è il modo per sapere con mesi di anticipo se una funzione che il tuo wallet vuole sta diventando una regola della rete.
Come funziona
I bit di versione funzionano come una macchina a cinque stati che ogni nodo calcola da sé, una volta per periodo di retarget, per ogni deployment che conosce.
Gli stati sono DEFINED, STARTED, LOCKED_IN, ACTIVE e FAILED. Ogni blocco all'interno di un periodo di retarget di 2.016 blocchi condivide un solo stato, quindi una transizione può avvenire solo a un'altezza che sia un multiplo di 2.016. Un deployment passa da DEFINED a STARTED quando il median time past del blocco precedente supera l'ora di inizio configurata, dove il median time past è il timestamp mediano di un blocco e dei suoi dieci predecessori.
Una volta in STARTED, un nodo risale esattamente 2.016 antenati e conta i blocchi i cui tre bit di versione superiori sono 001 e il cui bit del deployment è impostato. Tutto il resto conta come zero, così un miner che usa un altro schema di versione non può segnalare per errore. La mainnet ne richiede 1.916, la testnet 1.512. Se non si raggiunge la soglia prima che il median time past superi il timeout, il deployment passa a FAILED in modo permanente. Il BIP-9 suggerisce di fissare quel timeout a 31.536.000 secondi, un anno, dopo l'ora di inizio, così una proposta bloccata libera il suo bit invece di bloccare la coda per sempre.
Un dettaglio trae in inganno. Lo stato di un blocco non dipende mai dal suo stesso campo di versione, solo da quello dei suoi antenati, quindi un miner non può votare per una regola e far sì che il voto vincoli il blocco che lo esprime. Fissare i tre bit superiori a 001 fissa anche la versione di un blocco che segnala nell'intervallo da 0x20000000 a 0x3FFFFFFF, lasciando liberi i pattern 010 e 011 per qualunque meccanismo che alla fine sostituirà i bit di versione.
I bit vengono riciclati, non consumati. Una volta che un deployment si attiva o va in timeout, il suo bit può portare una proposta successiva, dopo una pausa di riposo che il BIP-9 raccomanda perché il software difettoso venga individuato prima. La specifica chiede inoltre ai nodi di tenere traccia dei bit che non riconoscono e di avvisare con chiarezza quando un deployment sconosciuto raggiunge lo stato LOCKED_IN, ed è così che il software non aggiornato ti avverte che sta arrivando una regola che non può applicare.
Dove lo vedi
Due deployment sono stati eseguiti sulla mainnet di bitcoin con i parametri del BIP-9 stesso, e la lista dei deployment del BIP li tabula entrambi.
Il primo, chiamato csv, ha preso il bit 0 con un'ora di inizio 2016-05-01 e una scadenza 2017-05-01, ed è diventato attivo al blocco 419.328. Raggruppava BIP-68, BIP-112 e BIP-113, tre delle modifiche che il BIP-9 elenca come cause di invalidità di transazioni prima valide. Il secondo, segwit, ha preso il bit 1 con una finestra che va da 2016-11-15 a 2017-11-15, ed è diventato attivo al blocco 481.824, entro una scadenza che avrebbe potuto mancare.
Lo schema è visibile anche nell'infrastruttura del mining. Il BIP-9 ha esteso la chiamata getblocktemplate con un array rules che nomina i deployment già attivi, un oggetto vbavailable che associa il nome di ogni deployment in attesa al suo bit e una maschera opzionale vbrequired dei bit richiesti dal server. Un pool legge quelle chiavi per decidere cosa segnalare, ed è questo che trasforma una versione rilasciata in una percentuale su un sito di monitoraggio.
Bit di versione vs blocco versione 2
Un blocco di versione 2 porta un contatore nel campo di versione; i bit di versione portano un vettore di bit negli stessi quattro byte. Con il BIP-34 il campo era confrontato come intero, quindi poteva essere in corso un solo aggiornamento alla volta e ogni successo bruciava per sempre valori che un blocco valido poteva usare. Il BIP-9 fa i conti: dopo BIP-34, BIP-66 e BIP-65 restavano solo 0x7FFFFFFB valori di versione, il che limita qualsiasi schema a vettore di bit a 30 deployment indipendenti. Fissare invece i tre bit superiori ha trasformato ciò che restava in 29 corsie che funzionano in parallelo e possono essere riutilizzate.