Cosa cavolo è la blockchain

9 agosto 2017
Cosa cavolo è la blockchain

A meno che tu non abbia tenuto la testa sotto la sabbia nell’ultimo periodo, sono sicuro che avrai sentito parlare di Bitcoin e, probabilmente, anche di Blockchain. Dopotutto, negli ultimi tempi, sono tra i temi più popolari e maggiormente trattati dai media — potremmo quasi considerarle tra le "parole dell’anno". Ne parlano un po’ tutti, anche persone che non sanno come funzionano o che non hanno mai posseduto una criptovaluta.

La maggior parte dei miei amici non sono dei tecnici. E molti di loro mi hanno chiesto tante volte di spiegargli come funzionano i Bitcoin e la Blockchain. Allo stesso modo immagino che ci saranno tante altre persone là fuori che vorrebbero sapere qualcosa di più su questo argomento. Per questo penso che sia arrivato il momento di scrivere qualcosa che tutti possano condividere con altre anime in pena. Questo è appunto lo scopo di questo post, ovvero spiegare la Blockchain con un linguaggio semplice in modo che anche un normale utilizzatore di Internet possa capirne il funzionamento.

Blockchain: perché abbiamo bisogno di qualcosa di così complesso?

“For every complex problem there is an answer that is clear, simple, and wrong.” – H. L. Mencken

A differenza di ogni altro articolo sul web, invece di cominciare subito dando una definizione di Blockchain, spiegheremo prima il problema che si propone di risolvere utilizzando un esempio.

Facciamo finta che Joe sia il tuo migliore amico. Joe parte per un viaggio, ma ad un certo punto della sua vacanza ti chiama e ti dice: “Ehi amico, ho bisogno di soldi, li ho finiti.”

Ovviamente tu rispondi: “Tranquillo, te ne mando subito un po’” e riattacchi.

Così chiami il responsabile della tua banca e gli dici: “Per favore trasferisci 1000€ dal mio conto a quello di Joe.”

Il responsabile risponde: “Certo!”, quindi apre il registro e controlla il tuo conto per vedere se hai un saldo sufficiente per trasferire 1000€ a Joe. Dato che sei ricco ne hai più che a sufficienza. Perciò il responsabile scrive nel registro una cosa del genere:

Il registro delle transazioni

A questo punto richiami Joe e gli dici:“Ho trasferito i soldi. La prossima volta che andrai in banca potrai ritirare i 1000€ che ti ho inviato.”

Ok, cosa è appena successo? Tu e Joe vi siete affidati alla banca per gestire i vostri soldi. Non c’è stato un passaggio fisico di banconote per effettuare questo trasferimento di denaro. È bastato semplicemente inserire una voce in un registro. O per essere più precisi, una voce in un registro che né tu né Joe controllate o possedete.

Il problema del sistema attuale è esattamente questo:

Per creare un rapporto fiduciario tra di noi abbiamo bisogno di un soggetto terzo.

Per anni abbiamo avuto bisogno di questi intermediari per fidarci l’uno dell’altro. A questo punto forse ti starai chiedendo: “Ma che problema c’è nel dipendere da questi soggetti esterni?”.

Il problema è che sono un numero limitato. Per creare il caos nella società, basterebbe che uno solo di questi intermediari venisse compromesso, volontariamente o involontariamente.

  • Cosa succederebbe se il registro in cui è stata registrata la transazione finisse bruciato in un incendio?
  • Oppure se, per sbaglio, il responsabile scrivesse 1500€ invece di 1000€?
  • Oppure ancora se lo facesse apposta?
Per anni abbiamo messo tutte le uova in un solo paniere e per di più di qualcun altro.

Può esistere un sistema alternativo grazie al quale possiamo trasferire denaro senza aver bisogno di una banca?

Invece di rispondere subito a questa domanda cerchiamo di andare ancora più a fondo e farci una domanda migliore (d’altronde domande migliori portano a risposte migliori).

Pensaci per un secondo, che cosa significa trasferire del denaro? Come abbiamo visto è solo una voce in un registro. Quindi una domanda più sensata potrebbe essere:

Ecco, questa si che è una domanda cui vale la pena di dare una risposta. E probabilmente avrai anche già indovinato quale sia. La Blockchain è la risposta a questa domanda cruciale.

La Blockchain è appunto un sistema per la gestione distribuita di un registro di transazioni che non necessita di un intermediario.

Mi segui? Bene. Immagino che avrai moltissime domande nella testa, perciò ora scopriremo come funziona questo registro distribuito.

Ok ma… come funziona?

La condizione perché questo metodo funzioni è che ci siano abbastanza persone che non vogliono dipendere da terzi. Solo così questo gruppo di persone potrà gestire il registro autonomamente.

“It might make sense just to get some Bitcoin in case it catches on. If enough people think the same way, that becomes a self-fulfilling prophecy.” – Satoshi Nakamoto in 2009

Ma quante persone servono minimo? Almeno tre. Per il nostro esempio però, ipotizziamo che 10 persone vogliano abbandonare le banche o qualsiasi altro organismo terzo. Di comune accordo, in ogni momento, ognuno di loro avrà il dettaglio dei conti di tutti gli altri, senza però conoscere l’identità del proprietario del conto.

1. Un raccoglitore vuoto

Ciascuno di loro ha con sé un raccoglitore vuoto. Man mano che andranno avanti, ognuno aggiungerà delle pagine al proprio raccoglitore. Questo insieme di pagine costituirà il registro che tiene traccia delle transazioni.

2. Quando avviene una transazione

Facciamo finta che tutti quelli che fanno parte di questa rete siano seduti in cerchio, ognuno con una pagina vuota davanti a sé e una penna in mano. Tutti sono pronti a scrivere qualunque transazione avvenga nel sistema.

Ora, diciamo che #2 voglia inviare 10€ a #9.

Per effettuare la transazione, semplicemente #2 dice a tutti “Voglio trasferire 10€ a #9. Perciò per favore, prendete tutti nota della transazione sulle vostre pagine.”

Tutti controllano se #2 ha un saldo sufficiente per trasferire 10€ a #9. In caso positivo ognuno prende nota della transazione sulla propria pagina.

Prima transazione della pagina

A questo punto la transazione è considerata completa.

3. Le transazioni continuano

Con il passare del tempo, altre persone della rete avranno bisogno di trasferire soldi. Ogni volta che uno di loro vorrà effettuare una transazione, gli basterà comunicarla a tutti gli altri. Non appena un’altra persona sentirà l’annuncio di una transazione, la scriverà sulla propria pagina.

Si andrà avanti in questo modo finché non si finirà lo spazio sulla pagina attuale. Diciamo, per esempio, che su una pagina si possano registrare 10 transazioni. Questo significa che non appena verrà completata la decima transazione, tutti quanti finiranno lo spazio per registrare nuove transazioni.

Pagina completata

A questo punto bisogna archiviare la prima pagina nel raccoglitore, prendere una nuova pagina e continuare il processo dal punto 2.

4. Archiviare una pagina

Prima di poter mettere via una pagina nei nostri raccoglitori, dobbiamo sigillarla con una chiave univoca condivisa da tutti quelli che fanno parte della rete. Sigillandola saremo sicuri che nessuno potrà cambiarla una volta che è stata archiviata nei vari raccoglitori, né oggi, né domani e neanche tra un anno. Una volta inserita nel raccoglitore rimarrà li per sempre, sigillata. Inoltre, se tutti saranno certi della bontà del sigillo, allo stesso modo saranno certi del contenuto della pagina. È proprio l’applicazione di questo sigillo alla pagina ad essere la parte cruciale di tutto il sistema.

In passato gli intermediari o gli organismi terzi ci assicuravano che nessuno avrebbe mai modificato quello che era stato scritto nei registri. In un sistema decentralizzato e distribuito come il nostro, è questo sigillo a darci tale garanzia.

Interessante! Ma allora come si fa a sigillare una pagina?

Prima di scoprire come sigillare una pagina, dobbiamo capire come funzionano in linea di massima questi sigilli. E per farlo ti devo parlare di quella che mi piace chiamare

La macchina magica

Immagina un macchinario circondato da muri spessi. Se gli dai in pasto una scatola con qualcosa al suo interno, quello ti restituirà una scatola con dentro qualcos’altro.

Perciò per esempio, se invii ad una di queste macchine il numero 4, quella ti sputerà fuori la parola ‘dcbea’.

Come converte il numero 4 in quella parola? Nessuno lo sa. In più, è anche un processo irreversibile, ovvero dando in ingresso alla macchina la parola ‘dcbea’ non si otterrà il numero 4 in uscita, perciò dato un certo risultato è impossibile dire cosa sia stato inserito in ingresso per ottenere quel risultato. Tuttavia puoi essere certo che ogni volta che inserirai il numero 4 nella macchina, otterrai sempre lo stesso risultato, ovvero la parola ‘dcbea’.

hash(4) == dcbea

Facciamo un altro esempio e proviamo con un numero differente. Diciamo 26.

hash(26) == 94c8e

Questa volta otteniamo ‘94c8e’. Interessante! Quindi le parole in uscita possono contenere anche dei numeri.

Ora ti faccio questa domanda:

È possibile calcolare l’input che ha prodotto un output?

Pensa un attimo a questa domanda.

Come ti ho già detto, una delle caratteristiche di questa macchina è di non poter calcolare cosa è stato dato in ingresso in base al risultato ottenuto. Perciò avendo a disposizione una macchina del genere, come possiamo rispondere alla domanda di prima?

Il primo (e unico) metodo che mi viene in mente è questo: perché non provare uno dopo l’altro ogni numero esistente finché non otteniamo in uscita una parola che cominci con tre zeri?

Bisogna provare ogni possibile input

Volendo essere ottimisti, dopo diverse migliaia di tentativi dovremmo riuscire ad ottenere un numero che produca il risultato richiesto. Perciò possiamo affermare che è molto difficile calcolare un input che produca un certo output.

Viceversa quanto pensi sia difficile rispondere a quest’altra domanda “Se un certo numero, ad esempio 72533, viene dato in pasto alla macchina, questa restituisce una parola che comincia con tre zeri?”

Come avrai già capito rispondere a questa seconda domanda è invece molto semplice, tutto quello che devi fare è mandare quel numero in input e controllare il risultato.

Questa è in effetti la proprietà più importante di queste macchine magiche (o funzioni hash), perciò teniamola ben presente nel resto dell’articolo:

Dato un output, è estremamente difficile trovare l’input che l’ha prodotto, ma dato un input e un output, è molto facile verificare se il primo ha prodotto il secondo.

Come si possono usare queste macchine per sigillare una pagina?

Come probabilmente hai intuito utilizzeremo queste macchine per generare un ‘sigillo’ per le pagine contenenti le transazioni. Ma partiamo sempre con un esempio.

Immagina di avere il numero 20893. Prova a rispondere a questa domanda “Puoi trovare un numero che sommato al primo e dato in pasto alla macchina produca una parola che cominci con tre zeri?”

Questa situazione è molto simile a quella vista in precedenza e ormai sappiamo che l’unico modo per calcolare un numero simile è quello di provare ogni numero esistente finché non otteniamo il risultato desiderato.

Dopo diverse migliaia di tentativi, troveremo un numero adatto, ad esempio 21191, che una volta sommato a 20893 (21191 + 20893 = 42084)e mandato in input alla macchina produce una parola che soddisfa la condizione.

In questo caso, il numero che abbiamo trovato, ovvero 21191, diventa una sorta di codice di sicurezza per il numero 20893. Ma vediamo perché. Immagina di avere una pagina con sopra scritto il numero 20893. Per sigillare tale pagina (in modo che nessuno possa più cambiarne il contenuto), basterà scriverci sopra il codice di sicurezza che abbiamo trovato, ovvero 21191. Non appena il numero 21191 sarà apposto sulla pagina, potremo considerare la pagina sigillata.

Il codice di sicurezza

Se qualcuno a questo punto volesse verificare l’integrità della pagina, ovvero verificare che questa non sia stata alterata, tutto quello che dovrà fare è sommare il contenuto della pagina con il codice di sicurezza e dare il risultato in pasto alla macchina. Se la macchina restituisce una parola che inizia con tre zeri, allora il contenuto non è stato modificato. Se invece la parola restituita non rispetta la condizione, possiamo anche buttare la pagina perché il suo contenuto sarà stato sicuramente compromesso, rendendola ormai inutile.

Nel nostro sistema utilizzeremo un meccanismo simile per sigillare le pagine e archiviarle nei nostri raccoglitori.

Infine, sigilliamo la nostra pagina…

Per sigillare la nostra pagina contenente le transazioni avvenute nella rete, dobbiamo trovare un numero che, una volta aggiunto alla fine della lista delle transazioni e dato tutto in pasto alla macchina, ci permetta di ottenere una parola che comincia con tre zeri.

Una volta che il numero è stato calcolato, investendo tempo ed elettricità per far funzionare la nostra macchina, la pagina sarà sigillata con quel codice di sicurezza. Se mai qualcuno dovesse cambiare il contenuto della pagina, il codice di sicurezza non permetterebbe più a nessuno di verificare l’integrità della pagina, perché non soddisferebbe più la condizione.

Ora che sappiamo come sigillare una pagina, torniamo al nostro esempio, in particolare al momento in cui abbiamo scritto la decima transazione, finendo così lo spazio disponibile su una pagina.

Non appena viene esaurito lo spazio per scrivere ulteriori transazioni, tutti cominceranno a calcolare il codice di sicurezza per la pagina così che possa essere archiviata nel raccoglitore. Il primo che lo troverà lo annuncerà agli altri.

Non appena qualcuno annuncia il numero, tutti gli altri procederanno a verificare se questo soddisfi le condizioni o meno. In caso positivo, tutti marchieranno la pagina con il numero e archivieranno la pagina.

Ma cosa succede se per qualcuno, ad esempio #7, il numero che è stato annunciato non porta al risultato atteso? Casi del genere non sono rari. Le ragioni possono essere diverse:

  • Può aver sentito male la transazione che era stata annunciata nella rete
  • Può aver scritto male la transazione
  • Potrebbe aver provato a barare nel registrare le transazioni, così da favorire sé stesso o qualcun altro nella rete

Quale che sia la ragione, #7 ha solo una scelta a questo punto ovvero buttare via la sua pagina e ricopiarla da qualcun altro nella rete così da poterla archiviare nel proprio raccoglitore. Infatti se non aggiungesse la pagina al raccoglitore non potrebbe più continuare a registrare transazioni, non potendo così più far parte della rete.

Il codice di sicurezza su cui la maggior parte delle persone concorda, diventa il codice di sicurezza ufficiale.

Ma allora perché qualcuno dovrebbe spendere elettricità e risorse per calcolare il codice di sicurezza sapendo che anche altri lo stanno facendo e lo comunicheranno nella rete? Perché non rimanere semplicemente in attesa che qualcun altro lo trovi o lo annunci?

Bella domanda. È qui che entrano in gioco le ricompense. Chiunque faccia parte della Blockchain può avere diritto ad una ricompensa. In particolare il primo a calcolare un codice di sicurezza verrà ricompensato con dei soldi per il suo sforzo (ovvero per la potenza di calcolo e l’elettricità spese per calcolarlo).

Banalmente immagina che #5 calcoli il codice di sicurezza di una pagina. Per questo viene ricompensato con dei soldi, ad esempio 1€, che vengono letteralmente ‘creati’ dal nulla. In altre parole il saldo di #5 viene incrementato di 1€ senza che il conto di nessun altro venga decurtato di tale cifra.

È così che sono nati il Bitcoin. È stata la prima valuta le cui transazioni vengono tracciate utilizzando la Blockchain (che a questo punto possiamo definire come un registro distribuito di transazioni). Per far sì che le persone continuino a lavorare per calcolare i codici di sicurezza, queste vengono premiate per il loro lavoro con dei Bitcoin.

Man mano che cresce il numero di persone che possiedono Bitcoin, il loro valore cresce, portando altre persone a volerli; in questo modo il loro valore continua a crescere così come la loro diffusione, altre persone cominciano a richiederli, il valore cresce ancora e via così.

Le ricompense fanno in modo che tutti continuino a lavorare per la rete.

Una volta che tutti avranno archiviato la pagina nel proprio raccoglitore, ogni persona della rete ne prende una nuova e si ricomincia il processo da capo, andando avanti finché ci saranno transazioni da registrare.

Questo è, a grandi linee, il funzionamento della Blockchain.


C’è ancora una cosa però che non ti ho detto.

Immagina che ci siano già cinque pagine nel raccoglitore, tutte contrassegnate con il codice di sicurezza. Cosa succederebbe se io prendessi la seconda pagina e modificassi una delle transazioni in essa contenute? Abbiamo già detto che il codice di sicurezza permetterebbe a tutti di accorgersi dell’inconsistenza della pagina. Ma se io andassi avanti e calcolassi un nuovo codice di sicurezza valido per la pagina modificata e lo applicassi ad essa, cosa accadrebbe?

Per impedire che qualche malintenzionato provi a modificare una pagina (o ‘blocco’ a questo punto) così come il suo codice di sicurezza, c’è un piccolo accorgimento aggiuntivo utilizzato per calcolare il codice di sicurezza.

Proteggersi dalle modifiche ai codici di sicurezza

Ti ricordi quando abbiamo detto che diamo in pasto alla macchina due numeri sommati? Di questi due numeri il primo era noto, nel nostro esempio 20893, mentre l’altro spettava a noi trovarlo ed era appunto il nostro codice di sicurezza.

Ecco, in realtà l’esempio è incompleto perché i numeri da sommare sono tre, due noti più il codice di sicurezza da trovare.

Sommando tutti e tre i numeri e mandando il risultato in input alla macchina, il risultato ottenuto deve soddisfare le condizioni date.

Sappiamo già che uno dei dati in ingresso sarà la lista delle transazioni della pagina da sigillare mentre l’altro sarà il codice di sicurezza. Il terzo input conterrà invece l’output della macchina magica per la pagina precedente.

Con questo semplice trucco, ci siamo assicurati che il codice di sicurezza di ogni pagina dipenda dalla precedente. Quindi, se qualcuno tentasse di modificare una delle pagine precedenti, dovrà anche modificare il contenuto e il codice di sicurezza di tutte le pagina successive, così da mantenere la catena consistente.

Se un individuo cercasse di barare modificando il contenuto di un singolo blocco della Blockchain (che ormai sappiamo essere il nostro raccoglitore con tutte le pagine contenenti le transazioni), si troverà a dover modificare diverse pagine e a calcolare per ognuna di esse un nuovo codice di sicurezza. E sappiamo quanto è complicato e dispendioso calcolare i codici di sicurezza. Perciò un singolo individuo disonesto non potrà mai battere le restanti nove persone oneste.

Anche se, a partire dalla pagina che ha modificato, questo individuo disonesto creasse una nuova catena di pagine nella rete, non riuscirebbe a stare dietro alla catena vera, semplicemente perché la velocità e lo sforzo di un singolo non possono superare la velocità e le risorse cumulate delle altre persone. Per questo è possibile garantire che la catena più lunga presente nella rete sarà anche quella valida.

La catena più lunga è la catena valida.
La catena più lunga è la catena valida.

C’è ancora un problema però: quando ti ho detto che una persona disonesta non può batterne 9 oneste, non hai sentito nessun campanello di allarme?

Cosa succederebbe se, invece di uno, sei persone diventassero disoneste?

In quel caso l’intero protocollo andrebbe gambe all’aria. Questo problema è conosciuto come “l’attacco del 51%”. Se la maggioranza delle persone nella rete decidesse di diventare disonesta e di truffare gli altri, allora il protocollo fallirebbe.

Questa è l’unica vulnerabilità per la quale le Blockchain potrebbero mai collassare. Detto questo però, è anche vero che un’evenienza del genere è estremamente improbabile, tuttavia è giusto conoscere tutti i punti deboli del sistema. In particolare, quindi, bisogna tenere presente che il sistema è basato sull’assunto che la maggioranza delle persone sia sempre onesta.

Con questo si conclude questa introduzione alla Blockchain. Se dovessi mai incontrare qualcuno che è rimasto indietro e si sta ancora chiedendo “Cosa cavolo è la Blockchain?”, sai dove mandarlo, perciò salvati il link.

Se pensi di conoscere già qualcuno che dovrebbe leggere questa guida, allora non aspettare e condividila.