In questo post abbiamo visto insieme com’è fatto un blocco di una catena blockchain.
Paragonando il singolo blocco ad un taxi in fila ordinata, siamo idealmente entrati al suo interno e abbiamo esaminato gli elementi che lo compongono: numero del blocco, timestamp, dati delle transazioni e Prev. Hash.
Per capire cos’è il Nonce e perchè è così importante in un sistema blockchain, partiamo proprio da qui.
Rivediamo insieme, in breve, cosa si trova all’interno di un blocco blockchain e come i miner operano rispetto a questo contenuto.
Ecco, in breve, quali sono le informazioni che ogni blocco contiene e che lo identificano:
– Index
È il numero del blocco. È sequenziale e quindi non c’è molta scelta per il miner: quando prova a comporre il nuovo blocco da inserire nella catena, deve guardare l’indice dell’ultimo blocco validato e incrementarlo di uno. Facile, no? 😜
Quindi ogni volta che il miner tenta di comporre un blocco, deve guardare l’orologio che porta al polso (o tiene in tasca, nel caso sia un miner particolarmente raffinato) e scrivere tra i campi del blocco l’orario esatto, preciso al secondo.
– Dati delle transazioni
Sono le informazioni che il miner riceve da chi vuole effettuare le transazioni. Essendo firmate dai mittenti (attraverso il meccanismo che raccontiamo in questo video), il miner non può modificarne neppure una virgola, poiché altrimenti invaliderebbe le firme che i mittenti stessi hanno apposto alle proprie transazioni. In altre parole, al miner non resta altra scelta che prendere alcune delle transazioni disponibili e inserirle così come sono nel blocco…un lavoro da scribacchino insomma!
– Prev. HASH
È l’HASH del blocco precedente. Anche su questo campo il miner non ha molta libertà d’azione: deve semplicemente controllare l’ultimo blocco presente sulla catena, copiarne l’HASH e inserirlo nel campo Prev. HASH del blocco che sta provando a comporre. Se il Prev. HASH non corrispondesse a quello del blocco precedente (che ha indice pari all’indice del blocco corrente meno 1), il blocco composto dal miner sarebbe immediatamente riconosciuto come invalido.
Leggendo qui sopra, fare il miner sembra semplicissimo.
A prima vista sembra che basti riportare pari pari dati già disponibili o facilmente calcolabili (chi non sa fare “+ 1”? 😜) all’interno di un blocco e poi metterlo al suo posto all’interno della catena, senza compiere nessun altro sforzo aggiuntivo.
È davvero tutto qui? Perché se fosse così, dato che ad ogni nuovo blocco è associata una bella e cospicua ricompensa (ad esempio attualmente pari a circa 1.500€, in media, per ogni blocco di Ethereum, come potete vedere qui) vuol dire che tutti dovremmo metterci immediatamente a fare i miner, guadagnare un sacco di soldi (criptovalute, ovviamente 😉) e diventare in fretta e con facilità ricchi a dismisura!
Purtroppo no, non è così semplice.
In questo post ti abbiamo raccontato la Proof of Work, ovvero quel meccanismo utilizzato per certificare che è stato svolto del lavoro con lo scopo di minare un blocco su blockchain.
È proprio questo meccanismo che si frappone tra noi e la nostra possibile, immensa ricchezza…cerchiamo di capire come e perché.
Riprendiamo brevemente insieme due concetti chiave: Proof of Work e HASH.
Sono fondamentali per comprendere cos’è un Nonce e qual è la sua funzione nella tecnologia blockchain.
Proof of Work significa dimostrare di aver effettuato uno sforzo, impiegato effort o aver svolto un certo tipo di lavoro, per costruire qualcosa o per svolgere una determinata operazione. Significa, in altre parole, provare che il raggiungimento di un certo risultato ci è costato qualcosa in termini di impegno e di tempo.
Proviamo a fare insieme qualche esempio.
Cosa potrebbe fare una persona innamorata per dare prova del suo amore? Per dimostrare che ci tiene veramente? Per esempio, potrebbe regalare un anello o un diamante alla persona amata (tra le altre cose, questo dimostrerebbe che il suo gesto d’amore gli è costato uno sforzo non trascurabile, per esempio per guadagnare tutti i soldi necessari per effettuare il costoso acquisto).
Però, ammettiamolo, è banale.
Noi siamo più romantici e quindi diciamo che una persona per dare prova del suo amore si mette a scrivere una bellissima e lunghissima poesia tutta in rima o a disegnare un quadro, un quadro enorme e dettagliatissimo, che richiede in modo evidente molto tempo per essere realizzato. In questo modo, quando il nostro innamorato farà vedere il quadro alla persona amata, questa capirà a prima vista che l’innamorato è veramente interessato, al punto da investire tempo, soldi, energie e creatività in un’opera d’arte da dedicarle e regalarle.
Piccola parentesi: qualora te lo fossi perso, ti consiglio di leggere questo post, abbiamo scritto pagine d’amore informatico di altissimo livello!
E questa PoW (o meglio PoL, perché nel nostro caso potremmo chiamarla Proof of Love 😜) è tanto più importante quanto più la persona amata diventa oggetto di desiderio altrui e vuole quindi essere sicura di chi la ama veramente e di chi invece si è solo invaghito temporaneamente di lei (o addirittura la vuole prendere in giro, confessando un amore inesistente). In altri termini, in caso di “attacco al sistema”.
Immagina si presentino alla persona in questione, invece che un solo innamorato, 100 pretendenti. Tutti potrebbero dire che la amano più di chiunque altro.
Dopo tutto è facile dire di essere innamorati, è un’azione senza particolare sforzo, bastano poche parole.
Cento persone ronzano intorno alla bella. C’è sicuramente dello spam tra questi 100 individui. Ma ecco che ad un tratto il vero innamorato si presenta con un quadro bellissimo realizzato di proprio pugno solo per lei e dimostra il suo vero amore.
Abbiamo appena sceneggiato una splendida e romantica Proof of Work.
E se l’innamorato non sapesse dipingere? C’è per caso qualcosa di meglio di un quadro?
Effettivamente un altro esempio potremmo farlo.
Il nostro innamorato potrebbe prendere un algoritmo come lo SHA256 (è il famoso HASH che spieghiamo in questo post) e spendere tempo e soldi per trovare un messaggio che, unito ad una frase d’amore scritta di suo pugno per l’amata, generi un HASH che inizi con dieci zeri. Questo si che è vero amore!
A questo punto, la bella potrebbe essere più incline verso il quadro o verso l’HASH con dieci zeri, in base al proprio background! Ah, se solo la bella potesse leggere i nostri post, saprebbe sicuramente cosa scegliere! Capirebbe immediatamente tutto il valore che si cela dietro ad un HASH che comincia con dieci zeri…
Ora che abbiamo dimostrato di essere realmente innamorati, possiamo portare il concetto di Proof of Work in ambito blockchain.
Come è possibile richiedere ai miners di compiere una Proof of Work per un’operazione che altrimenti sarebbe senza sforzo? Non possiamo certo chiedere ad ogni miner di dipingere un quadro per ogni blocco che vuole comporre!
Quando abbiamo parlato di HASH, abbiamo visto come sia difficile, per via dell’effetto valanga delle funzioni di hash, riuscire a trovare un HASH che si avvicini all’HASH desiderato.
Se ti dicessi di trovare un HASH che inizia con tre zeri, non sarebbe un’operazione semplicissima, ti richiederebbe tempo e diversi tentativi prima di arrivare ad una soluzione. Dovresti impegnarti e investire tempo prezioso (tuo o del tuo computer) per compiere una serie di tentativi assolutamente casuali per provare a trovare un HASH con 3 zeri iniziali. E se questo sforzo ti sembra poco, pensa all’innamorato del nostro esempio che vuole portare un HASH che inizi con dieci zeri!
Se (non ti fidi di noi e) vuoi provare, ti ricordo il link che abbiamo già visto insieme in questo post, per divertirti a scrivere ciò che preferisci nel campo data e generare l’HASH corrispondente: https://andersbrownworth.com/blockchain/hash
Prova a trovarne uno che cominci anche solo con 3 zeri: good luck!
(P.S. dato che è mera questione di fortuna, nel caso in cui riuscissi a risolvere in fretta il problema, prova a trovarne uno che inizi con 4 zeri…e se ci riesci ancora al primo colpo, allora è il tuo giorno fortunato, prova con 10!😜)
Come già abbiamo accennato, hai un’alternativa.
Potresti prendere un computer e far girare un programma che provi in maniera casuale a risolvere ciò che in termini informatici viene definito “puzzle crittografico”.
Il computer genererà una serie di tentativi e continuerà finché non raggiungerà l’obiettivo. Tanto più grande sarà la potenza computazionale (in parole povere, la velocità) del tuo computer, tanto meno tempo impiegherà a risolvere l’enigma.
Questa soluzione computerizzata richiede sicuramente molto meno tempo dei tentativi manuali, ma non per questo è gratis. Per svolgere l’operazione, infatti, dovrai utilizzare l’elettricità necessaria per alimentare la macchina e permettergli di svolgere i vari tentativi, dovrai quindi investire tempo (della macchina) e denaro (il tuo! 😜) per far sì che il tuo computer trovi un HASH con 3 zeri iniziali.
Ed effettivamente questo è proprio ciò che fanno i miners.
Per poter minare un blocco (ovvero, comporre un blocco valido) devono risolvere il puzzle crittografico e trovare un HASH che inizi con tanti zeri quanti sono quelli indicati dal protocollo in quel preciso momento.
Ma quale campo potrà usare il miner per risolvere il puzzle crittografico e trovare un blocco con un HASH che inizi con tanti zeri quanti sono quelli richiesti?
In apertura del post abbiamo visto che tutti i campi che generano l’HASH del blocco riportano solo valori su cui il miner non può intervenire.
Ma allora, dov’è che il miner potrà inserire quel valore casuale all’interno del blocco tale per cui l’HASH del blocco inizierà con il numero di zeri necessari?
Occorrerà introdurre un campo in cui il miner ha la possibilità di inserire variabili numeriche che permettano di modificare l’HASH del blocco fino a trovarne uno che inizi con gli zeri necessari.
E questa è proprio la funzione del Nonce, come vedremo meglio a breve.
Più è elevato il numero di zeri iniziali richiesti nell’HASH, più alta sarà la difficoltà (non per niente il target di zeri viene definito difficulty in ambito blockchain e può aumentare o diminuire a seconda dello stato della rete) nel trovare un HASH che abbia questa caratteristica.
La difficulty è rappresentata dal numero di zeri iniziali richiesti per ottenere un HASH che può essere considerato valido. Viene stabilita in modo decentralizzato, cioè senza l’intervento di un’autorità centrale che decide di volta in volta quanti zeri iniziali debba avere l’HASH di un blocco.
La difficulty viene definita da un algoritmo che verifica quante persone (o meglio, quanti computer, ovvero quanta potenza computazionale) stanno provando a risolvere il puzzle crittografico in un dato momento, verificando il tempo impiegato per risolvere i puzzle precedenti. Se ci sono molte persone che stanno provando a risolvere un puzzle crittografico, il tempo medio di risoluzione sarà basso: questo significa che la difficulty deve essere alzata per mantenere il tempo tra due blocchi consecutivi il più costante possibile.
Il primo che risolve il puzzle crittografico, riuscendo a trovare un HASH con tanti zeri iniziali quanti sono quelli richiesti dalla difficulty in un dato momento, si aggiudica la possibilità di minare il blocco, portandolo su blockchain (ovvero aggiungendolo alla catena) e guadagnando la ricompensa e le fee delle transazioni (come puoi approfondire qui).
Per capire, torniamo di nuovo sull’esempio dell’innamorato.
Immagina che la bella possa scegliere solo il primo pretendente che dia prova del suo amore presentando un messaggio a lei dedicato il cui HASH inizi con 5.
A vincere il cuore della damigella sarà il pretendente che presenterà per primo un HASH che inizia con 5 zeri.
Chi avrà più probabilità di trovare per primo un HASH che inizia con 5 zeri? Chi può svolgere più calcoli il più velocemente possibile per provare a dare la soluzione (ad esempio composta da un messaggio e un nonce, sul quale “giocare” per variare l’HASH risultante).
Puoi avere un computer potentissimo che svolge milioni di calcoli al secondo oppure puoi decidere di pagare i tuoi amici per chiedergli di usare i loro potentissimi computer per svolgere ancora più calcoli al secondo.
Qualunque sia la strada che scegli, l’obiettivo è molto semplice: più potenza computazionale riesci a mettere in campo e più probabilità avrai di risolvere per primo il puzzle crittografico e aggiudicarti la ricompensa (oltre all’onore e alla Gloria o qualunque sia il nome della tua amata! 😜).
Per la validazione di un blocco, ogni miner deve rispettare il meccanismo di consenso della Proof of Work, tra i maggiormente diffusi e utilizzati dalle blockchain più famose e popolari al mondo, come Bitcoin ed Ethereum.
Cambiamo contesto e facciamo un altro esempio, per provare a capire meglio di cosa si tratta.
Immaginiamo una scena che sicuramente ti è capitato di vivere in prima persona.
Ci troviamo ad un ricevimento e nella sala principale è stato allestito un ricco buffet.
Ciò che avviene tipicamente in una situazione di questo tipo è “l’assalto al buffet”, almeno in tempi pre-Covid. Le persone si ammassano intorno ai tavoli di bibite e bevande, nel tentativo di conquistare la maggior quantità possibile di vettovaglie. Come se non bastasse, alcuni dei partecipanti al banchetto (sempre gli stessi) si presentano più e più volte a ritirare stuzzichini e bibite (tipicamente, sottolineando che non lo stanno facendo solo per loro, ma per conto di altri, più o meno immaginari, commensali), lasciando molto spesso a bocca asciutta diversi convitati. È il caos!
Ma i lettori di questo blog, che sanno di HASH e meccanismi di consenso, decidono di provare ad organizzare il buffet introducendo una lotteria: solo i vincitori, che possono rimanere anonimi, riceveranno come premio l’accesso al banchetto e la possibilità di riempire il proprio piatto.
Se per ottenere i biglietti di questa lotteria, però, bastasse semplicemente richiederli, il “buffet dei biglietti” sarebbe nuovamente preso d’assalto, molti prenderebbero più di un biglietto per aumentare le probabilità di vincita, non esisterebbero regole e chiunque senza sforzo avrebbe il diritto ad accedere più volte al buffet. Abbiamo solo spostato l’assalto dal buffet sui biglietti della lotteria.
Invece, il gestore del buffet del nostro esempio stabilisce che soltanto chi risolverà un sudoku riceverà un biglietto per il buffet.
La consegna di un sudoku completato rappresenta la Proof of Work.
Chi si presenta in cassa col sudoku completato riceve la possibilità di accedere al buffet. Il maitre del buffet non può sapere a priori chi finirà per primo il sudoku: non è possibile conoscere a priori chi sarà il più veloce, ma si possono fare previsioni.
Immaginiamo che a voler accedere al banchetto siano 5 persone, tutte brave allo stesso modo nel risolvere i sudoku. È possibile immaginare che al primo turno a completare il sudoku sarà più veloce un partecipante, al turno successivo qualcun altro. A parità di bravura nel risolvere un sudoku, si tratta semplicemente di un calcolo delle probabilità.
Questo permetterà di regolare l’accesso al buffet in modo equilibrato tra tutti i partecipanti. Potrà capitare che qualcuno vinca due volte consecutive, è poco probabile ma possibile. Questo semplice sistema permette di offrire ai partecipanti una lotteria organizzata ed equilibrata e potenzialmente offre a tutti la possibilità di partecipare ed accedere al buffet.
Considerando il contesto che abbiamo appena immaginato, cosa succede se, per esempio, alcuni avventori si uniscono in una sorta di “alleanza del sudoku”?
L’idea alla base dell’alleanza è questa: mettiamoci insieme a risolvere il sudoku. In caso di vincita di uno dei membri dell’“allenza del sudoku”, il premio viene diviso tra tutti i partecipanti. Se io sono da solo a dover risolvere un sudoku, mentre tu sei al tavolo con dieci amici e tutti provate a risolvere il gioco, è molto probabile che il primo a terminarlo sarà uno di voi. Probabile ma non certo. Infatti, con una certa probabilità possiamo dire che il tuo team di 10 giocatori completerà per primo il sudoku, vincerà l’accesso al buffet, potrà riempire il suo piattino e dovrà spartire il bottino tra i membri del team, per poi passare subito all’enigma successivo per ricevere di nuovo la possibilità di accedere al buffet e dividere ancora una volta il premio.
Questo è esattamente ciò che avviene nella blockchain.
Invece che risolvere un sudoku, i miners sono chiamati a trovare un HASH per il blocco da minare che inizi con tanti zeri quanti sono quelli necessari a dimostrare il proprio impegno in un determinato momento.
Come abbiamo già visto, i calcoli per trovare l’HASH sono svolti dai computer: più potente è il mio computer, più probabilità ho di risolvere il puzzle crittografico.
In alternativa posso unirmi ad altri miner, andando a costituire un pool di miners, esattamente come nell’esempio del sudoku posso unirmi ad altri giocatori per formare una squadra.
Il bottino verrà suddiviso tra i membri del team che partecipano alla gara nella stessa squadra.
Ricapitoliamo per maggior chiarezza tutto quello che abbiamo imparato.
I campi che contengono le informazioni sul blocco (li trovi descritti qui) non lasciano molta libertà d’azione al miner, sono tutti già determinati: non si possono toccare i dati delle transazioni, non si può cambiare né il prev. HASH né l’index del blocco corrente.
Si direbbe quindi che l’HASH del blocco corrente sia in qualche modo già determinato e non sia dunque possibile al miner controllarlo in alcun modo.
Abbiamo però scoperto che in realtà non è così!
Come fa il miner a trovare un HASH di un blocco che inizi con il numero di zeri richiesti se non può cambiare i dati del blocco? Qual è la variabile su cui può intervenire per far si che l’HASH del blocco minato cominci con tutti gli zeri necessari?
È il Nonce, ovvero un numero che il miner può scegliere in totale libertà ed in modo arbitrario. Grazie all’effetto valanga delle funzioni di HASH, non è possibile predire quale sarà il Nonce necessario a centrare un certo target, non si può cioè ottenere un HASH con le caratteristiche desiderate. È possibile però provare a variare continuamente il Nonce in modo randomico, fino a trovare l’HASH desiderato.
In questo modo, quando viene caricato un blocco il cui HASH presenta gli zeri richiesti dalla difficulty, è subito evidente che per ottenere quel risultato c’è stato un lavoro, che è stato eseguito correttamente: è cioè chiaro che sono stati svolti un certo numero di tentativi e che un computer ha dovuto utilizzare energia elettrica per svolgere operazioni di calcolo in modo continuativo fino a trovare un HASH adeguato. È così che il miner ottiene il diritto di minare il blocco ricevendo sia la ricompensa sia le fee delle transazioni contenute nel blocco stesso.
Per concludere, ecco quindi com’è fatto un blocco:
Rispetto a quanto hai già letto nei precedenti articoli del nostro blog (ad esempio, qui), in questa figura puoi vedere anche il parametro Nonce. Prova anche tu a questo link!
P.S. Nella tecnologia blockchain, il termine “Nonce” viene utilizzato per rappresentare anche un altro parametro, dal significato completamente diverso. Oltre al Nonce appena descritto, esiste infatti un Nonce legato alle singole transazioni e agli account che le hanno generate, che rappresenta una sorta di indice per ordinare tutte le transazioni firmate da un certo account.
Curioso? Seguici, ne parleremo in dettaglio in uno dei prossimi post!