Blockchain, questa sconosciuta

Riporto questa monografia da me scritta per cercare di spiegare la blockchain ad un’amica. Chiaramente è di parte (non sono un grande ammiratore di quella tecnologia, né delle criptovalute) ed è molto semplificata, come specificato nel disclaimer originale. Alla fine dell’articolo trovate alcune delle fonti usate, vi consiglio di consultarle per potervi fare una vostra idea a riguardo, senza prendere per oro colato quanto scrivo.

DISCLAIMER: come al solito le cose trattate di seguito sono state semplificate, di molto.

La blockchain, leggendo le banali definizioni trovate online, è una lista di blocchi. Questa onestamente è una definizione del cavolo, non fa altro che prendere la parola blockchain ed esplicitarla (block chain → catena di blocchi).

In verità qualsiasi persona formata nel campo dell’informatica nota subito che si tratta di una struttura dati, ovvero un metodo usato da un calcolatore per memorizzare dei dati. In particolare si tratta, nell’implementazione più conosciuta, dell’unione di due classiche strutture dati, le liste concatenate e le tabelle hash.

Mi spiego meglio. Pensate ad una lista ordinata di cose, ad esempio

  1. Giallo
  2. Blu
  3. Rosso
  4. Verde

Un computer ha vari metodi di salvare questi dati in memoria. Il più elementare è l’array, una struttura dati statica composta di un indice, cui posso assegnare un valore. Pertanto, se creo l’array colori, la lista sopra diventa

colori[1] = Giallo
colori[2] = Blu
colori[3] = Rosso
colori[4] = Verde

(so che dovrei partire a contare da zero, ma, come specificato all’inizio il documento non ha come target informatici, le persone normali iniziano a contare da 1)

Il computer sa che deve creare un oggetto chiamato colori, e deve allocare ad esso tanto spazio quanti i valori da memorizzare. Per un calcolatore, che è un oggetto stupido, ciò rende facilmente comprensibile come gestire la lista.

Il problema sorge quando voglio modificare la lista: se voglio inserire un nuovo valore alla fine, o modificarne uno esistente, nessun problema. Ma se volessi inserire un nuovo valore nel centro della lista, o eliminarne uno? Sarei costretto a riscrivere gran parte della lista da capo. Nel nostro esempio non è un problema, ma pensa a strutture dati più grandi, ad esempio l’elenco dei codici fiscali in ordine alfabetico. Se dovessi inserirne uno nuovo nel mezzo, dovresti spostare milioni di valori. Se poi, come l’anagrafe tributaria, compi quest’operazione molto frequentemente, vediamo che la nostra struttura statica non è così adatta allo scopo.

A questo punto sono introdotte le liste concatenate, o linked lists, che risolvono il problema essendo una struttura dinamica, ovvero pensata per essere modificata. Questre liste sono composte da nodi, ognuno dei quali è un oggetto che contiene un valore e un particolare tipo di variabile chiamato puntatore, ovvero contenente l’indirizzo di memoria del nodo successivo.

In questo modo se abbiamo la lista

1. Marco
3. Giulia
44. Matteo
12. Andrea
7. Giovanni

possiamo codificarla creando un nodo per ogni valore (ricordandoci di creare una testa della lista, un puntatore al primo nodo per permetterci di accedere alla stessa)

lista.next=1 valore=Marco
lista.next=3
valore=Giulia
lista.next=44
valore=Matteo
lista.next=12
valore=Andrea
lista.next=7
valore=Giovanni
lista.next=NULL

(il valore NULL significa che la variabile è vuota, quindi non vi sono altri nodi della lista dopo quello che punta a NULL)

Ovviamente in questo caso è semplicissimo aggiungere un altro nodo in mezzo alla lista, si tratta solo di crearne uno nuovo, e, dopo aver deciso dove posizionarlo, farlo puntare al successivo, assicurandosi che il precedente punti ad esso.

Ad esempio se volessi inserire il dato 87.Mario tra Giulia e Matteo:

lista.next=1 valore=Marco
lista.next=3
valore=Giulia
lista.next=87
valore=Mario
lista.next=44
valore=Matteo
lista.next=12
valore=Andrea
lista.next=7
valore=Giovanni
lista.next=NULL

(notare, in rosso il puntatore del nodo precedente che è stato modificato)

Vediamo che in questo caso non devo riscrivere buona parte della lista, ma solo modificare il puntatore dell’elemento precedente per non spezzare il tutto.

Come è già facilmente apprezzabile, la “lista di nodi” ha molto in comune con la “catena di blocchi”. Cosa cambia tra una lista concatenata e una blockchain? Semplicemente sono stati adottati alcuni accorgimenti per levare la componente dinamica della lista, impedendo l’eliminazione o la modifica dei dati inseriti.

Un blocco della blockchain altro non è che un nodo contenente (semplificando) le seguenti informazioni:

  • Un puntatore hash al blocco precedente (invece che al successivo come visto nell’esempio della lista)
  • Un timestamp, ovvero l’indicazione di data e ora (per semplicità diremo della generazione del blocco)
  • I dati delle transazioni portate a termine attraverso l’aggiunta del blocco alla blockchain

Cosa sono gli hash? Molto velocemente si tratta di quegli algoritmi che generano un valore (si spera univoco, questo dipende dalla complessità) partendo da alcuni dati forniti in input. Ad esempio un algoritmo che, ricevuta in entrata una parola, restituisce il numero delle lettere. O la lettera iniziale della parola.

La sicurezza della blockchain si basa principalmente su due fattori:

  • gli hash: stiamo parlando di algoritmi che, per loro stessa concezione, sono “a senso unico”. E’ facile calcolare un hash partendo dai dati, ma quasi sempre impossibile compiere il procedimento inverso (e, nei casi in cui è possibile, richiede molto tempo e molte risorse, parliamo di anni, secoli, millenni di calcolo continuo). Questo rende difficile creare una collisione, ovvero due input diversi che restituiscono lo stesso hash: la blockchain implementa anche altri accorgimenti per ovviare al caso in cui due blocchi abbiano lo stesso valore (e potenzialmente lo stesso hash) introducendo altre complessità per garantire l’univocità dei blocchi. Proprio questi accorgimenti rendono complicato il calcolo dell’hash di ogni blocco, e sono il motivo per cui il mining esiste (ovvero ricevere una commissione certificando le transazioni, ergo risolvendo questi algoritmi per i nuovi blocchi);
  • la decentralizzazione del sistema: non esiste una blockchain maestra, ognuno, per partecipare al “gioco”, mantiene una copia aggiornata automaticamente della blockchain. Questo protegge da modifiche dei valori inseriti in passato, in quanto bisognerebbe modificare la maggioranza assoluta delle copie di blockchain in circolazione per avere successo.

Va da sé che questi due punti implicano anche alcune delle maggiori debolezze del sistema:

  • gli hash: la complessità richiesta dai calcoli rende il metodo ampiamente inefficiente. Per molti l’eliminazione della componente di fiducia (quella presente, ad esempio, quando affidi il tuo denaro a una banca o paghi con una carta di credito) giustifica tutto ciò, onestamente preferisco il metodo più efficiente. I server di VISA gestiscono mediamente 2mila transazioni al secondo, con picchi ben maggiori, ed hanno una capacità almeno tre volte superiore. Paypal ne gestisce qualche centinaio al secondo. Bitcoin (quindi l’implementazione più usata di blockchain) ha un limite di 7 transazioni al secondo, dovuto alla dimensione dei blocchi, fissata in 1MB, valore che per la modifica richiederebbe l’approvazione della maggioranza assoluta della rete (i tentativi di aumento son già falliti più volte, uno di questi ha portato alla nascita di Bitcoin Cash, un’altra criptovaluta). Un appunto anche sull’algoritmo di hash usato, SHA-256. Al momento è sicuro, ma prima o poi, con l’aumento della potenza di calcolo a disposizione, verrà violato, come è accaduto ai suoi predecessori.
  • la decentralizzazione del sistema: implica che, trattandosi di una rete peer-to-peer e vista la natura della base di dati, che è unica e certificata, ognuno dei player sia in possesso di una copia aggiornata della blockchain. Ad oggi, fine dicembre 2017, la blockchain di bitcoin ha una dimensione di quasi 150GB: troppi perché il singolo utente ne scarichi una copia. Questo ha portato alla nascita degli exchange, ovvero intermediari presso cui depositare i propri fondi, che gestiscono le transazioni per conto degli utenti. Insomma, hanno inventato le banche, scoprendo l’acqua calda per l’ennesima volta. Un sistema decentralizzato ha anche lo svantaggio della mancanza di un soggetto centrale che decida e gestisca la direzione futura della blockchain. Come scritto sopra, l’algoritmo SHA-256 prima o poi verrà violato, magari tra 10 o 20 anni: bene, nel caso del web probabilmente accadrà quanto è avvenuto poco tempo fa con la conferma della violazione di SHA-1: semplicemente i maggiori player hanno detto “noi non accettiamo o certifichiamo più siti con SHA-1”. In pochi giorni sono stati adottati nuovi standard (anche se la strada per l’adozione completa resta sempre troppo lunga). Nel mondo decentralizzato, serve l’approvazione della maggior parte della rete per un cambiamento. Ogni quisquilia diviene un referendum globale con il quorum del 50%+1: non funziona nella vita reale, figuriamoci online. Mentre i maggiori standard sono gestiti da consorzi, compartecipati dai maggiori nomi o aziende del settore, che decidono per tutti, un sistema simile alla democrazia indiretta, non perfetto ma un netto miglioramento rispetto al caos delineato sopra.

Molte di queste osservazioni, in particolare quelle sulla decentralizzazione, si applicano nei casi in cui la blockchain appartenga ad un sistema realmente decentralizzato. Se l’azienda, o la startup che intende sfruttare le potenzialità del sistema si crea la sua blockchain privata, torna in atto la componente fiducia. Non essendo necessario che il sistema sia decentralizzato, vi sono metodi molto più efficienti (in termini di memoria e risorse, che si traducono in maggiore efficienza energetica e dimensionale nel mondo reale), anche se meno in voga, per conservare ed archiviare informazioni. Secondo me la blockchain, come concetto, ha concrete applicazioni solo in forma ibrida (non totalmente decentralizzata), e solo in settori molto particolari. Un esempio: una volta c’era il libro mastro, e si registrava su di esso ogni transazione. In caso di errori o modifiche a posteriori, bisognava tirare una bella riga e riscrivere il tutto. Ecco, con la blockchain abbiamo creato un libro mastro che, per concezione, vuole essere impossibile da modificare. Lascio al lettore riflettere sulla potenziale utilità (o mancanza di) di questa tecnologia.

Fonti:

https://en.wikipedia.org/wiki/Blockchain | https://it.wikipedia.org/wiki/Blockchain

https://blockchain.info/it/charts/blocks-size

https://en.bitcoin.it/wiki/Scalability

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *