Glossario / Mining e consenso
Intestazione del blocco
Noto anche come Header.
- Che cos'è l'intestazione del blocco?
- L'intestazione del blocco è il riepilogo di 80 byte di un blocco: versione, hash dell'intestazione precedente, radice di Merkle, timestamp, nBits e nonce, ed è la parte di cui i miner calcolano davvero l'hash.
I miner non calcolano mai l'hash dei pagamenti direttamente. Calcolano l'hash di questo record di dimensione fissa, che vincola la lista delle transazioni tramite la radice di Merkle e ogni blocco precedente tramite l'hash dell'intestazione precedente. Ottanta byte per blocco sono abbastanza pochi perché l'intera catena di intestazioni da gennaio 2009 stia comodamente su uno smartphone, ed è proprio questo fatto che rende possibile la verifica leggera.
Come funziona
Un'intestazione di blocco è composta da sei campi in un ordine fisso, e i loro offset in byte non cambiano mai.
La versione occupa i byte da 0 a 3. L'hash dell'intestazione del blocco precedente occupa i byte da 4 a 35. La radice di Merkle occupa i byte da 36 a 67. Il timestamp, in secondi dall'epoca Unix, si trova nei byte da 68 a 71. nBits, il target di difficoltà codificato, si trova nei byte da 72 a 75. Il nonce occupa i byte da 76 a 79. Ogni campo è memorizzato in little endian, ed è per questo che l'esadecimale che vedi in un explorer sembra invertito byte per byte rispetto all'esadecimale di un dump grezzo del blocco.
L'hash del blocco non è uno di quei campi. Si calcola applicando SHA-256 due volte agli 80 byte, e i nodi lo ricavano invece di fidarsi di esso: è proprio per questo che un blocco non può mentire sulla propria identità. La proof of work è la stessa operazione con un confronto aggiunto: il numero risultante deve essere uguale o inferiore al target che nBits codifica.
Due dei campi seguono regole che sorprendono. Il timestamp non è tenuto a essere preciso. Deve solo superare il timestamp mediano degli ultimi undici blocchi e restare entro due ore dall'orologio del nodo che lo riceve, quindi intestazioni con orari leggermente fuori ordine sono normali e valide. Anche il campo versione non è più un semplice contatore. La segnalazione dei soft fork secondo il BIP9 e il version rolling secondo il BIP320 prendono entrambi in prestito dei bit da esso, quindi il numero di versione in un'intestazione moderna è un campo di bit e non un numero di rilascio.
Dove lo vedi
Le intestazioni dei blocchi sono la prima cosa che scarica un nuovo nodo e l'unica cosa che conservano molti wallet.
Bitcoin Core sincronizza prima le intestazioni dalla versione 0.10, rilasciata a febbraio 2015. Il nodo scarica e valida la catena di intestazioni, conferma che porti proof of work reale e solo allora richiede i corpi dei blocchi, cosa che può fare da più peer in parallelo perché sa già cosa sta cercando. I client leggeri si fermano a quel primo passo: un wallet SPV o Neutrino conserva le intestazioni e controlla che il ramo di Merkle di una transazione si colleghi a una di esse. A 80 byte ciascuna, una catena di 900.000 intestazioni è di 72 MB, ed è per questo che il tutto funziona con i dati mobili.
L'intestazione del blocco genesi è l'esempio canonico da esaminare. La sua versione è 1, il suo hash dell'intestazione precedente è tutto zeri, la sua radice di Merkle è 4a5e1e4b e così via, il suo timestamp è 1231006505, che è il 3 gennaio 2009, il suo valore nBits è 0x1d00ffff e il suo nonce è 2083236893. Puoi calcolare tu stesso l'hash di quegli 80 byte e ottenere il noto hash del blocco che inizia con dieci zeri. Se vuoi vedere qualsiasi altra intestazione, la chiamata RPC getblockheader di Bitcoin Core restituisce esattamente questi campi e nient'altro.