You are currently viewing Blockchain: cos’è il Nonce e perché è così importante

Blockchain: cos’è il Nonce e perché è così importante

In questo post abbiamo visto insieme com’è fatto un blocco all’interno di una catena blockchain. Paragonando il blocco di una catena ad un taxi, siamo idealmente entrati all’interno del blocco ed abbiamo visto quali sono gli elementi che lo compongono: numero del blocco, timestamp, dati delle transazioni e Prev. Hash

Proviamo a guardare un secondo questi dati: 

  • L’index. Il numero del blocco: è sequenziale e quindi non c’è molta scelta, il miner (ovvero colui che prova a comporre il prossimo blocco da inserire nella catena) deve guardare l’indice dell’ultimo blocco della catena ed incrementarlo di uno. Facile, no? 😜
  • Il timestamp viene attribuito al blocco nel momento in cui il blocco stesso viene minato. Quindi ogni volta che il miner tenta di comporre un blocco, deve guardare l’orologio al suo polso (o nella sua tasca, nel caso sia un miner particolarmente raffinato) e scrivere tra i campi del blocco l’orario esatto, preciso al secondo.
  • I dati delle transazioni. I dati delle transazioni sono quelli che il miner riceve da chi vuole effettuarle. Essendo firmate dai mittenti (attraverso il meccanismo approfondito in questo post), il miner non può in nessun modo intervenire modificando tali dati, altrimenti renderebbe immediatamente invalide, anche solo modificando una virgola, le firme che i mittenti hanno apposto alle loro transazioni. Quindi al miner non rimane altra scelta che prendere un po’ delle transazioni disponibili ed inserirle così come sono nel blocco … proprio un lavoro da scribacchino!
  • Il Prev. HASH. Anche su questo campo il miner non ha molta libertà d’azione: il Prev. HASH è l’hash del blocco precedente … il miner deve quindi 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 (avente indice pari all’indice del blocco corrente meno 1), il blocco composto dal miner sarebbe immediatamente riconosciuto come invalido.

Quindi fare il miner è semplicissimo? Basta riportare pari pari dei 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 abbiamo parlato della proof of work, ovvero di quel meccanismo utilizzato per certificare che è stato svolto del lavoro con lo scopo di minare un blocco su blockchain. È proprio questo meccanismo che si mette di mezzo tra noi e la nostra immensa ricchezza … cerchiamo quindi di capire come e perché.

INDICE ARGOMENTI

1) Il concetto di Proof of Work (PoW)

Riprendiamo brevemente insieme i concetti di base. Proof of work significa dimostrare di aver effettuato uno sforzo, speso dell’effort o aver svolto un certo tipo di lavoro, per costruire qualcosa o per svolgere una certa operazione. Ovvero dimostrare che il raggiungimento di un certo risultato ci è costato qualcosa, in termini di sforzo 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 ad una persona? 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ò è 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 colpo d’occhio che effettivamente l’innamorato è realmente interessato a lei (o a lui), tanto da investire tempo, soldi, energie e creatività in un’opera d’arte da dedicare e regalare alla persone che ama. In ogni caso, 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 di chi 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 contendenti … 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 (ad esempio un suo ritratto, o un’immagine che rappresenta i due innamorati in un paesaggio incantato) 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 almeno un altro esempio potremmo farlo. Il nostro innamorato potrebbe prendere un algoritmo come lo SHA256 di cui abbiamo parlato in questo post e spendere il proprio tempo ed i propri soldi per trovare un messaggio che, unito ad una frase d’amore scritta apposta per la sua 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 …

2) Trova un HASH che inizi con 10 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 in questo post, abbiamo visto come sia difficile, grazie all’effetto valanga delle funzioni di hash, riuscire a trovare un HASH che si avvicini ad un HASH desiderato. 

Se ti dicessi di trovare un HASH che inizia con tre zeri, non sarebbe un’operazione semplicissima, ti richiederebbe del tempo e diversi tentativi prima di riuscire a trovare una soluzione. Dovresti impegnarti ed investire il tuo prezioso tempo (o quello del tuo computer, che ti costa sia aver acquistato, sia tenere acceso e funzionante visto il suo consumo di corrente) 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 riporto qui di seguito il link che abbiamo già visto insieme in questo post, dove puoi divertirti a scrivere ciò che preferisci nel campo data per ottenere l’HASH corrispondente:

https://andersbrownworth.com/blockchain/hash

Prova a trovarne uno che incominci anche solo con 3 zeri: good luck! (P.s. dato che è 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 accennavamo in precedenza, in 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? Ovvero, se abbiamo visto in apertura del post che tutti i campi che generano l’HASH del blocco riportano solo valori su cui il miner non può interventire, dove potrà il miner 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 delle 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.

3) Chi stabilisce la difficulty

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, e 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 (esattamente come abbiamo visto in questo post).

Anche in questo caso pensa all’esempio dell’innamorato. Immagina che la bella possa scegliere solo il primo pretendente che dia prova del proprio amore presentando un messaggio a lei dedicato il cui HASH inizi con 5. Chi vincerà il cuore della damigella? Il pretendente che presenterà per primo un HASH che inizia con 5 zeri. E chi avrà più probabilità di trovare per primo un HASH che inizia con 5 zeri? Avrà più probabilità di arrivare primo colui che 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 innamorata! 😜).

La PoW è il meccanismo che deve rispettare ogni miner per la validazione di un blocco. Si tratta di uno dei meccanismi più diffusi ed è utilizzato dalle blockchain più famose e popolari di tutto il mondo, come ad esempio Bitcoin ed Ethereum.

4) Risolvere un sudoku

Facciamo un esempio per provare a capire meglio di cosa si tratta. Immaginiamo una scena che sicuramente hai già vissuto sulla tua pelle.

Ci troviamo ad un ricevimento e nella sala principale è stato preparato 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 sui tavoli di bibite e bevande cercando di accaparrarsi la maggior quantità di vettovaglie possibili. Inoltre, alcuni partecipanti al banchetto (sempre gli stessi) si presentano più e più volte a ritirare stuzzichini e bibite (tipicamente indicando 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 di meccanismi di consenso, decidono di provare ad organizzare il buffet introducendo una lotteria, i cui vincitori, che possono rimanere anonimi, ricevono come premio l’accesso al banchetto per 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 ai 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, è come partecipare ad una lotteria dove non è possibile conoscere a priori chi sarà il più veloce. Possiamo tuttavia fare delle previsioni.

Immaginiamo che ci siano 5 persone a voler accedere al banchetto, tutti bravi allo stesso modo a risolvere i sudoku. È possibile immaginare che al primo turno sia più veloce un partecipante a completare il sudoku ed il turno successivo è molto probabile che vincerà 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. Complessivamente, tuttavia, questo semplice sistema permette di offrire ai partecipanti una lotteria organizzata, equilibrata e potenzialmente offre a tutti la possibilità di partecipare ed accedere al buffet.

Ma 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.

Risolvere un puzzle crittografico

E questo è 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, e 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.

5) L'unica variabile con cui giocare è il Nonce

Ricapitoliamo per maggior chiarezza tutto quello che abbiamo imparato. I campi del blocco che abbiamo già descritto in questo post non lasciano molta libertà d’azione al miner, sembrano essere tutti già determinati e slegati da ogni sua possibile scelta. Non si possono infatti toccare i dati delle transazioni, e non possono essere cambiati né il prev. HASH, né l’index del blocco corrente. Sembrerebbe quindi che l’HASH del blocco corrente sia in qualche modo già determinato e non sia possibile per il miner controllarlo in alcun modo. 


Abbiamo però scoperto che 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? Come abbiamo visto, l’unico campo del blocco su cui poter intervenire è il Nonce, ovvero un numero che il miner può scegliere in totale libertà ed in modo arbitrario. Come abbiamo già spiegato in
questo post, grazie all’effetto valanga delle funzioni di HASH, non è possibile predire quale sarà il Nonce necessario a centrare un certo target, ovvero ottenere un HASH con le caratteristiche desiderate. L’unico modo possibile è 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 c’è stato un lavoro per ottenere quel risultato, e che il lavoro è stato eseguito correttamente, ovvero che sono stati svolti un certo numero di tentativi, che un computer ha dovuto utilizzare dell’energia elettrica per svolgere operazioni di calcolo in modo continuativo fino a trovare un HASH adeguato. Ed in questo modo 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 già affrontato nei precedenti articoli (come ad esempio in questo post, in cui descriviamo com’è fatto un blocco), in questa figura è presente anche il parametro Nonce. Se vuoi, puoi provare anche tu a questo link

PS. All’interno della tecnologia blockchain il termine “Nonce” viene utilizzato per rappresentare anche un altro parametro, dal significato completamente diverso. Oltre al Nonce che abbiamo appena descritto, esiste infatti un Nonce legato alle singole transazioni ed agli account che le hanno generate, che rappresenta una sorta di indice per ordinare tutte le transazioni firmate da un certo account … ma non preoccupatevi, ne parleremo in dettaglio in uno dei prossimi post!

Condividi su facebook
Condividi su twitter

VUOI SCOPRIRE DI PIÙ SULLA TECNOLOGIA BLOCKCHAIN
E SU COME PUO' FAR CRESCERE IL TUO BUSINESS?