Bitcoin: guida sulla blockchain. Parte 10
Bitcoin: guida sulla blockchain. Parte 10
Bitcoin

Bitcoin: guida sulla blockchain. Parte 10

By Alessio Salvetti - 18 Gen 2020

Chevron down

Questo articolo è il decimo di una guida sulla parte più squisitamente tecnica di Bitcoin e della blockchain, accessibile anche a coloro a digiuno di codice. Questo articolo continua altresì una sorta di guida pensata per entrare gradualmente in quella che molti definiscono “la tana del bianconiglio”.

A livello bibliografico è d’obbligo citare il testo “Mastering Bitcoin” di Andreas Antonopoulos, riferimento costante, dal quale sono state tratte le immagini. Chi fosse interessato ad approfondire questi temi, con o senza integrazione delle dinamiche legate al codice, può trovare supporto nei corsi formativi e nella attività consulenziali erogate da Bcademy.

La Blockchain di Bitcoin

La blockchain è una struttura dati costituita da una lista, ordinata e back-linked, di blocchi di transazioni, che può essere memorizzata come un flat file, o in un semplice database. Bitcoin Core memorizza i metadati della blockchain utilizzando il database Level DB di Google. Ogni blocco è identificato da un hash (SHA256 dell’header del blocco). Ogni blocco è riferito al precedente (genitore) tramite il campo previous block hash nell’header del blocco. La sequenza degli hash collega ogni blocco al proprio genitore creando una catena “all’indietro” fino al primo blocco creato (genesis block).

Sebbene ogni blocco abbia un solo genitore (c’è solo un campo previous block hash), può avere temporaneamente più figli, nati durante un “fork” (biforcazione), una situazione temporanea che può capitare quando due nuovi blocchi vengono minati approssimativamente nello stesso istante. Il campo previous block hash è interno all’header del blocco ergo influenza l’attuale hash del blocco (venisse modificato l’hash del blocco precedente, cambierebbe di conseguenza l’hash del blocco attuale).

Struttura di un blocco

Un blocco è una struttura dati “contenitore” che aggrega transazioni per l’inclusione nel registro pubblico, la blockchain. Un blocco è composto da un header, contenente metadati, seguito da una lista di transazioni (un blocco completo occupa ca. 10.000 volte lo spazio dell’header).

Block Header

L’Header del blocco consiste di tre set di metadati:

  • Un riferimento all’hash del blocco precedente;
  • Difficulty, Timestamp e Nonce (valori correlati al mining);
  • La Merkle Tree Root.

Identificatori: Block Header Hash e Block Height

Il principale indicatore di un blocco è l’hash crittografico, la sua impronta digitale, fatta tramite il doppio hashing (SHA256) dell’header del blocco. L’hash di 32 byte che ne risulta è l’hash del blocco, o più precisamente il block header hash. Questo quello del primo blocco mai creato:

000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

Da notare che l’hash del blocco non è incluso nella struttura dati del blocco, né quando il blocco è trasmesso al network né quando diviene parte della blockchain. Invece, è calcolato da ogni nodo quando il blocco viene ricevuto dal network. Un altro modo per identificare un blocco è tramite la sua posizione nella blockchain, detta block height (“altezza del blocco”). Il primo blocco creato ha altezza “0”, mentre il primo gennaio del 2017 si è arrivati circa ad un’altezza di 446.000. A differenza dell’hash del blocco, l’height (che non è parte della struttura dati di un blocco) non è un identificatore univoco, poiché la stessa “altezza” può identificare più blocchi durante un fork.

The Genesis Block

Il primo blocco o “blocco zero” è chiamato genesis block (blocco di genesi). Ciascun nodo parte con la blockchain o al limite un blocco poi questo è codificato nel client di modo da non poter essere alterato (è la radice per costruire una blockchain affidabile), ergo ogni nodo conosce l’hash e la struttura del genesis block, quando è stato creato etc.

Cercando l’hash del “blocco zero” in un qualsiasi block explorer, si trova una pagina che descrive il contenuto di questo blocco, con un URL che ne contiene l’hash:

https://blockchain.info/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

Il blocco contiene un messaggio nascosto. L’input della coinbase transaction contiene il testo  “The Times 03/Jan/2009 Chancellor on brink of second bailout for banks.” Questo per dimostrare, riferendosi all’headline del The Times, la prova della data, e per ricordare l’importanza di un sistema monetario indipendente.

Linking Blocks in the Blockchain

Un full node mantiene una copia locale della blockchain, partendo dal genesis block, costantemente aggiornata quando un blocco viene trovato e collegato per allungare la catena, dopo essere stato ricevuto dal network ed averlo validato. Per stabilire il collegamento, il nodo esamina il previous block hash nel block header dell’entrante.

Merkle Trees

Ogni blocco nella blockchain di Bitcoin contiene un riepilogo di tutte le transazioni nel blocco, utilizzando un merkle tree, o binary hash tree (albero di hash binario), una struttura dati utilizzata per riassumere e verificare in modo efficiente l’integrità di insiemi di dati di grandi dimensioni. I merkle tree sono alberi binari contenenti hash crittografici. Il termine “albero” viene utilizzato in informatica per descrivere una struttura dati ramificata, ma questi alberi vengono solitamente visualizzati capovolti con la “radice” nella parte superiore e le “foglie” nella parte inferiore di un diagramma.

I merkle tree sono utilizzati in Bitcoin per riassumere tutte le transazioni in un blocco, producendo un’impronta digitale (hash) complessiva dell’intero insieme di transazioni, fornendo un processo molto efficiente per verificare se una transazione è inclusa in un blocco. Un merkle tree è costruito da coppie di nodi di hashing ricorsivi fino a quando c’è solo un hash, chiamato merkle root (radice). L’algoritmo di hash crittografico utilizzato nei merkle tree di Bitcoin è SHA256 applicato due volte.

Quando N elementi di dati sono sottoposti a hashing e riepilogati in un albero di merkle, è possibile verificare se un qualsiasi elemento di dati è incluso nella struttura con calcoli al massimo 2 * log ~ 2 ~ (N), rendendo questa una struttura di dati molto efficiente.

Poiché un merkle tree è un albero binario, ha bisogno di un numero pari di “foglie”. Se è presente un numero dispari di transazioni da riepilogare, l’hash dell’ultima transazione verrà duplicato per creare un numero pari di nodi foglia, noto anche come “albero bilanciato”.

Lo stesso metodo per costruire un albero da quattro transazioni può essere generalizzato per costruire alberi di qualsiasi dimensione. In Bitcoin è comune avere da diverse centinaia a più di mille transazioni in un singolo blocco, che sono riassunte esattamente allo stesso modo, producendo solo 32 byte di dati come la singola merkle root.

Merkle Trees and Simplified Payment Verification (SPV)

I merkle tree sono ampiamente utilizzati dai nodi SPV. I nodi SPV non hanno tutte le transazioni e non scaricano blocchi completi, ma solo i block header. Per verificare che una transazione sia inclusa in un blocco, senza dover scaricare tutte le transazioni nel blocco, utilizzano un percorso di autenticazione o un merkle path.

Si consideri, ad esempio, un nodo SPV interessato ai pagamenti in entrata a un indirizzo contenuto nel suo wallet. Il nodo SPV stabilirà un bloom filter sulle sue connessioni ai peer per limitare le transazioni ricevute solo a quelli che contengono gli indirizzi di interesse. Quando un peer vede una transazione che corrisponde al filtro (bloom filter), invierà quel blocco usando un messaggio di merkleblock. Il messaggio merkleblock contiene l’header del blocco e un merkle path che collega la transazione di interesse alla merkle root nel blocco. Il nodo SPV può utilizzare questo merkle path per connettere la transazione al blocco e verificare che la transazione sia inclusa nel blocco. Il nodo SPV usa anche l’header del blocco per collegare il blocco al resto della blockchain. La combinazione di questi due collegamenti, tra la transazione e il blocco e tra il blocco e la blockchain, dimostra che la transazione è registrata nella blockchain. Tutto sommato, il nodo SPV avrà ricevuto meno di un kilobyte di dati per l’header del blocco e il merkle path, una quantità di dati che è più di mille volte inferiore a un blocco completo (circa 1 megabyte).

Testnet

Oltre alla “main” blockchain (mainnet) ci sono altre blockchain utilizzate per il testing: attualmente testnet, segnet, e regtest (e attualmente si sta lavorando a simnet).

Alessio Salvetti
Alessio Salvetti

Co-founder di Bcademy e board member (VP), Alessio è partner e board member di Impact Hub Trentino, uno dei 102 nodi del network mondiale. Dopo un'esperienza come docente di filosofia, abbandona l’insegnamento per coordinare un team di ricerca sui temi della connessione tra neuroscienze ed economia, prima di dedicarsi alla vera e propria creazione d’impresa. Business developer e consulente per numerose startup, bitcoiner per passione ed esperto di modeling e lean startup, è co-founder di Inbitcoin e responsabile per l’erogazione dei prodotti di Bcademy (CPO).

Utilizziamo i cookie per essere sicuri che tu possa avere la migliore esperienza sul nostro sito. Se continui ad utilizzare questo sito noi assumiamo che tu ne sia felice.