Vai al contenuto
buybitcoinsmart

Glossario / Mining e consenso

nBits

Noto anche come obiettivo compatto.

Che cos'è nBits?
nBits è il campo di quattro byte presente in ogni intestazione di blocco che impacchetta l'obiettivo di mining in una codifica compatta, in stile virgola mobile, formata da un esponente e da un coefficiente di tre byte.

Bitcoin ha bisogno di un obiettivo di 256 bit in un'intestazione che non può riservargli 32 byte, quindi ne memorizza una versione arrotondata in quattro. Il primo byte è un esponente, i tre restanti sono un coefficiente, e l'obiettivo è il coefficiente moltiplicato per 256 elevato all'esponente meno tre. Ogni nodo ricalcola il valore che si aspetta, quindi un'intestazione che dichiara un obiettivo più facile di quanto consentano le regole viene respinta senza appello.

Come funziona

nBits si legge come un byte di esponente seguito da un coefficiente di tre byte, e i due si combinano in un numero completo di 256 bit.

Prendi il valore del blocco genesi, 0x1d00ffff. L'esponente è 0x1d, cioè 29, e il coefficiente è 0x00ffff, cioè 65.535. L'obiettivo è quindi 65.535 moltiplicato per 2 elevato a 208, un numero scritto come otto zeri esadecimali, poi ffff, poi zeri fino a riempire 64 cifre. È l'obiettivo più facile che la mainnet consenta, ed è la definizione della difficoltà 1.

Due particolarità traggono in inganno. La prima è la precisione. Un coefficiente di soli 24 bit non può esprimere un numero arbitrario di 256 bit, quindi l'obiettivo codificato è sempre arrotondato, e un passaggio dall'obiettivo a nBits e ritorno non sempre restituisce il valore di partenza. La seconda è il bit di segno. Se il bit più alto del coefficiente è impostato, il valore viene trattato come negativo, quindi chi codifica sposta il coefficiente in basso di un byte e alza l'esponente per compensare. È per questo che il valore del genesi si legge 0x1d00ffff e non il più ovvio 0x1cffff00, e che un byte zero iniziale dentro il coefficiente è normale e non un errore.

Nell'intestazione serializzata il campo si trova all'offset di byte 72 ed è scritto in little endian, quindi quei quattro byte compaiono su disco e sulla rete come ff ff 00 1d.

Dove lo vedi

nBits circola sotto diversi nomi, e da qui nasce gran parte della confusione che lo circonda.

I block explorer lo etichettano "bits" e stampano il valore esadecimale accanto a una cifra di difficoltà più leggibile. La RPC getblock di Bitcoin Core lo restituisce come "bits", e getblocktemplate lo consegna al software di mining come il requisito che un'intestazione candidata deve superare. Nel codice sorgente è il membro nBits di CBlockHeader, convertito da arith_uint256::SetCompact e GetCompact. I pool di mining raramente lo mostrano: Stratum invia quegli stessi quattro byte alle macchine dentro una notifica di lavoro, e il firmware non deve mai pensare a cosa significano.

Il campo inoltre cambia secondo un calendario, non di continuo. Resta fisso per un'intera finestra di 2.016 blocchi e assume un nuovo valore solo a un aggiustamento della difficoltà, quindi due blocchi minati a un'ora di distanza portano un campo nBits identico, a meno che tra loro sia caduto un aggiustamento.

nBits vs soglia obiettivo

nBits è la codifica; la soglia obiettivo è il numero che codifica. Un nodo non confronta mai direttamente l'hash di un'intestazione con nBits. Prima espande i quattro byte in un obiettivo completo di 256 bit, poi verifica che l'hash sia pari o inferiore a quel valore. Trattare nBits come se fosse l'obiettivo va bene in una conversazione ed è sbagliato nel codice, perché due valori di nBits distanti una sola unità si decodificano in obiettivi che differiscono per un'enorme quantità assoluta.

Da non confondere con

Domande frequenti

nBits è la stessa cosa della difficoltà?

No. nBits codifica l'obiettivo, e la difficoltà è un rapporto derivato da esso: l'obiettivo più facile consentito diviso per quello corrente. I block explorer mostrano la difficoltà perché un numero decimale è più facile da confrontare di un campo esadecimale.

Perché il blocco genesi usa 0x1d00ffff?

Perché è l'obiettivo più facile che bitcoin consenta sulla mainnet, codificato in modo che il bit più alto del coefficiente resti a zero. Decodificato, è 65.535 moltiplicato per 2 elevato a 208, che è ciò che significa la difficoltà 1.

Termini correlati

Altro in Mining e consenso

Leggi questa pagina in inglese