Blocchi e blockchain
Per capire il modo in cui una transazione viene elaborata, ossia aggiunta adun blocco, e successivamente in che modo tale blocco entri a far parte della blockchain di Bitcoin, è necessario capire cosa sono e come sono fatti i blocchi.
La struttura del blocco è descritta in figura 1.
Il blocco: un raccoglitore di transazioni
Analizzando l’immagine, si nota che ogni blocco possiede i seguenti campi:
- la dimensione in bytes del blocco;
- l’header del blocco, ossia un insieme di parametri che caratterizzano il blocco;
- il numero di transazioni presenti nel blocco;
- le transazioni.
Di conseguenza, possiamo definire un blocco come un raccoglitore di transazioni alle quali vengono associate alcune informazioni aggiuntive (i metadati). Il numero di transazioni all’interno di un blocco dipende dalla dimensione delle transazioni stesse, infatti l’unica regola da rispettare è che il blocco non superi il megabyte di dati. Questa costante è predefinita a livello di codice, e deriva dal compromesso fra il tempo necessario a confermare una transazione e la larghezza di banda necessaria per mantenere un nodo attivo.
Fra tutti i metadati, il campo header è sicuramente quello più importante ed è l’unico che necessita di ulteriori spiegazioni. Analizzandolo in maniera approfondita, si riesce a capire come nasce e si sviluppa lo strato economico alla base di Bitcoin, ossia la blockchain. La figura 2 mostra nel dettaglio l’header di un blocco.
Lo header risulta composto dai seguenti campi:
- la versione del blocco, ossia un numero che rappresenta quale versione del software di Bitcoin è necessario utilizzare per validare questo blocco; spiegheremo meglio la validazione dei blocchi nell’articolo dedicato al mining e al consenso distribuito.
- lo hash dell’header del blocco precedente ottenuto attraverso l’utilizzo dell’algoritmo SHA-256 [1], che consiste semplicemente nel calcolo dello hash dell’informazione contenuta negli 80 bytes del precedente header;
- il merkle root [2] delle transazioni, ossia una particolare struttura ad albero basata sull’utilizzo degli hash, che consente di indicizzare e ricercare in tempo lineare transazioni all’interno di un blocco (al massimo 2 * log2 (N) operazioni); N.B.: va osservato come il merkle root sia una rappresentazione minimale di tutte le transazioni contenute all’interno del blocco, e come ogni minima varizione/alterazione di queste comporti una modifica drastica del merkle root e di conseguenza dello hash del blocco!
- il timestamp di generazione del blocco, cioè l’istante di tempo nel formato unix di quando viene costruito il blocco;
- il target di difficoltà, ovvero il livello di difficoltà a cui è impostato l’algortimo di consenso di Bitcoin in quel momento; spiegheremo meglio questo campo nell’articolo dedicato al mining e al consenso distribuito;
- il nonce, vale a dire un numero intero positivo casuale che consente di risolvere la prova di lavoro per il relativo blocco; spiegheremo meglio questo campo nell’articolo dedicato al mining e al consenso distribuito.
Dai blocchi alla blockchain
Come si nota, ogni blocco ha all’interno del suo header lo hash dell’header del blocco precedente, e a sua volta verrà utilizzato in forma di hash nella generazione dello header del blocco successivo. Mettendo questa relazione sotto forma di immagini, ottieniamo la rappresentazione di figura 3.
Questa relazione tra header si potrae a ritroso fino ad arrivare al primo blocco mai “minato” — il blocco genesi — ed ecco quindi che si materializza la famosa blockchain o catena dei blocchi. Ogni blocco risulta quindi collegato al precedente in maniera indissolubile, e anche la più minima variazione di un dato in un qualsiasi blocco implica il ricalcolo di tutti i suoi successori nella catena.
Nel prossimo articolo sul mining spiegheremo esattamente cosa implichi questa relazione fra i blocchi e come sia sfruttata per rendere la blockchain di Bitcoin immutabile, ossia per rendere non modificabile lo storico del suo strato economico.
Alcune considerazioni sulla blockchain
Prima di procedere oltre, per il momento è però importante aggiungere alcune considerazioni sulla blockchain:
- parlando di Bitcoin, sarebbe più corretto definire la sua catena di blocchi una timechain [3] o catena del tempo, in quanto lo scopo principale di questa struttura dati è marcare temporalmente ogni transazione avvenuta nel sistema, attraverso il timestamp del blocco che la conterrà, così da sapere quando sono stati spesi determinati UTXO ed evitare la doppia spesa dei bitcoin;
- la blockchain rappresenta lo stato economico di Bitcoin, in quanto contiene al suo interno, organizzate in maniera temporale e raggruppate per blocchi, tutte le transazioni economiche che siano mai avvenute, validate e confermate sul sistema stesso;
- la blockchain non è Bitcoin, ma è solo una sua sottoparte necessaria al funzionamento del sistema; quando si sente dire che Bitcoin non ha valore ma la struttura che sta sotto — la blockchain — ha potenzialità infinite, il discorso non ha molto senso: la blockchain è quello che è solo quando viene utilizzata all’interno del sistema più complesso per la quale è stata progettata, vale a dire il sistema Bitcoin.
Identificare i blocchi: hash dello header o altezza nella blockchain
Ogni blocco del sistema può essere identificato univocamente in due modi: con lo hash del suo header, univoco per definizione matematica, o con l’altezza che il blocco occupa nella blockchain, dove per “altezza” di un blocco s’intende la sua posizione all’interno della catena. Per determinarla, basta considerare il blocco genesi avente altezza 0, e tutti i successivi blocchi che via via vengono aggiunti aventi altezza incrementata di 1. A inizio marzo del 2023 eravamo arrivati a “minare” il blocco con altezza 778825.
L’introduzione del concetto di altezza del blocco, ci consente di chiarire un fatto che avevamo accennato nell’articolo precedente, riguardante il locktime delle transazioni posticipate. Queste possono essere di due tipologie: o con uno specificato istante di tempo da raggiungere, concetto che risultava chiaro fin da subito, o con una specificata altezza di blocco da raggiungere, e adesso sappiamo cosa vuol dire anche questa casistica.
Conclusioni
Abbiamo quindi visto anche i blocchi e la blockchain, comprendendone la relazione e l’importanza dell’identificazione univoca. Nel prossimo pezzo ci concentreremo sul mining, sul consenso e sulla sicurezza.
Riferimenti
[1] La voce “Secure Hash Algorithm“ su Wikipedia
https://it.wikipedia.org/wiki/Secure_Hash_Algorithm
[2] Approfondimento di “Merkle tree” su bitcoinwiki
https://en.bitcoinwiki.org/wiki/Merkle_tree
[3] Approfondimento di “Timechain” su Bitcoin Magazine
https://bitcoinmagazine.com/culture/bitcoins-blockchain-is-the-timechain