In questa seconda parte descriviamo la struttura della blockchain. (Qui puoi leggere la prima parte in cui parliamo di Bitcoin)
La catena di blocchi è una soluzione tecnica che molti considerano l’innovazione principale introdotta da Bitcoin. Questa parte può risultare un po’ tecnica ma utile: ci permetterà di capire come sono fatte le pagine di questo libro contabile diffuso e come viene raggiunto il consenso sullo stato del libro mastro.
Struttura blockchain
La blockchain di Bitcoin è una struttura dati per gestire transazioni economiche. Come visto nella parte precedente, in cui abbiamo parlato del sistema Bitcoin, la transazione è l’unità minima del sistema, per questo è molto utile pensare alla blockchain come ad un libro contabile in cui vengono registrate tutte le transazioni che movimentano bitcoin. Le transazioni sono organizzate in blocchi di informazioni. Ogni blocco ha una capienza massima di 1 Megabyte. Questi blocchi sono ordinati e ognuno ha un riferimento crittografico al blocco precedente. Si crea così una “catena di blocchi” contenente lo storico di tutte le transazioni.
Blocco Padre e Blocco Figlio
Ogni blocco della catena è identificato con un numero chiamato altezza blocco:
blocco 1 blocco 2 blocco 3… e così via, al momento della stesura siamo all’altezza del blocco 667.436.
Ogni blocco ha una testata (blockheader) e un corpo (body). Nel blockheader di ogni blocco è contenuta la firma crittografica (Hash) delle informazioni nel blocco precedente. Si crea così la sequenza di blocchi dove ogni figlio ha un singolo padre e così a ritroso fino al Genesis block: il primo blocco non minato ma creato direttamente da Satoshi.
Questa struttura dati che lega i blocchi padri ai blocchi figli garantisce la non modificabilità arbitraria dei dati sulla blockchain. Perché se il padre subisce delle modifiche, la firma digitale che lo rappresenta all’interno del blocco figlio cambia e di conseguenza cambia anche la firma digitale del figlio. Dato che è possibile chiudere un blocco ed aggiungerlo alla catena solo dopo aver risolto la prova di lavoro, ogni modifica in ogni punto della blockchain è estremamente complessa da apportare. Quando un blocco ha molte generazioni di seguito diventa sempre più difficilmente reversibile, perché il ricalcolo diventa esponenzialmente più costoso. Si ritiene che oltre 6 blocchi le transazioni siano praticamente irreversibili. La sequenza di blocchi concatenati tra loro crea una storia immutabile che rappresenta un valore aggiunto notevole portato dalla blockchain.
Analisi del blocco
Come visto sopra, ogni blocco è composto da un blockheader con alcune informazioni di testata, mentre il corpo ospita un Merkle tree. In questa parte vediamo in dettaglio i componenti del blockheader e come si costruisce il Merkle root.
Blockheader
All’interno della testata ci sono in seguenti campi:
- Version: numero di versione del software
- L’hash precedente: il riferimento al blocco precedente.
- Timestamp: l’orario approssimativo di creazione del blocco.
- Nonce: valore numerico che permette di chiudere un blocco valido.
- Bits: definisce la difficoltà della prova di lavoro.
- Merkle root: struttura dati formato da una stringa che raccoglie tutte le transazioni e ottimizzare lo storage dei dati.
Un blocco è identificabile tramite l’hash delle informazioni al suo interno e attraverso il contatore blocchi chiamato Block High.
Tutti i blocchi sono minati tranne il blocco 0, detto Genesis Block che è codificato a livello di protocollo. Una volta scaricato il software Bitcoin ogni nodo può ricevere i blocchi successivi dagli altri nodi e verificare la compatibilità “matematica” di ogni blocco con quello precedente fino al blocco 0.
Merkle tree
Il Merkle tree è una tecnica matematica per sintetizza in maniera efficiente le informazioni presenti nel body di un blocco. In testata di ogni blocco si trova il Merkle Root che è una sommatoria di tutte le transazioni incluse nel corpo.
Ad esempio con 4 transazioni di partenza T1 T2 T3 T4, ad ognuna di queste viene applicata questa formula che utilizza un’equazione standard chiamata SHA256.
H1= SHA256(SHA256(T1))
Otteniamo così H1 H2 H3 H4. Poi viene fatta una sommatoria H12=H1 + H2 e H34=H3+H4. Dopo di che si somma H12 + H34 fino ad ottenere un HASH contenente H1234. La stringa che si ottiene è detta Merkle root ed è inserita in testata.
Bizantine Fault Tolerance (BFT)
Bitcoin è il primo protocollo di comunicazione che risolve il problema dei generali bizantini, per questo viene chiamato sistema Byzantine fault Tolerant (BFT).
Il cosiddetto problema dei generali bizantini serve a esemplificare un dilemma noto da tempo agli informatici: in breve, il problema consiste nel tentativo di alcuni generali bizantini di coordinarsi durante un assedio. Assumendo che i generali non si possono fidare l’uno dell’altro, come fanno a decidere in modo coordinato qual è la prossima mossa? Come mettersi d’accordo?
L’attacco ha successo solo se tutti i membri sono d’accordo sulla mossa da fare.
In informatica l’esempio si traduce nel coordinamento di alcuni nodi che devono decidere sul corso dei prossimi eventi o accordarsi sullo stato del sistema scambiando informazioni all’interno di un network in cui non c’è fiducia.
Il coordinamento può fallire per diversi motivi:
- Problemi o interferenze durante la trasmissione dei messaggi.
- Un nodo malintenzionato può mandare messaggi fuorvianti.
- Attacchi esterni che abbiano interesse a far saltare il coordinamento.
Bitcoin risolve elegantemente il problema, da un lato garantisce con la blockchain uno storico affidabile dei fatti e poi applica la proof of work per ottenere un consenso sul nuovo stato senza dover ricorrere ad un’autorità centrale che coordini i diversi generali.
Proof of Work (PoW)
Proof of Work (PoW), in italiano “prova di lavoro”, è un processo crittografico utilizzato da Bitcoin per garantire la sicurezza della rete e il raggiungimento del consenso sulla veridicità degli eventi ed è anche il processo che genera nuovi bitcoin in circolazione.
Processo di creazione di un nuovo blocco, preliminare alla proof of work procede così:
- I minatori costruiscono i blocchi candidati a partire dalle transazioni propagate nella rete.
- Costruzione del Merkle tree fino al Merkle root.
- Creazione del Blockheader.
- A questo punto bisogna trovare l’hash del Blockheader che rispetta la condizione di difficoltà posta dal campo bits.
I minatori per riuscire a chiudere il blocco con la soluzione devono trovare tramite complessi calcoli matematici un numero da inserire nel campo nonce. Procedono per tentativi a cambiare il valore del nonce e calcolare la funzione di hash finché l’hash risultante non inizia con 0. Il campo bits definisce con quanti zeri deve iniziare la soluzione. Più zeri sono richiesti in un dato momento, maggiore è la difficoltà della soluzione.
Tutto questo processo di cambio nonce e calcolo dell’hash header (il lavoro) è molto dispendioso in termini di energia e potenza di calcolo per questo il minatore che è riuscito a trovare un blocco valido riceve una ricompensa in bitcoin. Gli altri minatori verificano velocemente che il nuovo blocco creato sia valido perché il riscontro matematico è rapido. Appurata la validità del blocco, questa viene aggiunta alla catena e tutti i minatori procedono a minare un altro blocco.
Il protocollo Bitcoin aggiusta la difficoltà in base alla potenza computazionale immessa nella rete per mantenere il tempo di emissione tra un blocco e l’altro intorno ai 10 minuti.
La prova di lavoro (proof of work) significa dimostrare alla rete di aver speso energia elettrica per risolvere il puzzle. Dato che la soluzione del puzzle è estremamente complicata e costosa, i minatori non hanno incentivi ad hackerare il protocollo Bitcoin perché gli costerebbe troppo. Ovvero hanno incentivo ad elaborare solo transazioni veritiere e riconoscibili dagli altri membri come vere. Inoltre la potenza di calcolo immessa nella rete da tutti i minatori rende il sistema molto resistente ad attacchi esterni.
I sistemi tradizionali necessitano di una terza parte per garantire la veridicità della proprietà ed impedire che qualcuno spenda due volte la stessa cifra. In Bitcoin è il processo PoW stesso che garantisce le parti affidando la veridicità delle transazioni ad una soluzione matematica. Bitcoin sostituisce la fiducia con la matematica.
Il consenso
Il servizio fornito da questo lavoro è la creazione di consenso su una cronologia di transazioni sempre più certa man mano che si aggiungono blocchi alla catena.
I nodi esprimono l’accettazione del blocco mediante il tentativo di creare il prossimo elemento della catena. Questo perché per creare il prossimo blocco valido hanno bisogno della firma dell’ultimo tassello della blockchain.
Questa “votazione” per ogni blocco conferisce alla blockchain e alle unità di conto contenute in essa un valore sociale. Senza questo passaggio di consenso Bitcoin non avrebbe nessun valore sociale e quindi non sarebbe una moneta.
Ogni minatore è libero di proporre un blocco, ma affinché un blocco sia validato dal 51% degli altri nodi è necessario che passi tutta una serie di verifiche e controlli per rispettare le regole del protocollo:
- Ogni nodo deve verificare autonomamente ogni transazione ricevuto da altri nodi. Ci sono 18 regole di validità prima che una transazione trasmessa ad altri nodi sia candidabile ad entrare in un blocco.
- I nodi minatori devono aggregare le transazioni valide in nuovi blocchi candidati.
- I minatori devono scegliere la catena blockchain principale, con lo storico di transazioni più lunga se durante la creazione del Blockheader utilizzano l’hash del Blockheader precedente.
La blockchain unita alla proof of work fornisce al mondo uno strumento radicalmente innovativo. Perché, oltre ad essere una soluzione tecnica originale, è un meccanismo di coordinamento sociale che gli utilizzatori di bitcoin possono sfruttare ben oltre la mera trasmissione di unità di conto. Infatti negli ultimi anni sono nati molti progetti che cercano di sfruttare i principi e le qualità della blockchain per raggiungere un coordinamento sullo stato di alcune informazioni. In via teorica ogni tipo di interazione sociale che richiede la fiducia tra varie parti può essere gestita con la blockchain per ottenere trasparenza, coordinamento e consenso.