Nella sezione Blockchain abbiamo capito con cosa abbiamo a che fare, ma ora è bene approfondirne il funzionamento. 

Possiamo cominciare proprio dal nome: Block significa blocchi e Chain significa catena. La blockchain è proprio questo, un insieme di blocchi tenuti insieme da una catena che ne assicura un ordine cronologico.

Ma cosa sono questi blocchi? I blocchi non sono altro che file contenenti tutte le transazioni che vengono effettuate dagli utenti.

Attenzione, molti pensano erroneamente che quando una persona invia un Bitcoin ad un’altra persona il Bitcoin viene inserito fisicamente nel blocco ed inviato, ma non avviene proprio questo. Nel blocco viene solo inserita la richiesta, da parte della persona che sta inviando, di trasferire la proprietà di quel Bitcoin alla persona ricevente.

ESEMPIO

Alice deve vendere un immobile a Bob, cosa fa? Siamo tutti d’accordo che Alice non metterà le ruote sotto l’immobile per portarlo a Bob, ma sicuramente andranno da un notaio che certificherà, attraverso una firma, il passaggio di proprietà.

Quando una persona invia dei Bitcoin avviene la stessa cosa, viene cambiato il nome del proprietario di quei Bitcoin.

Come avete immaginato, quindi, c’è bisogno di qualcuno che metta questa firma e attesti il passaggio di proprietà dei Bitcoin. Nella Blockchain di Bitcoin la conferma delle transazioni viene svolta dai minatori (in inglese miner) che, circa ogni 10 minuti, firmano il blocco e lo aggiungono alla catena dei blocchi precedenti, rendendo le transazioni irrevocabili.

Ci sono vari modi in cui questi blocchi possono essere aggiunti, nella blockchain di Bitcoin questo avviene tramite la Proof-of-Work (letteralmente prova del lavoro). Questo significa che i miner per firmare un blocco ed aggiungerlo alla blockchain devono risolvere un puzzle matematico per dimostrare di aver svolto il lavoro così da poter essere ricompensati.

Ma in cosa consiste questo puzzle matematico?

Il puzzle consiste nel trovare un numero chiamato nonce che inserito all’interno di un’espressione matematica ci da un risultato preciso. Il termine nonce è una combinazione di due parole, n che significa numero e once che significa una volta. Pertanto, nonce significa utilizzare un numero solo una volta. Il nonce è un numero casuale arbitrario a 32 bit che può essere compreso tra 0 e 2^32 (cioè 4.294.967.29).

Per capire dove inserire il nonce e di che espressione matematica stiamo parlando è bene capire prima cosa sia un hash.

Un hash è semplicemente un grande numero in base 16. Un attimo, cosa significa in base 16? Tutti noi nella vita quotidiana utilizziamo un sistema numerico in base 10, cioè un sistema numerico formato da 10 cifre che vanno da 0 a 9. Ci sono basi diverse dalla base 10, ad esempio un sistema numerico in base 2 include soltanto due cifre: 0 e 1.

Un hash è un numero in base 16 che per raggiungere 16 cifre viene semplicemente allungato utilizzando le prime 6 lettere dell’alfabeto.

Possiamo calcolare un hash utilizzando una funzione di hash. Esistono molte funzioni di hash differenti, quella utilizzata da Bitcoin si chiama SHA-256 e produce un output della dimensione di 256 bit cioè 64 cifre. Un hash può essere ottenuto inserendo un qualsiasi dato (testo, foto, file, etc…) all’interno di una funzione di hash, l’output che verrà generato sarà sempre di lunghezza fissa.

ESEMPIO

Usando una funzione di hash online come questa possiamo capire di cosa si tratta.

Inserendo un testo come ad esempio “Bitcoin Cash Italia” all’interno della funzione ci verrà fuori la seguente stringa:

eb6ae44607182b07043dbf202afad8f8a29de71a88fbb122dce04b15af100bd3

Se nel testo dell’input cambiamo una lettera, anche solo in maiuscolo o minuscolo, o uno spazio la stringa cambia completamente. Esempio:

  • bitcoin cash italia = 526e6a8596a31b1c931a107d7be0b985bdc893ae6b10a2246ac79608b34b12dc
  • bitcoincashitalia = 4fa22466804b933aa0f8a4fa87887118f243d7f7a14298a8ed0379b45c7c5bbb
  • BitcoinCashItalia = 4e9de994be395c9bb947b7360e37ef299299e901f9e3902622f84efb1fe818a2

Questo assicura che ad ogni hash sia associato un input unico.

È importate capire una differenza: la funzione SHA-256 non è una funzione di crittografia ma una funzione di hash. La differenza fondamentale è che mentre la funzione di crittografia è una funzione a due vie (possiamo decriptare i dati) la funzione di hash è una funzione a senso unico: tramite una funzione di hash possiamo calcolare l’hash, ma avendo l’hash è difficile (e matematicamente impossibile) ricavare l’input di partenza.

L’hash svolge un ruolo fondamentale all’interno della blockchain e, proprio perché ad un input viene associato un output unico, l’hash viene utilizzato per identificare transazioni o blocchi. Inoltre, viene utilizzato insieme al nonce per legare i blocchi in ordine cronologico tramite il puzzle matematico di cui parlavamo prima. Vediamo insieme come.

Ogni blocco è formato da:

  1. Hash del blocco precedente;
  2. Il timestamp;
  3. La radice dell’albero di Merkle di tutte le transazioni incluse nel blocco;
  4. Il nonce;
  5. L’obettivo della difficoltà del blocco.

Il puzzle matematico consiste nel trovare l’unica incognita, cioè il nonce (4), che ci da come risultato proprio l’hash del blocco che vogliamo confermare con quella difficoltà (5)

ESEMPIO

Torniamo tutti a scuola per un momento, abbiamo lezione di matematica e l’insegnante scrive un problema sulla lavagna che noi studenti dobbiamo risolvere. Il primo studente che lo risolve vince un premio. Il problema che ci viene posto è il seguente:

10 + ? = 17

Il primo studente che troverà il numero mancante (cioè il nonce) vincerà il premio. Prima di ricevere il premio, però, dovrà mostrare la soluzione al resto della classe che ne verificherà l’esattezza. Se avrà trovato proprio il numero 7 e i suoi compagni di classe concorderanno potrà ritirare il premio. 

l nonce quindi è il numero che inserito in una funzione di hash insieme agli input dei punti 1, 2 e 3 ci da proprio l’hash che stiamo cercando (il punto 5). È importante notare che il timestamp cambia ogni secondo, quindi i miner dovranno trovare il nonce corretto entro quel lasso di tempo altrimenti il nonce cambierà e dovranno ricominciare dall’inizio.

L’hash di un blocco sarà diverso per ogni miner perché è estremamente improbabile che due miner abbiano la stessa radice Merkle. Pertanto, non è una corsa per risolvere il puzzle, piuttosto, è un sistema di lotteria. Ma, naturalmente, è probabile che un minatore diventi più fortunato a seconda del suo hashpower.

Quindi in realtà i miner non devono trovare un hash preciso, gli viene chiesto soltanto di trovare un hash con determinati requisiti. L’hash di un blocco comincia sempre con 0, e quando un miner trova il nonce che insieme agli altri input restituisce un hash che inizia con uno 0, mostrerà il risultato agli altri miner e, se sarà esatto, vincerà il premio.

ESEMPIO

Torniamo all’esempio di prima, la nostra insegnante ci propone lo stesso problema ma questa volta vuole che il risultato sia maggiore  di 17

10 + ? >  17

Il primo che proverà, quindi, ad inserire un numero qualsiasi maggiore di 7 vincerà il premio poichè sarà corretto. Questo per dire che il nonce non è unico ma ce ne sono diversi, il primo studente che ne troverà uno vincerà il premio.

Questo premio viene chiamato coinbase ed è sempre la prima transazione del blocco che trasferisce dei Bitcoin completamente nuovi, più le commissioni di transazione che pagano gli utenti, nel wallet del miner che lo firma. Satoshi Nakamoto nel protocollo di Bitcoin ha stabilito che i Bitcoin che vengono creati per i miner devono dimezzarsi ogni 210.000 blocchi (circa 4 anni) e questo evento prende il nome di Halving. Il processo di dimezzamento dei Bitcoin creati assicura che non possano mai esistere più di 21 milioni di Bitcoin.

Ora però nasce un problema. Come assicurarsi che la media tra un blocco e l’altro sia di 10 minuti quando i miner aumentano o diminuiscono? Facile, aumentando o diminuendo periodicamente la difficoltà per trovare il nonce. La difficoltà sta proprio nella quantità di 0 iniziali dell’hash del blocco. Ogni volta che viene aggiunto o sottratto uno 0 aumenta o diminuisce la difficoltà di calcolo necessaria per trovare l’hash.

Aumentando gli 0 iniziali diminuiscono i nonce corretti da trovare e quindi la difficoltà aumenta, viceversa diminuendo gli 0 la difficoltà diminuisce perché aumentano i nonce corretti ed è più facile trovarli.

Una transazione è quindi confermata quando il blocco viene aggiunto alla blockchain, ma allora perché spesso leggiamo che una transazione ha bisogno di “x” conferme per essere accettata? Introduciamo quindi il concetto di blocchi orfani.

Anche se difficile, c’è la possibilità che due miner, chiamati per esempio A e B, trovino il nonce contemporaneamente, questo comporterà che alcuni miner della rete aggiungeranno alla propria Blockchain il blocco del miner A e altri miner il blocco del miner B perché entrambi corretti.

Questo provoca una separazione (in inglese fork) della blockchain e, come potete immaginare, non è una cosa positiva. Proprio per questo il protocollo di Bitcoin, per risolvere il problema, afferma che è da ritenere valida la catena più lunga costringendo tutti i miner a lavorare su di essa: detto semplicemente il primo miner che verificherà il blocco successivo sulla catena A o B creerà la catena più lunga e costringerà i miner che lavoravano sull’altra catena ad abbandonarla e lavorare sulla sua catena.

A causa di questo fork nascono quelli che vengono chiamati blocchi orfani perché vengono abbandonati e non inclusi nella blockchain. Può accadere però, anche se è molto difficile, che questo processo vada avanti per più blocchi causando la nascita di due blockchain parallele. È per questo che quando si invia una somma di denaro importante, le persone che devono ricevere i Bitcoin, per assicurarsi che sia veramente entrata a far parte della blockchain e che non risulti in un blocco orfano, richiedono un determinato numero di conferme prima di ritenere accettata la transazione.

Il numero di conferme non è altro quindi che il numero di blocchi che sono stati aggiunti alla blockchain da quando abbiamo effettuato la transazione. Di solito dopo 6 conferme si può essere sicuri al 99,99% (e anche qualche altro 9) che la transazione non faccia parte di un blocco orfano.

Poiché questo avviene in rarissimi casi, di solito per spedire piccoli importi nessuno aspetta più di una conferma.

Ma cosa succede alle transazioni che erano presenti nei blocchi orfani? Niente paura, semplicemente torneranno nella mempool, cioè lo spazio dove ci sono tutte le transazioni che attendono di essere inserite in un blocco e, quindi, di essere confermate.