Proof of Work (POW) di bitcoin esemplificata

Proof of Work (POW) di bitcoin esemplificata

La Proof of Work di bitcoin (POW) esemplificata

Quando parliamo di mining, facciamo riferimento ad un puzzle crittografico da risolvere  Questo ha a che fare con la prova di lavoro ( in inglese proof of work, abbreviata POW) che il miner deve compiere per poter risolvere il puzzle ed è la base del consenso di protocollo Bitcoin.

Con il termine mining si intende il processo di elaborazione computazionale richiesto per poter elaborare un nuovo blocco della catena ( blockchain ). E’ stato previsto che venga estratto / minato un nuovo blocco mediamente ogni 10 minuti. E questo può avvenire per bitcoin, attualmente, solo attraverso il consenso della Proof Of Work. [ Ogni altra cripto decide il suo consenso ]

Per capire come mai è richiesta così tanta potenza per elaborare un nuovo blocco, dobbiamo capire che cos’è un hash.

Mining di bitcoin attraverso la POW

 

 

Che cos’è un hash ?

L’hash è una funzione matematica che dato un input (come un testo) genera una stringa in output. Per lo stesso input la stringa in output non cambia mai. 

L’hash è una funzione a senso unico: è facile da generare ma, partendo da un codice hash, è molto difficile risalire alla stringa originale. 

Facciamo un esempio pratico: se volessimo creare l hash della parola “test”, prendendo un calcolatore hash come questo , il codice generato sarebbe:
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08

Invece per la parola “test.” (ho aggiunto il punto) l’hash generato è questo:
4ee3df88f682d376531d8803f2ccbee56d075cd248fc300f55dfe8596a7354b7

Con l’aggiunta di un solo un punto, il codice hash di “test” è totalmente diverso dal codice di “test.”. E lo stesso vale se cambio una lettera in maiuscolo o aggiungo una spazio.

NB: stiamo modificando solo 1 campo!!

Calcolare l’hash è facile, ma partendo da un codice hash è difficile risalire alla parola originale.

Ti sfido a trovare la parola che corrisponde al seguente codice hash:
3866daf66ad5f7e6dbf8c983b06287d7ad254336a172d8f34eb1cb4f25f12b70


Puoi riuscire ad indovinare la parola originale facendo innumerevoli tentativi a caso fino a trovare la parola corrispondente . Così come vuoi indovinare la password del wifi del tuo vicino..

Creiamo una nostra blockchain per capire a che cosa serve l’Hash

La nostra blockchain contiene informazioni molto semplici: una lista di persone con il loro nome ed età; il nome ed età sono separati da un trattino in questo modo:

  • Blocco 1: Giovanna-28
  • Blocco 2: Mario-45
  • Blocco 3: Paolo-21
  • Blocco 4: Clara-67

Ogni blocco deve avere un codice identificativo: questo codice verrà calcolato attraverso hash.
Per formare una catena di blocchi si deve collegare un blocco al suo predecessore: per fare questo ogni blocco deve avere al suo interno il codice identificativo del blocco precedente.

Iniziamo a costruire la nostra blockchain

Iniziamo dal primo blocco: dato che il blocco 1 non ha nessun predecessore metti come hash del blocco precedente uno zero: 0-Giovanna-28
generando l’hash di 0-Giovanna-28 ilcodice generato è
2739fffebfe125d040de3701c039c891162ab903025989f58781a21f91041e78

Per renderci la vita facile prendi solo le prime 5 cifre di questo codice e mettile all’inizio del blocco 2 (Mario-45); così il contenuto del blocco 2 è 2739f-Mario-45

Adesso calcolo l’hash di 2739f-Mario-45 e così trovo
dcdef06e1936011de4d8f1849406ef8224731da09c9b51db4af5d530305c451b

Prendiamo ancora solo le prime 5 cifre di questo codice e mettiamole all’inizio del blocco 3 (Paolo-21) ottenendo così dcdef-Paolo-21.
Ripetiamo questo procedimento anche per il blocco 3 e 4; la catena formata è la seguente:

Adesso proviamo a manomettere il contenuto di un blocco! Simulano un miner malevolo.

La nostra amica Giovanna cambia l’età da 28 a 25 nel blocco 1; così facendo il contenuto del blocco diventa 0-Giovanna-25 e le prime 5 cifre del nuovo codice hash è fdee7.


Dato che il codice identificativo del blocco 1 è cambiato (prima era 2739f ora è fdee7) si deve aggiornare il codice hash dentro il blocco 2 che fa riferimento al blocco 1. Con questo aggiornamento il contenuto del blocco 2 cambia (ora è fdee7-Mario-45) quindi si deve ricalcolare il codice hash del blocco 2: le prime 5 cifre del codice hash di fdee7-Mario-45 è 77e83.
Il codice hash del blocco 2 è cambiato, quindi cambia anche il contenuto del blocco 3 facendolo diventare 77e83-Paolo-21.

Come avrai intuito, dato che il contenuto del blocco 3 è cambato si deve ricalcolare il suo hash che a sua volta fa cambiare il contenuto del blocco 4 e il suo hash.

Cambiare il contenuto di un blocco invalida l’hash del blocco stesso ed inoltre causa una reazione a catena invalidando tutti i blocchi che seguono fino all’ultimo blocco inserito.

 

Che calcoli fanno le macchine addette al mining ?

Se non ti ho perso fin qui, la risposta puoi dartela da solo: Provano e riprovano le possibili combinazioni di hash finché qualcuno non “trova” la soluzione e lo comunica agli altri.

Facciamo un esempio reale

Creiamo un elenco di blocchi testuali, dove gli stessi sono collegati li uni agli altri tramite un codice di identificazione. Ogni blocco contiene i seguenti dati:

identificazione del codice del precedente blocco  (PREV)
nome di chi invia (SENDER)
nome di chi riceve (RECEIVER)
Quantita di bitcoin o parti di esso (AMOUNT)
Per complicare le cose, facciamo che ogni codice d’identificazione deve iniziare con 0000 (quattro zeri). Per far questo aggiungiamo un campo dato chiamato NONCE.

Il primo blocco avrà i seguenti dati ( essendo il primo blocco ha codice del precedente blocco uguale a 0 ):

PREV:0
SENDER:john
RECEIVER:jenny
AMOUNT:100
NONCE:1

Adesso copiamo questo blocco di testo ed incolliamolo sempre nel calcolatore hash come questo . Facciamo click su “Calculate SHA-256 Hash” (fai attenzione agli spazi).

Se hai copiato giusto, ti troverai il seguente hash:
07b01b0f4672f2bc58ef11132df4bc74a4e0dc9f2e07ee5d9a0428d3836bc6cb

Come puoi vedere peró l’hash inziia con b273 e non con 0000 come voluto;  dobbiamo quindi provare a cambiare il campo NONCE e ripetere il calcolo ( cambiando il valore di NONCE da 1 2 cambierá anche il codice hash).

Il nuovo testo del blocco sarà di questo tipo:

PREV:0
SENDER:john
RECEIVER:jenny
AMOUNT:100
NONCE:2

Lanciando il calcolo dell’hask, come in precedenza, avremo quindi:
263172553403d3182866ed4d2e7b588a6932e58d0acaa1fa92958a1f70dfabc5

Anche in questo caso il codice non iniza per 0000!

Questo giochino si dovrà ripetere finquando non si troverà il codice hash che inizia esattamente per 0000.

Per semplicità, prima che stai e riprovi tu fin quando diventi matto, ti dó la soluzione: dovresti ripetere lo stesso processo 22683 volte! 

Il testo esatto sarà quindi:

PREV:0
SENDER:john
RECEIVER:jenny
AMOUNT:100
NONCE:22683

Hash code: 00000d7d33ebf71c24c15119c925acf9d9d45f8f9972034e2c8b1aabe29163a7

Qui arriva il bello: il processo visto fin qui, non può essere fatto all’inverso! Ovvero decodificare dall’hash che inzia per 0000 quale sarebbe il valore del NONCE ricercato.

È a “senso unico”. Ed è uno degli aspetti affascinanti della crittografia e quindi di bitcoin stesso.

Non si puó fare diversamente da quanto abbiamo appena visto.

Provare e riprovare.

L’unico modo e cercare di fare più interrogazioni sequenziali.

Ecco cosa vuole dire avere macchine che “provano e riprovano” finché non riescono ad azzeccare la combinazione giusta! Con hashrate si identifica l’ammontare di potenza di calcolo che è presente sulla rete in quel momento.

Avere macchine che fanno questo tipo di calcolo sottintende che devono essere accese ( e quindi consumano elettricità )

Quella macchina che per prima trova il risultato si aggiudica la possibilità di scrivere un nuovo blocco in coda agli altri: questo ha anche un riscontro economico, infatti al fortunato trovatore saranno riconosciuti di 6.25 nuovi bitcoin oltre che alle commissioni che gli utenti sono disposti a cedere per vedersi incluse le proprie transazioni nel blocco. L’ammontare dei nuovi bitcoin riconosciuti al minatore che per primo risolve il puzzle ( nel momento in cui scrivo sono pari a 6,25 bitcoin ) sono anch’essi deflazionare e si dimezzano all’incirca ogni 4 anni – o meglio dopo 210.000 blocchi; questo fenomeno prende il nome di halving

 

Creazione di una catena di blocchi correlati

Divertiamoci ancora un pò e creiamo una blockchain a partire dal primo blocco creato in precedenza: il risultato sarà di questo tipo:

La proof of work di bitcoin esemplificata

 

Se volessi manomettere il primo blocco, dovrei alternare anche il blocco successivo e così via. Per giungere a questo risultato però mi dovrei assicurare in qualche modo che sia io a risolvere in maniera più veloce il rebus successivo in modo da manomettere la sequenza.

Diversamente, se qualcuno scovasse prima di me il nuovo risultato, vedrebbe che ho barato. Ed avviserebbe tutti gli altri utenti ( nodi ) della rete che quello che ho fatto in precedenza era fasullo.

Se non controllo la maggior parte della potenza della rete ( 50% +1) probabilmente sarei fregato prima di iniziare. Detenere così tanta potenza ad un singolo individuo/ corporation / nazione ha un costo elevatissimo: ecco il potere della decentralizzazione. Il singolo non può nulla contro una rete distribuita dove la somma delle singole potenze è maggiore.

Ecco perchè ragionevolmente si può essere sicuri che solamente dopo un paio di blocchi successivi a quello che contiene la transazione che sto monitorando, ci si possa fidare al 100%.  Fin dalla nascita di bitcoin ad oggi, non è mai stato effettuato/ riuscito una situazione come quella descritta, tecnicamente definita di “double spending”, in cui un minatore maligno vuole spendere 2 volte i propri satoshi ingannando gli altri

 

Rissumendo: per falsificare un blocco e far sì che tutta la rete creda nel tuo blocco fake, allora dovrai tenedenzialmente avete una capacità superiore alla metà di calcolo presente , quindi il classico 50% + 1 ( o detto anche per semplicità 51%) per poter creare più velocemente i blocchi degli altri e rendere approvato di fatto il blocco fake che hai creato. Ecco perchè dovresti avere la potenza per creare 2/3 blocchi di fila (e quindi risolvere il puzzle crittografico) perchè la rete ritenga vero e valido il blocco fake.

È molto molto mooooolto difficile poterlo realizzare. Ma non impossibile. 

 

Ricalcolo della difficoltà di potenza

Abbiamo detto che mediamente ogni nuovo blocco viene estratto / minato / indovinato dopo 10′. Cosa succede con il tempo crescono gli attori ( miners)  in competizione ed la potenza delle macchine attraverso l’evoluzione della tecnologia ?

Il nostro maestro Nakamoto ci aveva pensato anche a questo. Personalmente la trovo la ciliegina sulla torta. Infatti per mitigare questa reale possibilità, nel codice di bitcoin è previsto un ricalcolo della difficoltà per trovare la soluzione al puzzle ogni 2.106 blocchi, e tiene in considerazione la potenza di calcolo dei 2.106 blocchi precedenti.

Sostanzialmente se c’è più potenza nella rete rispetto a prima, allora automaticamente sarà più difficile trovare la risoluzione al puzzle crittografico esemplificato precedentemente: l’obiettivo resta quello di poter estrarre mediamente un nuovo blocco ogni 10 minuti. Infatti senza questa prezioso escamotage con l’aumentare dei miner aumenterebbe la potenza e si riuscirebbe a trovare più facilmente la soluzione. In questo modo invece anche se aumentasse nel tempo la potenza – come di fatto è sempre avvenuto – non aumentano i blocchi estratti nell’unità di tempo.

Brillante, vero?

La grande sfida del consenso della proof of work è la riduzione del consumo di energia per poter mantenere un sistema sicuro e decentralizzato. Esistono esempi negli anni di soluzioni per incanalate e sfruttare il calore generato dalle macchine di mining per riscaldare interi centri commerciali. Finora è l’unico modo per “far spendere” a chi vuole provare a trovare la soluzione del puzzle.

Do ut des. 

E finora ha sempre funzionato.

Tutti gli attori coinvolti nella filiera hanno un incentivo a far funzionare questo sistema. Senza alcun punto di attacco centrale. In cui non è possibile censurare perchè totalmente decentralizzato.

Welcome Future.

Lascia un commento

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

Il tuo Nome

Commento