Gli alberi di Merkle in Bitcoin
Published: 2023-01-20 09:18:24

In quest'ultima analisi sugli alberi di Merkle ci soffermeremo nel capire come essi vengano usati all'interno della tecnologia Bitcoin :) 

Come detto nei precedenti post, la struttura degli alberi di Merkle li rende estremamente efficienti per la **verifica dei dati**. 
Nello specifico, in ₿ Bitcoin gli alberi di Merkle sono utilizzati **per memorizzare in modo efficiente ogni transazione estratta dalla rete Bitcoin**. Diamo ora uno sguardo alla struttura di un blocco Bitcoin:


![Struttura blocco Bitcoin](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eyojdzod3wuyif1vhrhy.jpg)

---

Il diagramma qui sopra mostra l'architettura di un blocco di bitcoin. Pensavate che un blocco di bitcoin contenesse tutte le transazioni per blocco? In un certo senso sì, ma tramite gli alberi di Merkle!

Come? 
Tutte le transazioni per ogni blocco sono organizzate in un mega albero di Merkle. Ciò che in realtà finisce per essere incluso nel blocco è l'hash della radice di quell'albero di Merkle.

Includendo l'hash della radice dell'albero, i dati delle transazioni possono essere memorizzati fuori dalla catena (i nodi completi, ad esempio, memorizzano i record delle transazioni su un LevelDB integrato in tutti i nodi completi).

Grazie agli alberi di Merkle, l'archiviazione sulla blockchain è molto efficiente: risulta infatti necessario impegnare solo un pezzo di dati invece di migliaia di transazioni per blocco, che gonfierebbero davvero il sistema!

> Lo scopo principale dell'utilizzo degli alberi di Merkle su insiemi di dati (solitamente transazioni) di grandi dimensioni è quello di **mantenere la dimensione della blockchain il più piccola possibile**. 
Data la natura del loro utilizzo, le blockchain crescono in continuazione, quindi è necessario prevedere un'archiviazione efficiente dei dati. Mantenere le dimensioni della blockchain contenute significa che più utenti possono sostenere l'esecuzione di nodi completi, il che aiuta la decentralizzazione della rete.

---

Grazie agli alberi di Merkle, esiste un modo efficiente per verificare l'esistenza di alcuni dati in un hash radice. Prendete l'immagine qui sotto: riuscite a immaginare quanto sarebbe gonfio ogni blocco se fosse necessario memorizzare ogni singola transazione? Molto meglio memorizzare un solo hash radice che rappresenti tutte le transazioni per blocco!



![Hash Tree](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ixk5twkezviay6nnktsl.png)



---


## Prova di Merkle


Come abbiamo visto nel post precedente, il vantaggio del design dell'albero di Merkle - un algoritmo ricorsivo basato sull'hashing - è che consente di dimostrare in modo efficiente che alcuni dati esistono all'interno della costruzione dell'hash della radice (effettivamente contenuti nel blocco, nel nostro caso); in altre parole, consente di ottenere prove Merkle. 
Una prova Merkle può confermare che delle transazioni specifiche rappresentate da una foglia o da un ramo hash siano all'interno di una radice hash Merkle.

Quindi, se qualcuno ha bisogno di provare che una transazione è esistita in un determinato momento nella blockchain, deve solo fornire una prova Merkle :)



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8q93cnbxjbm2cyphdci0.png)


--- 

Nel diagramma qui sopra, supponiamo di voler dimostrare che C (ovvero una qualche transazione tx casuale) esiste in questo blocco. Grazie alle prove Merkle, sono necessari solo 3 dati in tutto - **D**, **H(A-B)**, **H(E-H)** - per costruire l'hash della radice dell'albero** H(A-H)**. 
Potrebbe sembrare poco per un albero così piccolo, ma che dire di un albero contenente oltre 10.000 o 100.000 transazioni? 
Se si riuscisse a costruire con successo l'hash della radice si otterrebbe una prova sufficiente che la transazione in questione facesse effettivamente parte di quell'albero Merkle in quel dato momento. 


---

## Casi d'uso degli alberi Merkle

Ricapitolando, gli alberi Merkle sono:

- efficienti dal punto di vista spaziale e computazionale;
- ottimi per la scalabilità e la decentralizzazione;
- non c'è bisogno di riempire un blocco di transazioni: basta impegnare un hash della radice Merkle e mantenere le transazioni in altri luoghi in grado di gestirle;

In termini più profondi, essi:

- Riducono significativamente la memoria necessaria per verificare che i dati abbiano mantenuto la loro integrità e non siano stati alterati.
- Richiedono la trasmissione di meno dati attraverso la rete blockchain per verificare i dati e le transazioni. Ciò migliora l'efficienza di una blockchain.
- Consentono la verifica semplice dei pagamenti (SPV), che consente di verificare una transazione senza scaricare un intero blocco o blockchain. Ciò consente di inviare e ricevere transazioni utilizzando un nodo light-client, più comunemente noto come portafoglio di criptovalute.

**PROVER E VERIFIER**

Quando si verificano i dati utilizzando un albero di Merkle, ci imbatteremo in un Prover e un Verifier:

- Un Prover esegue tutti i calcoli necessari per creare la radice di Merkle (solo un hash!).
- Un verifier, o verificatore: esso non ha bisogno di conoscere tutti i valori per avere la certezza che un valore sia presente nell'albero.

---

## Scala logaritmica


![Scala logaritmica](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jiftia7heo5vl84wzcny.png)

> Nota: La quantità di prove Merkle necessarie cresce in modo logaritmico rispetto alla dimensione dell'array di dati da inserire nell'algoritmo di hash dell'albero di Merkle. 

---



## Conclusione
Gli alberi di Merkle sono una struttura di dati molto popolare nelle blockchain e la ragione alla base è mantenere l'archiviazione dei dati snella ed efficiente; questa comprensione è essenziale quando si inizia a costruire una dApp, perché si vuole sempre essere snelli ed efficienti con l'archiviazione dei dati. Perché? Meno efficiente è l'uso dell'archiviazione dei dati, più costoso sarà il nostro programma per noi e per i nostri utenti.

Nella prossima sezione vedremo **Patricia Merkle Tries**, una struttura di dati ampiamente utilizzata in Ethereum.


---

**Terminologia**

- **Albero di Merkle**: struttura utilizzata per la validazione dei dati.
- **Radice di Merkle**: l'hash contenuto nell'intestazione del blocco, derivato dagli hash di tutte le altre transazioni del blocco.
- **Merkle path**: rappresenta l'informazione di cui l'utente ha bisogno per calcolare il valore atteso per la radice di Merkle di un blocco, a partire dall'hash della propria transazione contenuta in quel blocco. Il percorso di Merkle viene utilizzato come parte della prova di Merkle.
- **Prova di Merkle**: dimostra l'esistenza di una transazione specifica in un blocco specifico (senza che l'utente debba esaminare tutte le transazioni del blocco). Include la radice Merkle e il percorso Merkle.