Questo sito web utilizza cookie tecnici e, previo Suo consenso, cookie di profilazione, nostri e di terze parti. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsente all'uso dei cookie. Leggi la nostra Cookie Policy per esteso.OK

lo spiegone

Ecco come funzionano le crittovalute: funzioni hash e crittografia, spiegati bene

Tra lo scetticismo degli esperti di crittografia, di sicurezza informatica e di economia e l’entusiasmo dei sostenitori, sordi a ogni critica. Vediamo insieme come funzionano blockchain e bitcoin contrapposti ai modelli di pagamento tradizionali come il contante, gli assegni o le carte di credito

06 Giu 2018

Alberto Berretti

Dipartimento di Ingegneria Civile ed Ingegneria Informatica, Universita' di Tor Vergata


Parlare in modo realistico e senza paraocchi ideologici delle crittovalute non è facile. La comunità degli esperti e degli studiosi di crittografia e di sicurezza informatica è, per usare un eufemismo, estremamente scettica.

Qualche esempio per dare l’idea: “Burn it with fire” di Nicholas Weaver, o i tweet di fuoco di un esperto del calibro di Matt Blaze – “Reading about blockchains and thinking it solves everything is the 21st C version of reading Ayn Rand and thinking it explains everything” – o i pareri sferzanti di personaggi storici come Steven Bellovin – “un esperimento di laboratorio scappato di mano”, “il virus Andromeda dell’informatica”. Ancora peggio la comunità degli economisti, perlomeno quelli così marginali, insignificanti e irrilevanti da aver meritato un premio Nobel come Paul Krugman, Joseph Stiglitz o Nouriel Roubini. Chi scrive, non fatico ad ammetterlo, non è certo un asso in economia, e riconosco comunque l’autorevole parere di siffatti studiosi con il dovuto rispetto.

Sostenitori delle crittovalute sordi alle critiche

Ma, apparentemente, queste autorevoli opinioni, che dovrebbero perlomeno allertare dell’esistenza di qualche problema e far guardare al fenomeno con il dovuto scetticismo, sembrano essere irrilevanti ai sostenitori di un nuovo credo. È difficile combattere il pensiero magico, soprattutto se ti porta a credere che fare soldi facili sia possibile, o che qualche struttura dati possa risolvere i problemi dell’umanità.

L’ideologia delle crittovalute tocca corde profonde, corde che suonano una musica che da sempre è stata la musica dell’estrema destra politico-economica, quella che oggi chiameremmo alt-right: il timore delle le banche, degli “gli speculatori”, dell’“alta finanza”, l’ossessione per lo svincolamento della moneta dalla parità con l’oro vista come garanzia di stabilità. Ovviamente poi va a finire che le crittovalute sono il paradiso della speculazione più selvaggia, e pensare ad esse come a qualcosa che ha un valore stabile risulta essere quasi comico. Ma chi vede il mondo tramite gli occhi dell’ideologia non se ne cura.

Il funzionamento tecnico di blockchain e bitcoin

Chiedo a questo punto al lettore di fare uno sforzo: cercherò in questo post di spiegare il funzionamento tecnico del Bitcoin, la prima e largamente più diffusa crittovaluta (le altre sono in genere molto simili e basate sugli stessi principi). Ovviamente ci saranno alcune approssimazioni per rendere comprensibile il tutto (non sto scrivendo per un pubblico di matematici) ed alcuni aspetti di dettaglio non verranno nemmeno nominati: il mio scopo è far capire le idee che stanno alla base di blockchain e bitcoin in modo chiaro anche a chi di mestiere non maneggia hash, cifrari a chiave pubblica ed altri animali del genere.

Spero con questo di dare un sia pur piccolo contributo all’uscita dal pensiero di tipo magico che sembra permeare il topic, perlomeno in Italia, manco si stesse parlando di unicorni rosa.

Alla base della maggior parte delle crittovalute c’è un’idea, estremamente tecnica, che risale alla fine degli anni ’70, e cioè gli Alberi di Merkle (Merkle’s Trees, dal nome del loro inventore, il matematico americano Ralph Merkle). Si tratta di una struttura dati informatica piuttosto complessa, sulla quale ovviamente non possiamo entrare in dettaglio. Ci limiteremo a qualche cenno: ma sarà inevitabile utilizzare il concetto di hash.

Cos’è un hash

Un hash è una specie di tritacarne informatico. Immaginate di avere un file di lunghezza qualsiasi (una lista di caratteri arbitraria è la stessa cosa, continuerò a dire file ma potete pensare che si tratti di una semplice lista di caratteri), e di avere una procedura che, dato tale file, vi ritorna sempre un dato di lunghezza finita e prefissata – non eccessivamente grande: ad es. 128 o 256 bit (cioè 16-32 caratteri, a spanne; ovviamente agli informatici piacciono le potenze di 2). Tale procedura sarà una funzione hash o brevemente hash e basta se:

  • È deterministica: ad ogni file dato in pasta al tritadati corrisponde un solo unico hash
  • È facile e rapido calcolarlo
  • È spaventosamente complesso e quindi in pratica impossibile trovare un file che generi un hash dato
  • Un piccolo cambiamento nel file porta ad un hash completamente diverso
  • È estremamente difficile trovare due file che generino lo stesso hash, qualunque esso sia.

Resistenza alla collisione della funzione hash

Le proprietà n. 3 e 5 si chiamano, con un termine tecnico, resistenza alla collisione e se per caso, per una determinata funzione hash, vengono trovati due file che generano il medesimo valore dell’hash, si parla di collisione. Una funzione hash per cui è facile determinare delle collisioni è inutilizzabile. Deve essere chiaro però che le collisioni esistono comunque: infatti l’insieme di tutti i possibili file è un insieme infinito mentre l’insieme di tutti i numeri di 128 o 256 bit (o comunque un valore finito) per quanto grande è finito.

Funzioni hash e crittografia

Le funzioni hash sono degli oggetti utilissimi in crittografia, per ragioni che con un po’ di fantasia si possono facilmente intravedere: costituiscono una specie di versione deluxe delle cifre o dei caratteri di controllo che vengono ad esempio utilizzati nei codici fiscali, nei numeri di carta di credito, nei codici IBAN, etc.; inoltre, costituiscono un ingrediente fondamentale di tutti gli algoritmi per la firma digitale.

Ora, immaginiamo di avere un registro, sul quale vengono memorizzati dei dati rigo dopo rigo (ad es. delle transazioni in una valuta predeterminata: Alice ha dato 20 talleri a Bob, data e ora; Carol ha dato 30 talleri a Dave, data e ora; etc.). Immaginiamo ora di aggiungere ad ogni riga un hash del dato: a questo punto non posso più modificare il dato senza invalidare l’hash:

Alice → Bob, 20 talleri, 14/11/2018, 19:12:01 e6165660fee900b3c15f9a2a40fe8831
Carol → Dave, 30 talleri, 14/11/2018, 19:13:07 64bfd3aff6d2ee68c948c41a7688c011

La lunga sequenza di cifre e lettere alla fine di ciascun rigo è un esempio di hash del dato che lo precede (nella fattispecie, ho utilizzato un hash obsoleto per il quale sono note collisioni, chiamato MD5, e al posto della freccia ho usato la sequenza di caratteri “–>”). Se qualcuno si chiedesse come mai in un numero sono presenti delle lettere, bene, si tratta di un numero in base 16 quindi sono necessarie 16 cifre (0, 1, 2, …, 9, a, b, c, d, e, f).

Come rendere più difficile la modifica di dato e hash

Ma è evidente che potrei modificare sia il dato che l’hash e quindi tale registro può essere facilmente falsificato. Come possiamo impedirlo, o perlomeno renderlo più difficile?

Bene, innanzitutto immaginiamo di raggruppare la sequenza di transazioni in blocchi, e aggiungere al blocco un hash di tutti gli hash del blocco:

Alice → Bob, 20 talleri, 14/11/2018, 19:12:01 e6165660fee900b3c15f9a2a40fe8831
Carol → Dave, 30 talleri, 14/11/2018, 19:13:07 64bfd3aff6d2ee68c948c41a7688c011
Eve → Frank, 24 talleri, 14/11/2018, 19:15:09 3aea688ba156d5c242d58eb56f881d9b
Gabriel → Hans, 18 talleri, 14/11/2018, 19:16:11 4d62c2c2e955b2446e518d391d6c6520
Ingrid → John, 15 talleri, 14/11/2018, 19:18:21 7cdc70fe4ae606aadf20278833e57033
9fd5278372cdb21bc2b4edd2073d6fa0

Ora, se voglio modificare la transazione tra Carol e Dave, devo modificare non solo l’hash corrispondente, ma anche l’hash finale del blocco, che dipende dagli hash di ciascun rigo del blocco.

Ottimo, ora facciamo una catena di blocchi! Una blockchain! Ora l’hash di ciascun blocco invece che essere a sua volta l’hash degli hash di ciascun rigo del blocco, sarà l’hash di ciascun rigo del blocco a cui abbiamo aggiunto l’hash del blocco precedente! Abbiamo dunque:

(… Blocco precedente …)
087cbc19226e25456598b774653c4a5f

Alice → Bob, 20 talleri, 14/11/2018, 19:12:01 e6165660fee900b3c15f9a2a40fe8831
Carol → Dave, 30 talleri, 14/11/2018, 19:13:07 64bfd3aff6d2ee68c948c41a7688c011
Eve → Frank, 24 talleri, 14/11/2018, 19:15:09 3aea688ba156d5c242d58eb56f881d9b
Gabriel → Hans, 18 talleri, 14/11/2018, 19:16:11 4d62c2c2e955b2446e518d391d6c6520
Ingrid → John, 15 talleri, 14/11/2018, 19:18:21 7cdc70fe4ae606aadf20278833e57033
91741ef5f56695e1f636d3b242f692e0

Notare come l’hash finale sia cambiato, in quanto il dato da cui è stato tratto include l’hash del blocco precedente.

Ora, se io voglio modificare una riga di questo registro, devo modificare tutti gli hash delle righe seguenti e dei blocchi seguenti per mantenere la consistenza, a meno che io non sia in grado di trovare una collisione nella funzione hash considerata (e si assume che si utilizzi qualcosa di meglio del semplice hash MD5 che ho utilizzato qui). L’idea è indubbiamente brillante, è molto vecchia ed è utilizzata da tempo in alcuni prodotti di successo. Non si tratta certo di una novità epocale.

Il modello tradizionale: il contante

Ora, immaginiamo che vogliamo una forma di contante elettronico (che abbiamo chiamato tallero nell’esempio precedente). In qualche modo sarà necessario che ciascuna transazione venga controllata. Tradizionalmente, abbiamo due sistemi, il contante e varie forme basate sul credito.

Nel caso del contante, Alice dà a Bob 20 oggetti fisici precisi la cui contraffazione è estremamente complessa (tecniche raffinatissime sono state utilizzate per rendere molto difficile la contraffazione degli euro, ad esempio). Quindi Bob può controllare che i talleri fisici che riceve da Alice sono genuini, Alice non può “creare” talleri falsi (se non ad un costo superiore al loro valore nominale), e ciascuna banconota da un tallero non può essere spesa due volte, per la semplice ragione che è un unico oggetto fisico.

L’assegno e la fiducia nella banca

Oppure Alice dà a Bob un pezzo di carta dove c’è scritto “Alice dà a Bob 20 talleri”, lo firma, e Bob può in qualche modo trasformare tale pezzo di carta in 20 talleri fisici. Ma ovviamente detta così non può funzionare: chi ci dice che Alice ha veramente 20 talleri? E anche se Alice avesse veramente 20 talleri, potrebbe dare un siffatto foglio a Bob, uno a Carol e uno a Dave, “fare spesa” per 60 talleri e i poveri Bob, Carol e Dave si accorgono di essere defraudati solo quando provano a incassare i 20 talleri. E poi, chi, come e perché trasforma il pezzo di carta in 20 talleri fisici? La risposta a chiunque viva nel mondo reale è ovvia: Alice ha appena dato a Bob un assegno, e l’assegno è certificato da una terza parte, di cui Alice e Bob (e Carol, e Dave…) si fidano. Questa terza parte di cui tutti i partner nel nostro piccolo sistema economico si fidano da qualche secolo si chiama banca. Ovviamente la fiducia nella banca è cruciale per il funzionamento di tutto il sistema: pertanto le banche sono pesantemente regolate dallo Stato con leggi, norme, regolamenti specifici, etc.

L’utilizzo di carte di credito o di debito non è che una semplice variante del caso dell’assegno, eventualmente ulteriormente intermediato da un’ulteriore società (che gestisce la carta).

Anche nel caso del contante è necessaria una terza parte – lo Stato – che emette una valuta che non è fisicamente falsificabile ed in cui i cittadini hanno fiducia – perché sanno che possono utilizzarla ad esempio per pagare le tasse.

La legge tutela la validità delle transazioni tradizionali

Ovviamente la terza parte – ad esempio la banca – può modificare ciascuna transazione: ma tipicamente non lo fa, per mantenere la fiducia senza la quale essa non potrebbe operare – e per non violare le leggi e le norme a cui sopra accennavamo. La legge tutela in ultima analisi la validità delle transazioni. Ma il fatto che una transazione bancaria possa essere modificata ha una funzione fondamentale a tutela dei clienti delle banche: una transazione fatta per errore, o fraudolenta, può essere cancellata, modificata o invertita.

Se vogliamo utilizzare uno strumento elettronico di pagamento, i modelli basati su una terza parte che si fa garante della transazione funzionano egregiamente. Certo, la terza parte vuole una quota per ogni transazione (un transaction fee), dopotutto svolge un lavoro importante e delicato, ma si tratta di cifre molto contenute. Un sistema di valuta elettronica centralizzato, cioè basato sull’utilizzo di una tale terza parte che generare la necessaria fiducia, può essere legale o illegale, può essere utilizzato a scopi legittimi o per fare riciclaggio di denaro: c’è insomma Paypal e c’è Liberty Reserve. In ultima analisi, la legge risolve il problema della correttezza del servizio.

Approfondisci con la spiegazione su come funzionano in effetti il mining e le transazioni blockchain.

(Il testo anticipa i contenuti della seconda edizione, in corso di completamento, di “L’Impero del Malware”, pubblicato da Antonio Tombolini Editore).

Articolo 1 di 2