BFT e Blockchain

Come abbiamo visto nel primo paragrafo, un messaggio fallace proveniente da un computer può seriamente mettere a repentaglio delle vite umane. Decisamente meno tragico, ma anch’esso alquanto devastante, può essere un errore nella registrazione di una transazione commerciale. Tanto più grave quanto più elevate sono le cifre in gioco.
Questo è il problema che si è trovato a risolvere Satoshi Nakamoto nella progettazione della criptovaluta Bitcoin per evitare il rischio del double-spending, cioè la possibilità che la stessa somma di denaro venisse “spesa” due volte.
Nell’articolo trattato al paragrafo precedente, la metafora dei generali e il loro tradimento rappresentava un caso di comunicazione fra nodi di una rete in cui, per i motivi più vari, i messaggi scambiati fossero suscettibili di deterioramento fino al mancato recapito.

I sistemi di criptovaluta che hanno conosciuto larga diffusione negli ultimi anni devono fare i conti con questo problema a causa della loro intrinseca costituzione. Essi sono infatti degli algoritmi distribuiti, che cioè operano su una rete peer-to-peer ed è indispensabile, per il corretto funzionamento del sistema, che almeno una parte significativa dei nodi della rete siano d’accordo sullo stato della rete stessa. Si tratta di un problema di raggiungimento del consenso.
Bitcoin utilizza il metodo del Proof-of-Work come meccanismo per diventare Byzantine Fault Tolerant, almeno fino ad un livello accettabile di affidabilità.

Si può pensare al proof of work come l’equivalente informatico dei metodi anti falsificazione utilizzati nelle banconote. Gli organismi preposti alla stampa delle banconote vi inseriscono delle caratteristiche costruttive (numeri in rilievo, filigrane, vernici speciali, elevatissima precisione di stampa e definizione dei caratteri) per far sì che, per raggiungere una sufficiente verosimiglianza, un falsario debba spendere più del valore stesso della banconota, rendendo futile l’impresa.

In estrema sintesi, le transazioni commerciali effettuate tramite Bitcoin sono contenute in un Registro Distribuito, Distributed Ledger, di cui ogni nodo della rete possiede una copia. Quando viene effettuata una transazione, essa deve essere annotata sul registro perché venga considerata valida. Ogni dieci minuti circa vengono raccolte in un nuovo “blocco” tutte le transazioni non ancora confermate insieme ad una chiave univoca che rappresenta il precedente blocco della catena.
Quindi alcuni nodi specializzati della rete detti miners, ricevendo ciascuno una copia del blocco da autenticare, impiegano una significativa quantità di energia per calcolare un valore numerico (che costituirà la prova di cui il sistema ha bisogno) che dipende contenuto del blocco che si vuole validare.
L’algoritmo per effettuare questo calcolo fa sì che il tempo per individuare questo numero sia di circa dieci minuti. Una volta individuato il valore che risponde a tutti i criteri, è estremamente facile verificare che sia così. Questa verifica può quindi essere fatta da tutti i nodi della rete i quali possono finalmente confermare che il valore trovato dal miner fortunato sia effettivamente quello giusto.
Il nuovo blocco viene quindi aggiunto alla catena e il valore trovato ne diventa l’identificatore da usare per validare il prossimo blocco da aggiungere.

Con queste premesse appare chiaro che modificare o falsificare un qualsiasi blocco della catena è un’impresa impraticabile perché significherebbe ricalcolare tutti i blocchi fino all’ultimo valido mentre la catena continua a crescere. Un’impresa che richiederebbe una potenza di calcolo enormemente superiore a quella necessaria per l’operatività normale della catena, che viene tenuta opportunamente elevata.
Analogamente, un miner malintenzionato che volesse autenticare un blocco con delle transazioni farlocche, dovrebbe avere una grandissima fortuna per individuare il valore chiave prima che uno delle migliaia di altri miners della rete trovi quello autenticante il blocco corretto.