LEZIONE 05 – LA BLOCKCHAIN, SPIEGAZIONE E DIMOSTRAZIONE PRATICA (parte 1)


In questa nuova lezione andremo a vedere una dimostrazione passo passo di come funziona la Blockchain per arrivare a capire che legami ci sono con Bitcoin.
Cercherò di organizzarla in modo visivo con delle immagini per renderla il più semplice possibile da comprendere analizzando i concetti chiave.

Prima però di iniziare a parlare di Blockchain dobbiamo fare un passo indietro e cercare di capire un concetto predominante in questo argomento.

Dunque…. diamo un’occhiata
a questo termine “SHA256 hash”.
Il termine “hash”, del quale vedete qui un esempio


sembra una sequenza casuale di caratteri
ed è essenzialmente una “impronta digitale”
che identifica un insieme di dati digitali. In questo caso
è l’impronta” di ciò che scrivo nel  questo campo “data”.


Se scrivo il mio nome, Giuseppe,
potete vedere che il campo “hash” viene modificato

link per testare questa funzione  https://andersbrownworth.com/blockchain/hash


e cambia ogni volta che digito anche solo un carattere diverso.

Qui avete tre esempi dove scrivo : giu, giuse e giuseppe2021


Se io elimino ciò che è scritto nel campo “data” e poi riscrivo ciò che avevo inserito all origine, vale a dire il mio nome “giuseppe”
vedrete che l’hash inizia nuovamente allo stesso modo del primo esempio ed è quindi sempre lo stesso.


Possiamo quindi dire che l hash è l’impronta digitale di questi dati.
Qualunque dato si inserisca nel campo “data”
ogni volta che scrivete lo stesso dato
otterrete lo stesso identico valore di hash.
Potete scrivere ciò che volete:
Potete lasciare il campo vuoto, e otterrete e3b0………….
che corrisponde all’hash del nulla
oppure potete inserire una grande quantità di dati,
potreste scriverci un intero libro
e otterreste comunque un hash
e la cosa interessante è che, indipendentemente
dalla quantità di informazione che viene inserita
sia essa una piccola quantità o no,
l’hash ottenuto sarà sempre della stessa lunghezza,
sempre lo stesso numero di caratteri.
Non saremo mai in grado di indovinare la sequenza dell hash, ed otterreste sempre lo stesso hash
indipendentemente dal numero di volte che inserite
la stessa informazione.

Riassumendo possiamo dire che:

l’HASH, o impronta digitale, è il risultato di un algoritmo chiamato appunto funzione di Hash.

Le funzioni di Hash hanno 2 caratteristiche principali:

1 – da una stringa di lunghezza arbitraria (casuale e di qualsiasi lunghezza) danno una stringa di lunghezza definita;
2 – sono funzioni irreversibili, e cioè dal risultato ottenuto (la striga di lunghezza definita) non è possibile risalire alla stringa di lunghezza arbitraria di partenza.

Negli esempi fatti qui sopra la funzione “S.H.A. 256” che è appunto una delle funzione HASH usata dal sistema bitcoin ha la caratteristica di dare come risultato una stringa alfanumerica lunga sempre 64 caratteri a prescindere dalla lunghezza (arbitraria appunto) della stringa di partenza. Il nome S.H.A. 256 deriva dal fatto che la funzione matematica trova un numero binario di 256 cifre/bit (cioè una successione di 265 zeri e uno) che trasformato in esadecimale risulta essere una stringa di 64 caratteri.

Se abbiamo bene in testa questo concetto passiamo ora al punto successivo…… 👍👍👍


Ciò che vorrei fare ora è estendere questa idea di hash
in un altra cosa che da ora in poi chiameremo “blocco”.
Vediamo come è fatto un blocco.  


Questo è un blocco, simle all’esempio del hash ma con una sezione suddivisa in tre parti.
Uno è chiamato “Blocco”, che contiene un numero, qui n. 1. Poi abbiamo il campo “Nonce” che contiene un altro numero che esamineremo tra poco
e poi ancora un campo “Dati”, simile a quello visto
in precedenza.
Una particolarità del campo hash
che vedete qui sotto, e che si riferisce a tutte le informazioni riportate sopra,
è che inzia con la sequenza 0000.


Si tratta di un hash relativamente inusuale in quanto è molto difficile che il risultato hash inizi esattamente con 0000 ma in questo caso è così e quando si verifica questa condizione,
in modo del tutto casuale
diremo per nostra convenzioni ai fini dell esempio didattico che questo blocco è “firmato” e il colore verde di sfondo ci dà conferma di ciò.
Ora, cosa succederebbe se modificassi
una parte qualsiasi di questa informazione?
Ad esempio se scrivessi qualcosa nel campo “data”…per esempio la parola “gatto”.

link per testare questa funzione https://andersbrownworth.com/blockchain/block


Il valore dell’hash verrebbe modificato…. Inoltre quale sarebbe la probabilità che scrivendo lettere diverse il risultato dell’hash
inizi ancora con 0000?
Molto bassa, praticamente nulla…
Allora vediamo cosa accade quando lo facciamo
Scrivo ad esempio “ciao”.

Guardate!
l’hash non inizia con 0000….
E lo sfondo della finestra è ancora rosso.
A questo punto sapete che questo blocco, contenente queste informazioni, non è valido,
non è un blocco “firmato”.


E qui entra in gioco il campo “nonce”.


Il “nonce” è un numero che potete impostare
cercando un valore tale da far tornare l’hash
a una sequenza che inizi con 0000.
Come possiamo trovare tale valore?
Iniziamo a impostare nonce a 1,
e vedremo che  l’hash inizia in un modo
Proviamo con nonce a 2, ora abbiamo un altro hash
3, 4, 5, 6, avete capito ora, potrei stare qui tutto il giorno fino a che sia in grado di trovare un hash che inizi con quattro zeri.

Il risultato con appena sei tentativi di “nonce” è che il blocco 1 contenente nel campo “data” la parola “ciao” risulta non valido e non firmato.

Ora nella demo ci viene in soccorso come aiuto a disposizione un pulsante denominato “Mine”… immagino vi siate chiesti cosa succeda se lo premo.
Ciò che accade è che il software della demo didattica prova a scorrere in modo automatico tutti i valori di “nonce” da 1 in su fino a trovarne uno
tale che, combinato insieme agli altri due campi vale a dire “block” e “data” generi un hash che inizi con 0000 e che quindi soddisfi la condizione di blocco valido e firmato.

Andiamo a premere il pulsante “mine”…..

E in questo caso solo dopo qualche secondo vedremo che…..

Al tentativo n° 10579 di inserimento del nonce abbiamo ricavato un hash valido che come vedete inizia con 0000 e soddisfa la mia definizione di blocco firmato.

Questo processo prende il nome di MINING e lo analizzeremo bene e un po’ più fondo nel corso della lezione…

N.B. Ci tengo a precisare che il tempo di ricerca del nonce corretto si basa o meglio ancora utilizza la potenza computazionale dell hardware su cui è installato il software, nel nostro caso  la suddetta demo. Ai fini didattici diamo per valido e firmato un blocco con un hash che inizi con 4 zeri ma nel caso specifico di Bitcoin ci troviamo di fronte a esempi di hash con ben più zeri all inizio e quindi che necessitano di una potenza computazionale maggiore e improponibile rispetto all esempio preposto…. In sostanza in tutta la lezione analizziamo in piccolo cosa in realtà avviene…. Giusto per darvi qualche esempio vi posto una foto esplicativa….

Nella prima colonna avete il numero di zeri con il quale deve cominciare l hash, nella seconda colonna il numero di tentativi di nonce per ottenere nello specifico quel hash e nella terza approssimativamente il tempo necessario.

Nel momento in cui sto scrivendo questo articolo e cioè il 22 agosto 2021  ci troviamo al blocco numero 697047. L hash dell ultimo blocco valido è il seguente

0000000000000000000c3c81d741a6e2d3811cd895d91bcd8645ed7abed7d1fe

Ci troviamo quindi di fronte ad un hash con 19 zeri iniziali. Lascio a voi immaginare senza andare troppo nei tecnicismi e dando un occhio alla tabella sopra (che tra l altro si ferma ad un hash con 15 zeri) quanta potenza computazionale è richiesta per ottenere questo hash in un tempo stabilito dal protocollo Bitcoin di circa 10 minuti….

In questo preciso momento tutta la rete Bitcoin produce questa quantità di hash al secondo ⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️

Stiamo parlando di una cifra di 128.32 esahash al secondo pari a 128321761695410300000 hash al secondo.

Vi allego anche una tabella con la conversione da HASH al secondo ad unità superiori in modo da rendervi conto dei valori.

Ok, quindi abbiamo visto ed analizzato cos’è un blocco…..


Ora invece dobbiamo cercare di capire cosa è una “blockchain”…
In buona sostanza è una catena di blocchi come quello che abbiamo visto….e per definizione del termine possiamo dire che :

La blockchain è un registro pubblico digitale distribuito, immutabile e decentralizzato.


Ma come connettiamo i blocchi uno all’altro?
Proviamo a farlo insieme

Dunque date un occhiata a questa immagine dove vedete un blocco come quello appena analizzato ed un altro al suo fianco destro.

link per testare questa funzione https://andersbrownworth.com/blockchain/blockchain

D ora in poi nel proseguo della lezione aggiungiamo un elemento in più…

Nella struttura del blocco oltre al numero del blocco, il campo data e l hash troviamo un campo nuovo denominato “Prev” e cioè l hash del blocco precedente.
Come si può vedere dalla foto in questo primo blocco l hash del blocco precedente è composto solo ed esclusivamente da tutti zeri in quanto prima di suddetto blocco non esisteva nulla. Chiameremo questo primo blocco  “Blocco genesi”, da dove tutto ha inizio.


Scorriamo in avanti e analizziamo il blocco n. 2 e notiamo che l hash del blocco precedente nel campo “Prev” è identico all hash del blocco numero 1 della catena di blocchi, la nostra blockchain.

Andando avanti e guardando il blocco  n 3, n 4 e n 5 questa condizione si presenta sempre.

Nel blocco 3 troviamo l hash precedente del blocco 2 nel campo “Prev”
Nel blocco 4 troviamo l hash precedente del blocco 3 nel campo “Prev”
Nel blocco 5 troviamo l hash del blocco 4 nel campo “Prev”


Ogni blocco in questo modo “punta” a quello precedente e questo, scopriremo e chiariremo tra poco, è il vero punto di forza della blockchain.


Ora in un modo simile a quanto abbiamo fatto prima,
cosa succederebbe se modificassi le informazioni di un blocco ora che sono concatenati l uno all altro?

Semplice….Verrebbe modificato l’hash di quel blocco,
rendendo il blocco non più valido. Proviamo.
Basta scrivere per esempio “palla” nel campo data del blocco numero 4 e il blocco non è più valido.

Ora il blocco 4 e i successivi si sono colorati di rosso e ci fanno capire dunque che i blocchi non sono validi.
Tutto ciò è dato dal fatto che avendo cambiato anche un singolo valore nel blocco (nel nostro caso abbiamo aggiunto la parola “palla” al campo data) in automatico è cambiato il valore dell hash di quel blocco rendendo da lì in poi non più valida la catena, la nostra blockchain.

Se notate bene anche il blocco 5 risulta non valido. Questo perché è venuta a decadere la regola fondamentale in base alla quale ogni blocco deve puntare a quello precedente. Infatti uno dei campi del blocco 5 e cioè l hash del blocco precedente (prev) non ha lo stesso valore dell hash del blocco 4.

I blocchi precedenti al 4 sono tutti verdi e validi ma dal blocco 4 in poi la nostra blockchain risulta invalidata.


La domanda ora nasce spontanea… Se io volessi cambiare qualcosa in questa blockchain per rimettere le cose a posto come dovrei fare?
Potrei ad esempio andare al blocco n. 4 e ricalcolare l hash tenendo presente che nel campo data debba esserci la parola “palla”.

Proviamo a farlo!!!!! Premiamo il tasto “mine” nel blocco numero 4


La demo, che simula in piccolo cosa realmente fanno i miners usando la loro potenza computazionale con hardware dedicati, con molteplici tentativi sceglierà un valore di “nonce” tale da generare un hash che inizia con “0000”.

A volte l’operazione richiede tempo perchè è necessario
fare diversi tentativi ma alla fine il risultato è questo :


Il valore di nonce che rende il blocco valido trovato è 78594.

Notiamo però che affinché tutta la catena sia valida è necessario minare nuovamente anche il blocco successivo e cioè il numero 5. Infatti ora il blocco 5 tra i suoi campi ha un hash del blocco precedente (il numero 4) diverso da prima e ciò produce un hash del blocco non valido in quanto non soddisfa la nostra richiesta di iniziare con 0000.

Siamo quindi pronti per minare nuovamente il blocco 5

E dopo svariati tentativi di calcolo del hash arriviamo ad avere finalmente il nostro blocco 5 firmato e valido con un valore di nonce pari a 10101.

Ciò che è importante capire è che se io
modifico un dato nell’ ultimo blocco tutto ciò che occorre per rendere la catena corretta è rifare il mining di quell’ultimo blocco.

Se invece vado molto indietro nel tempo ed eseguo una modifica dovrei rifare il mining di tutti i blocchi successivi.

Quindi più blocchi passano, cioè più andiamo indietro nel tempo e più diventa difficile modificare i dati della blockchain perché ciò richiederebbe un dispendio di potenza computazionale spropositato.

Questo è il modo in cui la blockchain resiste a mutazioni e a cambiamenti.
Ammettiamo per un attimo che ciò possa avvenire….
Come è possibile sapere se la blockchain abbia subito una operazione di remining e sia stato modificato qualche dato all interno delle transazioni?



Vediamolo insieme. Innanzitutto cerchiamo di capire dalla foto qui sotto cosa si intende per rete Distribuita e cosa lo differenzia da una rete Centralizzata o decentralizzata…..

La foto rende molto bene l idea quale è il rapporto di connessione tra un nodo e un altro….

Assimilato questo, all’ interno della demo spostiamoci nella sezione “Distributed”e andiamo a chiarire nel pratico tutti i concetti! 👍👍👍👍

link per testare questa funzione             https://andersbrownworth.com/blockchain/distributed


Ora abbiamo una blockchain distribuita tra tutti i nodi della rete.

PICCOLO APPROFONDIMENTO :

Dal punto di vista strettamente tecnico, un full node Bitcoin è un software realizzato secondo il protocollo Bitcoin e che verifica completamente tutte le sue regole.
Ad oggi risultano in totale più di 10.000 nodi pubblici ma si stima ce ne siano molti di più privati, ovvero installati per essere utilizzati solo dal gestore.

I nodi Bitcoin hanno un compito fondamentale: conservare la blockchain.
A oggi la blockchain di Bitcoin è un file di circa 413GB che contiene tutti i blocchi di Bitcoin con al loro interno tutte le transazioni che siano state registrate sulla blockchain fin dal suo esordio il 3 gennaio 2009. Installare un nodo Bitcoin è molto facile, ma è anche un processo lungo, sia perchè una volta installato deve scaricarsi tutti i 413 GB della blockchain, sia soprattutto perchè deve verificare, uno ad uno, gli oltre 700.000 blocchi siano conformi al protocollo. Il processo di convalida non è rapidissimo, e visto che i blocchi da verificare sono molte centinaia di migliaia a volte può richiedere addirittura giorni.

Il compito dei nodi di Bitcoin è solamente quello di verificare e custodire la blockchain.

Nel 2009, quando fu minato da Satoshi Nakamoto il primo blocco della blockchain di Bitcoin, esisteva un unico software, chiamato da Nakamoto semplicemente Bitcoin, che fungeva sia da nodo che da wallet, e che serviva anche per minare i blocchi. Nel corso del tempo però il mining si è fatto sempre più difficile, quindi sono stati sviluppati software appositi per il mining. Allo stesso tempo ci si accorse che erano necessari wallet che non dovessero scaricarsi e verificare l’intera blockchain, e quindi sono anche nati i software wallet stand-alone.

Una domanda che mi sono fatto è se sarebbe possibile immaginare una Blockchain così sicura ed anche “indipendente” senza Bitcoin? Chi pagarebbe altrimenti il mantenimento di una rete così ampia e quindi così sicura? E se qualcuno lo facesse mi viene da chiedermi: che interesse ha a farlo?… La Blockchain ha bisogno di Bitcoin per essere sicura e Bitcoin ha bisogno di una Blockchain per essere decentralizzata. Per questo tra Blockchain e Bitcoin c’è un rapporto di simbiosi. Satoshi Nakamoto su questo ci aveva visto lungo!!!!

Ma ora torniamo nel nostro piccolo alla demo….. Nel nostro caso (guardando la foto) abbiamo una blockchain distribuita tra 3 nodi (Peer) che condividono gli stessi 4 blocchi.
Nella realtà al di fuori di questa demo ci sono moltissimi nodi connessi alla rete Bitcoin e tutti hanno una copia completa della blockchain.

Quello che vorrei fare adesso è mostrarvi come possiamo alterare la validità di una catena in uno o più nodi della rete.
E ora lo dimostriamo andando qui…..

Bene… Date un occhiata alla foto qui sotto…..e inseriamo qualcosa, ad esempio come prima la parola “gatto”.

Nell esempio della foto il blocco della catena del nodo B (Peer B) ha subito una modifica in quanto è stato alterato il campo “data” inserendo la parola “gatto”. Sappiamo quindi bene che ciò ha generato un hash del blocco non valido (blocco di colore rosso) che necessita quindi il suo ricalcolo agendo come al solito sul pulsante “mine”.

Una volta eseguito il remining del blocco il risultato sarà questo:

L hash del blocco 4 della blockchain del Peer B può essere considerato valido e firmato in quanto soddisfa la nostra particolare esigenza, sempre in base all esempio di questa demo, di avere un hash del blocco il cui valore inizi con 0000. Tuttavia abbiamo bisogno di fare un altra operazione e cioè il remining del blocco 5 in quanto come si vede il suo hash non può considerarsi valido (blocco di colore rosso). Premiamo nuovamente il tasto mine nel blocco 5 e vediamo cosa succede…..

A questo punto il blocco è valido e firmato e tutte le 3 catene distribuite tra i 3 nodi sono verdi…….

Tuttavia c è qualcosa che non va nella blockchain distribuita…..

Nella prima catena (Peer A) il campo hash dell’ultimo blocco ha un valore di 0000e4b9……

Nell’ultima catena in basso (Peer C) l hash riporta lo stesso valore e cioè 0000e4b9…..

mentre nella catena centrale (Peer B) l hash ha un valore pari a 0000eb3ad….


Quindi anche solo guardando velocemente il valore dell’ultimo hash della catena ci accorgiamo che c’è qualcosa di non corretto in questa catena. Anche se tutti i valori hash iniziano con 0000 mi accordo facilmente che la catena al centro è diversa.

Ed è differente perchè ci sono due prove contro una (Peer A + Peer C contro Peer B). Viene applicato una specie di principio di “democrazia”.



Due blocchi dichiarano che il valore corretto dell hash sia 0000e4b9…. Mentre un altro sostiene che sia corretto 0000eb3ad….

Quindi il valore 0000e4b9… “vince”.

FOCUS SUL NUMERO DI CONFERME NELLA BLOCKCHAIN DI BITCOIN:

Una regola inserita nel Porotocollo informatico di Bitcoin è che la Blockchain continua sempre sul suo ramo più lungo (quello che nell’immagine è colorato di verde), e tutto il resto viene ignorato. Supponiamo che l’ultimo blocco confermato (e cioè sigillato con l’Hash) della Blockchain sia il blocco numero 100. E supponiamo che un miner “disonesto” (di seguito attaccante) voglia contraffare questo blocco e quindi lo modifichi. Ovviamente potrà apporre tale modifica solo sulla copia della Blockchain che ha sul suo server, e poi dovrà cercare di far accettare e quindi divulgare la sua copia “contraffatta” nel resto della rete.

Per riuscire nel suo intento l’attaccante dovrà aggiudicarsi la gara sul blocco 101 (perché deve essere sul ramo più lungo se vuole “esistere”) e prima ancora dovrà trovare un nonce per il blocco 100 che ha modificato in modo che il sistema non evidenzi il suo tentativo di contraffazione. In sostanza lui dovrà riuscire a trovare 2 nonce (per il blocco 100 e blocco 101) prima che un qualunque altro miner (che sono migliaia…) riesca a trovarne uno solo, ovvero quello per il blocco 101. Gli ci vuole una potenza di calcolo inaudita ed una fortuna sfacciata…

Il tutto sarà esponenzialmente ancora più improbabile se vorrà contraffare una transazione del blocco 99 perché dovrà trovare tre nonce… e così avanti andando indietro nei blocchi della Blockchain. Infatti per misurare la sicurezza di una transazione si indicano il numero delle conferme che ha ricevuto: se l’ultimo blocco confermato è il numero 100 allora una transazione presente ad es. nel blocco 98 si dice abbia 3 conferme ovvero la conferma del blocco 98, quella del blocco 99 e quella del blocco 100.

Per “convenzione”, solo una transazione che abbia ricevuto 6 conferme viene considerata sicura al 100%.

Nasce così il concetto di “immutabilità” della blockchain.
In una blockchain distribuita e decentralizzata (come Bitcoin), chiunque volesse “hackerare” e/o manomettere un determinato dato, non solo dovrebbe manipolare i dati del blocco in questione, ma di tutto il registro, per di più dovrebbe farlo simultaneamente sulla maggior parte dei nodi presenti nella rete.

Bene……siamo arrivati al temine di questa prima parte…..Ho preferito dividere in due parte questa lezione perché i concetti sono molti e vale la pena assimilarli per bene…. Nella seconda parte di questa lunga lezione andremo ad aggiungere il fattore importante alla Blockchain e cioè la sua utilità…

Andremo ad inserire una moneta all interno di essa…..e ci renderemo ben presto conto di come NON possa esistere una Blockchain senza bitcoin e tantomeno Bitcoin senza Blockchain !!!!!

A presto 😜 😜😜😜 !!!

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: