Cosa è la blockchain

Blockchain è la buzzword del momento: basta la sua menzione in un comunicato stampa per far impennare le azioni di una azienda; tutti la vogliono, pochi sanno cosa sia.

Come tutte le tecnologie che non si comprendono anche la blockchain ha assunto un’aura di misticismo e quindi potete usare questa parola per darvi un tono o per svicolare: “Blockchain è la principale forma di disintermediazione” (Matteo Renzi) “cosa sono i blockchain, i bitcoin, l’informazione criptata” (Beppe Grillo) “Stiamo lavorando su un sistema di voto basato sulla blockchain” (Davide Casaleggio).

Ma cosa è in realtà questa blockchain? Che problemi risolve? Che garanzie fornisce? Cerchiamo di scoprirlo con uno scenario semplificato.

Partiamo dalla definizione: wikipedia in questo momento afferma che

La Blockchain è una lista in continua crescita di record, chiamati blocks, che sono collegati tra loro e resi sicuri mediante l’uso della crittografia.

Un po’ vaga, ma abbastanza buona: come noterete non si fa alcun riferimento a criptovalute o transazioni, perché nella sua essenza la blockchain non è legata a queste due cose. Quindi ecco una mia definizione pratica.

La blockchain è un registro immutabile per persone che non si fidano.

Ma cosa vuol dire in pratica?

La storiella della buona notte

Gli animali della fattoria si sono appena ribellati e ora vogliono darsi delle regole immutabili come ad esempio “Tutti gli animali sono uguali.”

Come possono fare per essere sicuri che queste regole immutabili non vengano veramente mai mutate? Potrebbero fidarsi di un garante, tipo un maiale particolarmente in vista, magari uno un po’ scapigliato, e che sputa quando parla. Se si fidano, bene, problema risolto: il garante terrà l’unica copia delle regole.

Ma gli animali sono diffidenti, quindi decidono di fare più copie del regolamento e ognuno terrà la sua copia.

Ma se ognuno tiene la propria copia come si può essere sicuri che nessuno la alteri? Possiamo verificare le copie di tanto in tanto e la versione con la maggioranza diventa quella ufficiale, ma qui sorge un problema: se ognuno si mette a modificare le regole a piacimento allora la maggioranza che vince potrebbe essere relativamente bassa, tipo un 33% di maiali meglio organizzati potrebbe cambiare le regole a piacimento se il restante 67% si divide in tante versioni minoritarie.

Ma noi non vogliamo una dittatura della maggioranza (relativa): vogliamo che le regole immutabili restino tali.

Complichiamo quindi la modifica creando un sistema in cui queste regole sono verificate attraverso la crittografia.

Fate entrare la crittografia

Ok, qui comincia la parte complicata, e divertente del sistema. Facciamo un passo indietro dal caso del registro immutabile e parliamo di messaggi: voglio trasferire un messaggio, come posso essere certo che quel messaggio non venga alterato lungo la strada? Posso usare una funzione matematica detta hash che è in grado di generare una stringa di lunghezza predefinita. L’algoritmo è unidirezionale, quindi il dato messaggio genererà sempre la stessa stringa, ma dalla stringa non posso risalire al messaggio. Questa parte richiederebbe una ulteriore approfondimento, ma possiamo considerare questa approfondimento non necessario per capire il funzionamento della blockchain. Basti quindi sapere che stiamo usando lo SHA-256, e se volete più informazioni in merito vi lascio a wikipedia (qui e qui).

Ad esempio il messaggio per il messaggio “Nessun animale deve uccidere un altro animale.” otterremo sempre “ff8c4eccf1435cd56b9e40cdd81787ad683a83504620e087643eb30e35af9129”

Ma se modifico il messaggio in “Nessun animale deve uccidere un altro animale senza motivo.” ottengo “9ef9e2925eafd75633b4ece549a77f3126aca71e34b9d3052f0e972e68304e77” che è una stringa della stessa lunghezza ma completamente differente nel contenuto. Anche se cambiassi una singola lettera otterrei qualcosa di completamente diverso.

Posso quindi verificare un messaggio con il suo hash per essere sicuro che nessuno abbia modificato tale messaggio.

Ma naturalmente in un sistema privo di fiducia non è sufficiente salvare il messaggio e il suo hash dato che calcolare un hash è un processo rapido e disponibile a tutti, quindi siamo ancora nello scenario dove una maggioranza può modificare messaggio ed hash.

Possiamo complicare ulteriormente il sistema legando insieme questi messaggi usando i codici.

Creiamo la catena

Torniamo alle regole che gli animali stanno tentando di darsi, e vediamo come possiamo creare una catena.

La prima regola è “Qualunque cosa cammini su due zampe è un nemico.” e il suo hash è “aee847d7e5638cd2fdb6ec2373ebd25243b4b88848bc8f18d800a5198610de06”

Posso quindi scrivere la seconda regola includendo l’hash della prima regola in questo modo

"aee847d7e5638cd2fdb6ec2373ebd25243b4b88848bc8f18d800a5198610de06 Qualunque cosa cammini su quattro zampe o abbia le ali è un amico."

ottenendo l’hash 828df44de34c57a63e679bd2fe1e9fff1331aa17314cd9eb6e108e3c9db753a3 che userò nella terza regola in questo modo

"828df44de34c57a63e679bd2fe1e9fff1331aa17314cd9eb6e108e3c9db753a3 Nessun animale deve indossare vestiti."

ottenendo l’hash “a04eeb24582ac4d7f791129480ac78b0b809227c50800057fc56e4b049c7d805” e così via.

In questo modo quando qualcuno andrà ad alterare il primo blocco cambierà l’hash incluso nel secondo blocco, che cambierà l’hash incluso nella terzo blocco e così via

Problema risolto quindi?

No. Modificare una catena di hash è ancora relativamente semplice dato che tutto quello che abbiamo fatto finora non richiede particolare potenza di calcolo. Dobbiamo quindi complicare ancora le cose.

Complichiamoci la vita

Come vedete qua sopra i vari hash son tutti molto diversi tra di loro, e questi cambiano in modo quasi casuale alterando il messaggio: dato che non è possibile risalire al messaggio partendo da un hash possiamo decidere di ritenere validi solo alcuni tipi particolari di hash, ad esempio quelli che iniziano con “00”. Per fare questo andremo a mettere in coda al nostro messaggio un numero che unito al resto del messaggio generi l’hash desiderato. Questo numero è detto “nonce”.

Ad esempio dal messaggio “Qualunque cosa cammini su due zampe è un nemico. 357” si ottiene l’hash “004067d68271cb9ddbc6e697af9812f599183eabe4b2e8d1fd64b0bf737fa33c”

La mia macchina però ha impiegato meno di un secondo a trovare questo numero, ma se aumentiamo la difficoltà a 5 zeri

“Qualunque cosa cammini su due zampe è un nemico. 796161” hash “00000c550e0c90ee0948a1d29a1575c47ff4a21934dcbbd2a891bbba458a47c6”
siamo già sui 2 secondi e se aggiungiamo ancora uno zero…

“Qualunque cosa cammini su due zampe è un nemico. 25125412” hash “000000168de7446cc98ead513318955f0f072e48e839bcbc3b6de49a37e49396”
siamo già a 68 secondi.

A questo punto possiamo cominciare ad adottare strategie differenti tipo usare due macchine e con una controllare solo i nonce dispari e con l’altra i pari dimezzando il tempo, o aumentando la potenza di calcolo, ma come probabilmente avrete già intuito basterà aumentare il numero di zeri per richiedere una potenza di calcolo enorme.

Nella fattispecie la rete bitcoin in questo momento richiede 18 zeri.

Mettiamo tutto insieme

A questo punto quindi abbiamo reso il calcolo dell’hash del messaggio una operazione che richiede tempo e cooperazione tra più macchine, quindi legando insieme gli hash come abbiamo visto prima, ovvero prendendo per la seconda regola in questo modo

000000168de7446cc98ead513318955f0f072e48e839bcbc3b6de49a37e49396 Qualunque cosa cammini su quattro zampe o abbia le ali è un amico.

calcolando in 70 secondi il nonce 3447846 e ottenendo l’hash 000000683b9115076afecb0ecc3b996741e81e1bfe2b5bc2643700d2352da99c che andremo a mettere nella regola successiva e così via.

Vince chi ha la catena più lunga

Se a questo punto continueremo ad aggiungere blocchi alla catena – anche privi di messaggio se non abbiamo altre regole da scrivere – renderemo impossibile per chiunque andare a modificare i messaggi passati fintanto che l’attaccante non ha sufficiente potenza di calcolo per superare il resto della rete.

Tutto questo sistema sta in piedi perché il primo che trova la soluzione la comunica a tutti gli altri permettendo di cominciare a calcolare il blocco successivo, e per questa ragione nessuno potrà andare a riscrivere un blocco precedente perché si troverà sempre diversi blocchi indietro rispetto all’ultimo blocco della catena.

Si ma dove ci si guadagna?

Fino a questo punto abbiamo visto la base della struttura per mantenere alcuni dati immutati fintanto che la maggioranza rimane in possesso di sufficiente potenza di calcolo. Nella prossima puntata vedremo come questo meccanismo si applica alle criptovalute.

Domande, dubbi, perplessità chiedete nei commenti. Se interessa ho anche qualche riga di python con la quale ho fatto i calcoli qua sopra.

I commenti sono chiusi.