venerdì 6 settembre 2019

[BITCOIN] Un tuffo dentro le transazioni - SHA256

Nello scorso post, (pubblicato anche su OraZero) ci siamo occupati di come funziona la firma digitale in bitcoin. In particolare, abbiamo focalizzato la ns. attenzione sulla chiave pubblica.

La chiave pubblica é la ragione per cui bitcoin viene chiamata criptovaluta: coloro che si scambiano bitcoin non sono noti con nome e cognome, ma solo attraverso la chiave pubblica, che é un lunghissimo numero intero.

Oggi ci occupiamo di un altro pezzo di matematica che é uno dei mattoni di Bitcoin: il protocollo SHA256 (pronunciato sciá256).

Cosa fa lo SHA256, in generale?

Prende un messaggio di qualsiasi lunghezza (arbitrary length) in ingresso e lo trasforma in un numero finale lungo sempre 256 bit (fixed length hash).

In figura, si vede un foglio con una lunghezza qualsiasi del messaggio che viene "digerito" dall'algoritmo HASH per produrre una stringa sempre della stessa lunghezza.

Facciamo un esempio.
Il messaggio é "Ciao, mi chiamo LORENZO"

Se questo messaggio viene dato in pasto allo SHA256, il risultato é questa stringa:

a9c1f53cf1ef7748e58d40c1962c66bca0a5ead806f9406e670559cbeb936322

Cosa succede se cambio leggermente il messaggio?
Per esempio, scrivo "Ciao, mi chiamo LOREMZO".

Fra la "N" di loreNzo e la "m" di loreMzo ci passa la differenza di un solo bit. Un computer infatti interpreta la M con la stringa 01001101 mentre interpreta la N con la stringa 01001110. Tra le due stringhe la differenza é che l'ultimo 1, quello piú a destra, si trasforma in uno ZERO.
Errori di questo tipo (bit flip) possono capitare in qualsiasi sistema di trasmissione.

Cosa succede se cambio di 1 bit il messaggio? 

Ecco che succede, SHA256 produce la seguente stringa:

647ea82437cfbb4af011435b58ed03a8d847e71185f0fbc00c040d0d23348292

Confrontiamo le due stringhe:

Mi chiamo LORENZO:  a9c1f53cf1ef7748e58d40c1962c66bca0a5ead806f9406e670559cbeb936322
Mi chiamo LOREMZO: 647ea82437cfbb4af011435b58ed03a8d847e71185f0fbc00c040d0d23348292

Le due stringhe sono completamente diverse. Questa é una caratteristica del protocollo SHA256.

Se una stringa viene manomessa, anche impercettibilmente, il risultato é completamente diverso.

Cambiamo messaggio: "Ciao, mi chiamo LORENZO, vivo in Olanda, mi piace la carne alla griglia".

Ecco la stringa che ne esce applicando l'SHA256.

996862d188f0834921c2677eafe1c5c7e399c98a988fe0410180fbd3b017b833

Osserviamo che la stringa é cambiata di nuovo, come ci aspettavamo, ma la lunghezza é rimasta invariata, pari a 64 caratteri, anche se il messaggio originale era molto piú lungo.

Supponiamo ora che il messaggio sia la lettera "a". Un solo carattere!

"a" si trasforma in a7da489976d0047490617adb4f7a1f27f7af8b52a5176fd002ffe471863520ab

Capiamo quindi che la SH256 ha un'altra caratteristica importante: qualunque sia il messaggio  iniziale, la stringa finale é sempre lunga 64 caratteri. 

Una funzione che prende un messaggio di qualunque lunghezza iniziale e lo trasforma in una stringa che mantiene sempre la medesima lunghezza é chiamata HASH function. Protocolli di condivisione file come Torrent o eMule adoperano le funzioni hash per identificare i file condivisi. Anche il compressore ZIP produce hash dei file compressi. Se modificate un video tagliando anche un solo fotogramma, e lasciate il nome del file invariato, la chiave HASH cambia completamente. Il file modificato viene considerato un nuovo file, come é giusto che sia.

Qual é il vantaggio? E'evidente: anziché stare a confrontare i due video bit per bit, che richiede una VITA e un sacco di corrente, si confrontano le due chiavi HASH. Se sono uguali, i due file sono gli stessi; se sono diverse, i due file sono differenti.

Nota per i pignoli: in realtá esiste una possibilitá remotissima che due file diversi abbiano la stessa hash, cioé la stessa "firma", ma di fatto la probabilitá é zero quindi non ci interessa. Si parla di resistenza alla collisione. 

Notare inoltre che la funzione é HASH produce sempre lo stesso risultato se il messaggio é sempre lo stesso, indipendentemente da chi lo produce e dal momento in cui viene prodotto (un mese fa, oggi, tra un anno). Non é che la chiave HASH cambia a seconda del momento o di chi produce il messaggio. La funzione HASH é cioé deterministica.

Una proprietá accessoria nel mappare messaggi di lunghezza arbitaria in una hash lunga 256 bit, o 64 caratteri, é che NON é possibile ricostruire il messaggio iniziale, a meno di TENTATIVI costosissimi.

Vediamo di spiegare questo concetto.

Supponiamo che devo ricreare la stringa in cui dico che mi piace la carne alla griglia. Eccola:   "996862d188f0834921c2677eafe1c5c7e399c98a988fe0410180fbd3b017b833".

Chiamiamo questa stringa, "stringa bersaglio".
Comincio con la lettera A e provo ad adoperare l'SHA256. Scopro che la stringa non "matcha".
Passo alla lettera B. Niente. Vado avanti...
Finché non passo all'algoritmo la stringa "Ciao, mi chiamo LORENZO, vivo in Olanda, mi piace la carne alla griglia." la chiave HASH ritornata dall'algoritmo non é uguale a quella bersaglio.

Quanti tentativi devo fare?
E'abbastanza semplice da calcolare. Assumendo che la stringa di partenza sia lunga fino a 100 caratteri, e ogni carattere é lungo 4 bit, devo poter arrivare a fare 2^400 tentativi partendo da due tentativi (un solo ZERO o un solo UNO) iniziali.
Significa 2+2^2+2^3+.....2^399+2^400. Fa 2^401 -2. Se non sono troppo sfigato, la becco a metá dei tentativi, quindi in totale mi aspetto di fare 2^400 tentativi.

Quant'é 2 elevato alla 400?
Vediamo. 2^10 é circa mille. 2^400 = 2^40 * mille. Significa un 1 seguito da centoventi zeri.
Diciamo un miliardo di miliardi di miliardi di miliardi di miliardi di miliardi di miliardi etc di tentativi.
Insomma, capite il punto. Ricostruire il messaggio iniziale é economicamente improponibile, perché dovrei far girare tutti i computer del mondo per qualche anno per ricostruire il messaggio "Ciao, mi chiamo LORENZO, vivo in Olanda, mi piace la carne alla griglia."

Forse per qualcuno del PD é utile, ma noi siamo pratici e desistiamo.

Che succede se nella stringa bersaglio aggiungo un solo carattere? Che so, dovete azzeccare la frase "Ciao, mi chiamo LORENZO, vivo in Olanda,  mi piace la carne alla griglia."
Nota: trovate l'extra carattere!

Significa che abbiamo aggiunto 4 bit. Ricordate, un carattere sono 4 bit. Significa che abbiamo aumentato la complessitá della chiave bersaglio di  2^4 cioé 16 volte.

Tutto questo luuuunghissimo preambolo per dire cosa?

Per dire che Bitcoin usa una stringa bersaglio molto lunga, che va indovinata dai miners per validare le transazioni ed essere ripagati in bitcoin per la corrente consumata e l'equipaggiamento hardware.

Se la stringa bersaglio si allunga, occorrono piú risorse a paritá di tempo (che so, dieci minuti) per azzeccare la chiave.
In un altro articolo entreró nel dettaglio della stringa da indovinare usata in Bitcoin. Per ora mi interessa capire e farvi capire il principio. Stringa lunga --> tanta corrente per minare. Stringa corta --> poca corrente per minare.

CONCLUSIONI e DOMANDE TRABOCCHETTO

Si dice nei giornali che i miners di bitcoin effettuano complicatissimi (very complex) calcoli per minare. E'vero? 
NON é vero. I calcoli non sono complicati. La chiave HASH ve la potete calcolare a mano. E'solo cosa lunga. Questo nasce da un equivoco. E ora ve lo spiego.
In linguaggio ordinario, complessitá (complexity) indica quanto un problema ha ramificazioni, collegamenti con altre parti. Immaginate un cespuglio. Pochi rami, poco complesso; tanti rami, molto complesso, difficile da mappare e seguire da un punto all'altro, specie se dei rami si uniscono.
In informatica, complessitá é il volume di risorse impiegate per far girare un algoritmo.

Quindi, giusto per essere precisi, non é che Bitcoin risolve calcoli complessi, Bitcoin semplicemente richiede una enorme quantitá di risorse di calcolo per azzeccare una banalissima chiave HASH che col mio PC creo in meno di un centesimo di secondo.

Bitcoin é cripto perché usa lo SHA256?
NO, bitcoin é cripto perché usa la firma digitale, su cui ho giá abbondantemente scritto.

Ma lo SHA256 non consente di ricreare il messaggio iniziale! E' questo lo scopo!
NO, lo scopo dell'SHA256 é quello di rendere COSTOSA l'operazione di mining. Indovinare la stringa bersaglio costa un sacco di corrente. L'SHA nell'operazione di mining viene applicata due volte. I nodi della rete Bitcoin che poi devono verificare che la stringa bersaglio sia stata indovinata, ovvero che il miner non stia frodando il sistema, impiegano una frazione di secondo.

Si dice che la complessitá aumenta man mano che passa il tempo
DIPENDE: se sempre piú miners si aggiungono, la complessitá aumenta, seconda la definizione informatica di complessitá: basta aggiungere un po' di bit alla stringa bersaglio per rendere piú lunga l'operazione di mining. Non é piú complicata, é solo piú lunga e richiede hardware piú potente.
Se ai miners levano la corrente, oppure i miners spengono i server perché il bitcoin é sceso di valore e non ci pagano la bolletta elettrica, la complessitá diminuisce e la stringa bersaglio diventa piú corta e si indovina con maggiore probabilitá e consumando meno corrente. E'successo in passato specie nel 2018 quando il bitcoin era crollato di valore. Discuteremo in un articolo futuro la misura della difficulty di bitcoin.

BITCOIN é il futuro perché tutta questa matematica (firma digitale, SHA256) é figa e quei disonesti dei banchieri centrali non la capiscono, ecco perché lo temono!
NO, i banchieri centrali hanno fior di consulenti con le palle che di Bitcoin ci capiscono molto piú dei venditori di consulenze su internet. Come ho giá abbondantemente scritto, il punto é quanto sia ecosostenibile Bitcoin.

Lorenzo, tu ce l'hai con le criptovalute! non sei obiettivo!
NO, io ce l'ho con i creduloni e con i venditori di consulenze ad catzum. Blockchain e Bitcoin sono una invenzione bellissima, ma come ogni invenzione si porta dietro pregi (moltissimi, tra cui il calcolo distribuito) e difetti (ecosostenibilitá).

Lorenzo, in futuro questi problemi li risolveranno! Hai visto che con la Lightning Network stanno risolvendo il problema delle limitate transazioni?
VERO, la LN é promettente. Ma il problema di fondo, minare con SHA256, rimane. Questo é il CUORE di Bitcoin.

Lorenzo, se anche molti miners smettono di minare perché la corrente gli costa troppo, la complessitá diminuisce riportando bitcoin in un punto di equilibrio. 
VERO, ma é accademia. Finora il consumo della corrente é passato da un laptop all'Irlanda. Piú il bitcoin é usato, maggiore il suo valore, maggiore il numero dei miners, maggiore é il consumo di combustibili fossili.
Il punto merita senz'altro approfondimenti e la osservazione é sensata. Ma rimaniamo pragmatici.

Lorenzo, lo SHA256 l'hanno inventato i servizi segreti americani! Non ci impiegano niente a buttare giú la rete!
, se qualcuno buca lo SHA256 e ricostruisce la stringa bersaglio in poco tempo, comunque i nodi devono validare la stringa. Si aumenterebbe la lunghezza della stringa bersaglio di molto per renderla non bucabile. Si passerebbe, che so, a SHA1024 o SHA2048. In ogni caso, sono scenari da complottisti. Il punto é che la complessitá serve per garantire che i bitcoin non vengano minati facilmente, altrimenti il primo che trova il trucco per minare in pochi secondi fa una barca di soldi, prima che lo scoprano,,,il che richiede pochi secondi. Certo, nel momento di transizione ad una piú complessa SHA, il bitcoin collasserebbe perché la gente verrebbe presa dal panico.

________________________________________________________________________________
L'avventura si fa sempre piú intrigante. Poi vedremo il modello computazionale della difficulty di Bitcoin, la Lighting network, come sono fatti gli ASIC per il mining, come é stato "risolto" il dilemma bizantino, come funziona la votazione per maggioranza, e tante altre cosette divertenti. Ripeto, Bitcoin rimane una invenzione formidabile perché ha aperto un mercato ENORME. Come tutti i nuovi mercati, le truffe sono dietro l'angolo cosí come le occasioni di una vita.


Nessun commento:

Posta un commento