Questo argomento è stato trattato in blockchains
Introduzione
Distributed Ledger Technologies (DLT): definizione
Un ledger distribuito è un sistema in cui i dati (digitali) sono replicati, condivisi e sincronizzati tra più localizzazione, garantendo che tutti i partecipando mantengano una replica dei dati. Questo favorisce trasparenza, sicurezza e fiducia nel sistema, senza il bisogno di una autorità centrale.
Blockchain risulta essere l’implementazione più popolare. Tuttavia, non tutti i DLTs sono blockchain.
Meccanismo del consenso
I partecipanti devono ottenere un accordo condiviso sullo stato del ledger, senza una autorità centrale. Tutti i nodi della rete devono mantenere lo stesso stato globale, prevenendo tampering malevoli.
I meccanismi di consenso prevalenti sono Proof-of-Work e Proof-of-Stake.

Blockchain e Bitcoin
Il problema con il primo tentativo di creare moneta digitale è stato che, in un modo o nell’altro, si faceva affidamento sempre a una terza parte fidata per validare le transazioni e coniare nuova moneta. Si vuole eliminare l’intermediario.
Schema di Haber e Stornetta
Lo schema Haber-Stornetta è il precursore della blockchain. Propone un metodo per fare il timestamping sicuro di documenti digitali, dando un’idea approssimativa di quando il documento ha iniziato a esistere. Il servizio di timestamping riceve e firma il documento con l’ora corrente e lo collega al documento precedente.
Anziché collegare documenti in maniera individuale, si possono raccogliere tutti i documenti inviati in un intervallo di tempo in blocchi, sfruttando i Merkle Tree. All’interno di ogni blocco, i documenti sono ancora collegati tra di loro in una struttura dati ad albero, consentendo di ridurre il numero di controlli necessari per verificare quando un documento è apparso nella cronologia di un sistema.
Bitgold
Bitgold è una moneta digitale, proposta informalmente poiché non gestisce disaccordo né puzzle complexity.
Anche Bitgold è additacome come un precursore di Bitcoin:
- una visione del denaro indipendente da autorità centrali;
- scarsità digitale decentralizzata usando PoW;
- timestamping e linking per impedire tampering;
- problemi in caso di disaccordo.
Blockchain
Blockchain si propone come un’implementazione valida di un DLT per risolvere le sfide di:
- non avere un’autorità centrale;
- abbassare i costi;
- alta disponibilità e transazioni più veloci;
- ambiente trustless;
- trasparenza;
- proprietà e controllo;
- sicurezza e prevenzione dalle frodi.
Struttura
Una blockchain è un ledger decentralizzato, append-only, che consiste di record collegati sequenzialmente, detti blocchi.
Ogni blocco contiene un insieme di transazioni ed è reso crittograficamente sicuro, garantendo l’integrtià e l’immutabilità dei dati. Una volta aggiunte alla catena, le informazioni in un blocco non possono essere alterate senza il consenso della rete, fornendo un record trasparente e affidabile di tutte le transazioni.
Transazione
Una transazione è il mattone fondamentale. È un trasferimento di un valore di Bitcoin che è trasmesso alla rete e raccolto in blocchi. Esistono due tipi di transazione: trasferimento di moneta esistente e generazione di nuova moneta (coinbase).
Se la moneta passa da un proprietario all’altro, si può ricostruire la cronologia dei proprietari dalla creazione della moneta. Bitcoin non salva la moneta stessa, ma ogni transazione sulla blockchain. Per provare il diritto di spendere una quantità di Bitcoin, si deve solo provare che esiste una transazione sulla blockchain a proprio favore favore con quella quantità.
Si possono ipotizzare due tipi di ledger:
- account-based ledger: chiunque voglia determinare se una transazione è valida deve mantenere traccia dei saldi degli account;
- transaction-based ledger: usata da Bitcoin, mantiene traccia delle transazioni.
Nel ledger transaction-based di Bitcoin, ogni transazione specifica un numero di input e un numero di output (sintassi):
- metadata: la dimensione della transazione, il numero di input, il numero di output. C’è l’hash dell’intera transazione che funge da ID univoco per la transazione e permette di usare hash pointer per fare riferimento alla transazione;
- input: consiste di un array e ogni input ha la stessa forma. Specifica la transazione precedente, mantenendo un hash della stessa e agendovi come hash pointer, e l’indice dell’output della precedente transazione che è reclamata;
- output: consiste di un array, con due campi. Ciascuno contiene un valore e la somma di tutti i valori di output deve essere minore o uguale alla somma dei valori di input. Se la somma dei valori di output è inferiore alla somma dei valori di input, la differenza è una “commissione” ai miner che pubblicheranno la transazione, che agiscono come incentivo per i miner stessi così da processare la transazione più velocemente.
Coinbase transaction
La coinbase transaction è la prima transazione di ogni blocco; assegna il block reward e raccoglie le commissioni di tutte le transazioni nel blocco.
Creando nuovi Bitcoin, la transazione di coinbase è valida senza input.
Raggruppamento delle transazioni
Le transazioni sono raggruppate in blocchi più grandi per questioni di ottimizzazione. Il tempo per accettare transazioni e catena di hash sarebbe più lungo.
Blocco
La blockchain è la combinazione di due diverse strutture dati basate su hash. Ogni blocco è identificato dal suo hash (detto block hash oppure block header hash) e si riferisce al blocco precedente, il blocco genitore includendo l’hash del blocco genitore in un campo apposito dell’intestazione.
Composizione di un blocco
Un blocco è composto da:
- block height (altezza del blocco): il numero di sequenza nella catena;
- block size (dimensione del blocco): la dimensione del blocco, in byte;
- block reward (ricompensa del blocco): la quantità di ricompense;
- TxCount (contatore delle transazioni): numero di transazioni;
- block header (intestazione del blocco): metadati del blocco, solitamente inizia con un grande numero di zero;
- transazioni.
A sua volta, l’intestazione è composta da:
- time: il momento in cui il blocco è stato minato;
- version: il numero di versione del protocollo;
- previous block hash: hash del blocco precedente;
- bits: difficoltà da aggiungere al blocco;
- nonce: cambiato finché non corrisponde all’hash del blocco corretto;
- merkle root: la radice del Merkle Tree calcolata combinando transazioni individuali nel blocco.
Chain (catena)
Un blocco contiene l’hash del suo genitore nell’intestazione e ne viene direttamente influenzato. Un cambiamento in un blocco rompe l’intera catena di hash: per renderla di nuovo valida, è necessario ricalcolare gli hash di tutti i blocchi successivi (a quello della modifica).
La catena è replicata per intero sulla rete ed è possibile trovare la versione corretta chiedendola alla maggioranza dei nodi (assumendo che la maggioranza di questi sia onesta).
Consenso di Nakamoto
Il consenso di Nakamoto è l’algoritmo usato dalla rete Bitcoin per raggiungere un consenso trustless tra i partecipanti.
Il contesto in cui Bitcoin opera è:
- asincrono, distribuito e decentralizzato;
- il numero di nodi non è noto e possono essere bizantini;
- l’unica assunzione è che la maggioranza dei nodi sono benigni.
I pari devono concordare sul nuovo stato del sistema (es. il prossimo blocco da aggiungere alla blockchain). I pari che generano nuovi blocchi sono chiamati miners; questi ricevono transazioni dai client e, dopo averle validate, iniziano il processo di generazione di un nuovo blocco.
Consenso senza identità
In un sistema P2P, manca un’autorità centrale che assegna identità e verifica che non si stiano creando dei Sybils 1. Non è richiesto di rivelare la propria identità reale, essendo la pseudonimity uno degli obiettivi principali.
Si può compensare la mancanza di identità facendo l’assunzione più debole, cioè che il sistema possa selezionare un nodo randomicamente affinché proponga il nuovo blocco successivo. Il nodo non è in grado di moltiplicare la sua potenza creando nuovi nodi.
Se il nodo scelto è malevolo, il consenso sarà implicito:n on c’è una votazione esplicita tra i nodi. Il consenso emerge implicitamente dal comportamento della rete. Se il nodo propone un blocco valido, gli altri nodi lo accettano e ci costruiscono sopra (estendendo quella catena). Se il blocco è invalido o sospetto, gli altri nodi lo ignorano e costruiscono sopra un blocco diverso. Il fatto stesso che la maggioranza della rete continui a costruire su una certa catena è il segnale che quella catena è accettata: nessuno ha votato esplicitamente, ma il consenso si è formato lo stesso attraverso le scelte individuali di ogni nodo.
Consenso semplificato
- Le nuove transazioni sono inviate in broadcast a tutti i nodi;
- ogni nodo raccoglie le nuove transazioni in un blocco;
- in ogni round un nodo casuale può inviare in broadcast il suo blocco;
- altri nodi accettano il blocco solo se tutte le transazioni sono valide (non spese, firme valide);
- i nodi esprimono accettazione del blocco includendo il suo hash nel prossimo blocco che creano.
Altro su consenso di Nakamoto
Le proprietà del consenso di Nakamoto:
- agreement: probabilistico. Fermandosi in un certo punto nel tempo, si possono sempre avere dei fork;
- termination: per avere agreement deterministico non ci si può fermare. Dunque Bitcoin non può mai essere arrestato.
Inoltre:
- safety property: afferma che nulla di scorretto accade durante l’esecuzione (agreement);
- liveness property: afferma che qualcosa di buono, infine, accade (termination).
Con Bitcoin, liveness garantisce sicurezza.
Attacchi possibili
Può un utente malevolo rubare dei Bitcoin che appartengono a un altro utente? No, l’avversario dovrebbe essere in grado di creare una transazione valida che spende la moneta che vuole rubare: questo richiede la falsificazione della firma del proprietario.
Può un utente malevolo decidere di non includere alcuna transazione che origina da un certo indirizzo? Sì, ma è solo un fastidio minore. Queste transazioni saranno infine raccolte in un blocco proposto da un nodo onesto.
Double-Spend attack
Un double-spend attack è un attacco con cui un utente malevolo prova a spendere due volte la stessa transazione:
- crea una transazione onesta dal proprio indirizzo a quello di un venditore. Un nodo onesto crea il blocco e include la transazione;
- il venditore vede la transazione e consente l’accesso al servizio;
- se l’utente malevolo propone il prossimo blocco, può decidere di proporre un nuovo blocco che ignora il blocco che contiene il suo pagamento al venditore e inserisce, nel nuovo blocco, una nuova transazione che trasferisce la moneta spesa presso il venditore a un indirizzo sotto il suo controllo.
Il successo dell’attacco dipende da quale blocco sarà incluso nella catena a lungo termine. Per proteggersi, è opportuno non garantire subito il servizio, almeno finché non si ricevono conferme. Al raggiungimento delle conferme, la probabilità che una transazione double spend finisca sulla catena a lungo termine decresce esponenzialmente in funzione di . La misura comune è quella di attendere almeno 6 conferme.
51% attack
Se il consenso fallisce e c’è un attore che un attore che controlla il 51% della potenza, l’attaccante non potrebbe rubare moneta da altri indirizzi esistenti, poiché i nodi onesti non accetterebbero blocchi con transazioni invalide. L’attaccante non potrebbe impedire che le transazioni raggiungano la maggioranza della rete. Potrebbe però avere il double-spend attack, un attacco al 51% distruggerebbe la fiducia in Bitcoin.
Incentivi
Gli incentivi che ricevono i miner sono di due tipi:
- block reward: i nodi che creano un blocco includono una transazione speciale nel blocco, quella di creazione di nuova moneta;
- transaction fees: il creatore di una transazione può decidere di rendere il valore totale degli output della transazione minore di quello del valore totale degli input. A mano a mano che i block reward si esauriscono, diventerà sempre più importante e quasi obbligatorio per gli utenti includere una transaction fee per ottenere una qualità del servizio ragionevole.
Proof of Work
Per scoraggiare miners bizantini e attacchi di tipo DoS, i miner devono risolvere un puzzle di hash (atto di minare i Bitcoin) per generare un nuovo blocco. Questa è la cosiddetta Proof-of-Work. Risolvere il puzzle in un breve periodo di tempo richiede un grosso quantitativo di potenza computazionale. I miner che riescono a risolvere il puzzle ottengono una ricompensa.
Il puzzle consiste nel trovare il valore del nonce in maniera tale che l’hash del blocco sia minore o uguale a un valore target. Il miglior algoritmo per trovarlo è procedendo con un approccio brute force. Il target si aggiusta ogni 2016 blocchi (circa ogni due settimane) per provare a garantire che i blocchi sono minati in media una volta ogni 10 minuti.
Fork
Quando un miner risolve il puzzle, aggiunge il blocco alla propria catena e la invia a tutti gli altri nodi. Se, prima di risolvere il puzzle, il miner riceve un blocco da un altro nodo, egli si ferma nella ricerca della soluzione al puzzle e aggiunge il blocco alla sua catena. Un nuovo blocco può arrivare in ogni momento. Se un miner riceve un blocco quando ne ha già aggiunto uno alla sua catena, si crea un fork. L’ambiguità viene risolta adottando la catena più lunga: il miner mantiene entrambe le versioni temporaneamente e aspetta di vedere quale delle due si allunga prima, che verrà mantenuta. L’altra catena verrà abbandonata e le transazioni sono reimmesse nel mempool per una prossima verifica e saranno incluse in un nuovo blocco.
Esistono due tipologie di fork:
- hard fork: divergenza permanente dalla versione corrente della blockchain, con due catene incompatibili tra di loro;
- soft fork: un aggiornamento backward-compatible alla blockchain. Altri nodi possono validare ancora transazioni sulla nuova catena, ma questa può richiedere regole più severe.
Ruolo dei peers
- wallet: conserva l’identità;
- network: riceve e inoltra blocchi da e a verso altri nodi;
- miner: compete con altri nella generazione di nuovi blocchi risolvendo hash puzzle (quindi, minando);
- full blockchain: conserva l’intera blockchain, quindi intestazioni e dati sulle transazioni.

Identità
Un’identità corrisponde a una chiave pubblica, che è un identificativo anonimo. Riutilizzare la stessa chiave più volte permette il tracciamento dell’attività e può consentire di inferire sull’identità.
Inoltre, ogni volta che un nodo manda una transazione in broadcast, altri nodi possono conservare l’indirizzo IP dell’indirizzo del messaggio e associarlo alla chiave pubblica.
Per un vero anonimato, è opportuno cambiare frequentemente la chiave pubblica e nascondere l’indirizzo IP reale.
Indirizzo
Un wallet inizia con un seed, una frase da 12-24 word, che viene convertita in un numero casuale. Il seme viene sfruttato nella generazione della chiave privata, da cui viene a sua volta generata la chiave pubblica. La chiave pubblica è poi hashata e il risultato è codificato in un formato leggibile dall’umano.
Wallet
Un Wallet Bitcoin è un dispositivo o programma per mantenere e inviare Bitcoin. Un wallet contiene la chiave privata, necessaria per firmare transazioni in Bitcoin. Chiunque conosca la chiave privata può controllare la moneta associata a quell’indirizzo.
Problemi di Bitcoin
- richiede un grosso quantitativo di storage, rendendo difficile per un utente normale avere un nodo completo;
- consumo di energia molto alto per mantenere la rete sicura;
- la maggioranza della potenza computazionale è concentrata in poche larghe operazioni di mining;
- il numero delle transazioni per secondo è limitato dalla dimensione del blocco e dal tempo del blocco;
- bassa efficienza poiché è necessaria almeno un’ora per confermare in maniera sicura una transazione;
- i dati di Bitcoin possono essere solo transazioni economiche. Relazioni tra dati sono difficili da esprimere.
Footnotes
-
Un attacco Sybil consiste nel creare molteplici identità false per ottenere un’influenza sproporzionata in un sistema distribuito. ↩