blockchain sono una struttura dati inventata da Satoshi Nakamoto, pseudonimo dell’inventore della criptovaluta bitcoin, che nel 2008 la utilizzò per risolvere il problema del double spending. Il successo di tale struttura dati non è però legata esclusivamente al suo utilizzo nell’infrastruttura bitcoin, ma più in generale nella possibilità di utilizzarla per realizzare registri pubblici distribuiti praticamente inviolabili.

Definizione come struttura dati in informatica

Da un punto di vista prettamente informatico il blockchain è una catena o lista di blocchi (di dati) che hanno la caratteristica di include l’hash (funzione matematica non invertibile che mappa una stringa di lunghezza arbitraria in una stringa di lunghezza predefinita) che identifica il blocco in modo univoco e che permette il collegamento con il blocco successivo nella catena.

La peculiarità che rende il registro non modificabile è che l’hash del blocco è calcolato includendo anche l’hash del blocco precedente. Se, ad esempio, andiamo a modificare i dati del blocco 1 in figura, anche il suo hash risulterà differente e conseguentemente l’hash di tutti i blocchi che lo seguono.

L’operazione di hashing, però, di per se non è una operazione computazionalmente difficile, ma come vedremo viene resa tale introducendo dei vincoli sul suo valore. Inoltre, alterare una catena blockchain in un server non è sufficiente, in quanto tutti i server che partecipano alla gestione del registro dovrebbero approvare la modifica. Quest’ultimo aspetto non è comunque oggetto del presente articolo, che si concentra prevalentemente sulla definizione della struttura dati.

La principale caratteristica della blockchain è quella di essere un registro digitale aperto e distribuito, in grado di memorizzare record di dati (solitamente, denominati “transazioni“) in modo sicuro, verificabile e permanente. Una volta scritti, i dati in un blocco non possono essere retroattivamente alterati senza che vengano modificati tutti i blocchi successivi ad esso e ciò, per la natura del protocollo e dello schema di validazione, necessiterebbe del consenso della maggioranza della rete. La blockchain è quindi rappresentabile come una lista, in continua crescita, di “blocchi” collegati tra loro e resi sicuri mediante l’uso della crittografia. Ad un blocco possono essere associate una o più transazioni e ogni blocco, inoltre, contiene il puntatore hash al blocco precedente e una marca temporale.

La natura distribuita e il modello cooperativo rendono robusto e sicuro il processo di validazione ma presentano tempi di aggiornamento non trascurabili, dovuti al processo di validazione dei blocchi e alla sincronizzazione delle rete. L’autenticazione avviene tramite collaborazione di massa ed è alimentata da interessi collettivi. L’utilizzo di questa tecnologia consente anche di superare il problema dell’infinita riproducibilità di un bene digitale e della doppia spesa, senza l’utilizzo di un server centrale o di un’autorità.

Talvolta risulta possibile che alcuni nodi della rete producano simultaneamente più blocchi “concorrenti” (ossia collegati a uno stesso blocco già esistente, ma diversi tra loro nel contenuto): ciò dà origine a una biforcazione (fork) nella catena. Il protocollo di aggiornamento specifica quale regola i nodi debbano adottare per selezionare il blocco da accettare, tra quelli concorrenti. I blocchi non selezionati per l’inclusione nella catena sono chiamati “blocchi orfani”.

Struttura Dati del Blocco

Innanzitutto definiamo quali proprietà presenta la struttura dati di un blocco. Come accennato conterrà l’hash corrente, l’hash del blocco precedente ed i dati. Inoltre sono presenti altre due proprietà importanti nel blocco.

Il timestamp è un piccolo pezzo di dati archiviato in ogni blocco come un seriale univoco e la cui funzione principale è determinare il momento esatto in cui il blocco è stato estratto e convalidato dalla rete blockchain.

Infine c’è un intero nonce utile nell’operazione di mining, quindi ne parliamo più avanti.

Calcolo dell’Hash

L’hash è una stringa univoca identificativa usata per ogni singolo blocco della blockchain. Questa viene generata processando l’intero blocco contenente anche i dati da memorizzare ed il processo prende il nome di funzione hashing. Questo processo permette di creare un codice hash univoco detta anche impronta digitale che certifica l’integrità del singolo blocco.

HASH ed è stata inventata dalla NSA (National Security Agency) Americana. In particolare, la blockchain utilizza un algoritmo di hashing che prende il nome di SHA256. SHA sta per Secure Hash Algoritm, mentre 256 è il numero di bit del codice binario (ovvero di ‘0’ o ‘1’) che l’HASH occupa in memoria.
L’HASH in questione è lungo 64 caratteri ed è un algoritmo crittografico che combina cifre e numeri. Poiché è esadecimale, i numeri che lo compongono vanno sempre da 0 a 9, mentre le lettere vanno da A ad F e rappresentano i numeri da 11 a 16. 

Integrità della Blockchain

Verificare l’integrità della blockchain significa verificare la correttezza dell’hash del singolo blocco e la corrispondenza dell’hash del blocco precedente (ad eccezione del primo blocco della catena che ovviamente non ha l’hash del blocco precedente). La funzione di verifica della validità riceve quindi in input una coppia di blocchi consecutivi ed esegue i test di confronto fra i due blocchi adiacenti.

Ovviamente è sufficiente che un solo blocco della catena non soddisfi le condizioni affinché l’intera blockchain risulti non valida e quindi corrotta. Nel momento si prova a modificare un hash o un dato di un blocco subito ci si accorge della modifica poiché i blocchi contengono l’hash del blocco precedente e un attacco può essere immediatamente identificato.

Mining

Il mining è l’operazione principale eseguita sulla blockchain e consiste sostanzialmente nel generare  un nuovo blocco e manipolarlo opportunamente affinché possa essere aggiunto alla blockchain mantenendola in uno stato di validità. Molto semplicemente significa calcolarne l”hash ed aggiungerlo alla catena inserendo il riferimento al blocco precedente.

La sicurezza dell’intera infrastruttura della blockchain si basa su due requisiti:

  1. la verifica dell’integrità di una blockchain deve essere veloce in modo da poter essere eseguita su catene anche molto grandi in tempi rapidi;
  2. il calcolo dell’hash per l’inserimento di un nuovo blocco nella catena deve essere un’operazione computazionalmente difficile e richiedere quindi tempi lunghi. Questo al fine di rendere praticamente impossibile la corruzione del dato di un blocco che, come detto, richiederebbe il calcolo dell’hash su tutta la catena con tempi “biblici”.

Per rendere difficile l’operazione di mining l’architettura blockchain introduce un semplice vincolo sull’hash generato. Il vincolo è quello che l’hash debba iniziare con un numero di caratteri 0 pari ad una costante del sistema chiamata difficulty. E’ a tale scopo che è introdotta la nonce nella struttura dati del singolo blocco. L’idea del mining è quella di modificare la nonce fino a quando l’hash calcolato non soddisfi il vincolo imposto.

Nel sistema bitcoin la difficulty è un parametro che viene aggiornato periodicamente al fine di rendere sempre più difficile il mining, anche in considerazione dell’upgrade tecnologico degli hardware utilizzati.