Per tenere traccia dei bilanci utente, la blockchain di Bitcoin sfrutta un modello di contabilità definito UTXO o Unspent Transaction Outputs. In questo articolo ne esaminiamo le caratteristiche.
Ogni blockchain è dotata di un sistema di contabilità, un meccanismo attraverso cui tenere traccia dei bilanci di ciascun utente. I due grandi modelli di riferimento nel settore sono l’account model (usato da Ethereum) e l’Unspent Transaction Outputs model (impiegato in Bitcoin).
ll nostro focus odierno è quindi comprendere in che modo Bitcoin assicuri il corretto computo dei bilanci.
UTXO: il modello di contabilità di Bitcoin
Al cuore di ogni blockchain, una tecnologia assimilabile a una grande memoria (global state) decentralizzata, pubblica e inalterabile, c’è l’entità transazione. Attraverso una transazione è possibile inviare una richiesta di modifica dello stato globale, che una volta autenticata e validata sarà inserita all’interno di un blocco e diventerà parte della rete.
Le transazioni sono fondamentali perché permettono non solo di tenere traccia dei bilanci di ciascun utente ma anche di interagire con programmi più o meno complessi, a seconda delle reti e delle loro caratteristiche.
Nella blockchain di Bitcoin ogni transazione richiede di specificare, insieme ad altri parametri, un certo numero di input e output sotto forma di UTXO, o Unspent Transaction Output. Possiamo intendere queste entità come se fossero delle carte prepagate con un certo importo trasferito su di esse. Quando ammettiamo di “possedere 200 euro” potremmo intendere di avere 5 carte con rispettivamente 123.50, 12.50, 24.00, 30.00, 10.00 euro. Possiamo acquistare un prodotto che costa 150 euro, e in tal caso andremo ad azzerare il conto sulla carta 1 e 2, e avremo 10 euro rimanenti sulla carta 3.
O meglio, bruceremo la carta 3 e sposteremo i 10 euro rimanenti su una nuova carta 6. Questo dettaglio, apparentemente senza senso, è parte del funzionamento del modello UTXO come vedremo meglio tra poco.
Nella finanza tradizionale un’operazione simile sarebbe però impossibile, a meno di non trovare una banca che consenta di produrre delle carte virtuali basate su conto condiviso. In Bitcoin possiamo farlo senza problemi.
Abbandoniamo le monete FIAT e passiamo a BTC
Per cui anziché affermare Alice ha 3 BTC, sarebbe più corretto dire che Alice ha 29 UTXO che le consentono di spendere 3 BTC. Questo chiaramente a livello tecnico, perché nessun sano di mente direbbe mai una cosa simile.
Ah dimenticavo.
Alcune noti importanti da tenere a mente sul modello UTXO:
- Tutte le Unspent Transaction Outputs sono non fungibili, ovvero non possono essere rimpiazzate o scambiate tra loro. (i.e. Non esiste un exchange di UTXO)
- Per spendere una Unspent Transaction Outputs occorre referenziare una specifica UTXO (quelle di un utente sono tendenzialmente sparpagliate su diversi blocchi)
- Una UTXO “consumata” crea nuove UTXO rappresentanti l’eventuale rimanenza non spesa
- Una UTXO, comunemente definita coin o moneta, può essere solamente spesa una volta
- In Bitcoin, ogni Unspent Transaction Outputs ha uno script a lei associata vale a dire una sequenza di operazioni contenenti le condizioni per cui è possibile spendere la somma in futuro. Per avere maggiori dettagli ti esorto a controllare questa fonte.
Questo modello si appresta bene a soddisfare le esigenze di una blockchain nata per essere quanto più semplice e state-less possibile.
Facciamo una comparata con l’account model. Questa tipologia di modello, sebbene non sottoposta ad analisi è del tutto associabile a quello che ci aspetteremmo in una tradizionale banca, in cui il bilancio totale è dato dalla somma dei valori delle singole transazioni considerando il segno (in linguaggio finanziario, Dare e Avere). Dunque abbiamo:

Facciamo due esempi per capire meglio il funzionamento del modello. Il metodo è di studiare gli estremi:
- Cosa succede quando vogliamo trasferire una quantità inferiore al valore di una UTXO?
- Cosa succede se la quantità da trasferire è superiore al valore di una singola UTXO, ma inferiore a quelle di diverse Unspent Transaction Outputs da noi controllate?
Immaginiamo che Bob sia un Bitcoin Miner. Dopo aver generato un nuovo blocco premia se stesso con 12.5 BTC, che gli spettano secondo le regole di emissione. Questa è una nuova UTXO introdotta nel sistema da Bob. Ora immaginiamo che debba comprare alla sua amata Alice un nuovo ASIC, e decida quindi di inviarle 6.0 BTC. Per farlo deve spendere la sua UTXO, tenendosi la rimanenza di 6.5 BTC. Questo è possibile perché Bitcoin consente di specificare multipli outputs per singola transazione. Così Bob creerà due nuove UTXO di 6.0 BTC per Alice e 6.5 BTC per sé stesso. Infine contrassegnerà l’UTXO precedente come spesa (spent), poiché usata come input in questa transazione.
Consideriamo ora uno scenario opposto, quello in cui Alice si trovi, dopo aver compiuto diversi trasferimenti, con 3 UTXO di valore 1.0 BTC, 1.5 BTC e 0.8 BTC per totali 3.3 BTC. A questo punto ammettiamo che voglia inviare 3.0 BTC a Bob. Può farlo specificando multipli input nella transazione. Una volta eseguita, riceverà una nuova UTXO da 0.3 BTC (la rimanenza) e i precedenti input saranno marcati come spesi (spent).
Come funziona il Bitcoin Script
Poco fa abbiamo affermato che ciascuna UTXO contiene uno script che specifica la logica attraverso cui possa essere spesa in futuro. Per codificare questa logica è necessario fare ricorso al Bitcoin Script Language.
Il Bitcoin Script Language è pensato per essere un semplice linguaggio stack-based, privo di loop e quindi sempre capace di risolvere. Niente Turing completeness.
In più, è esente da attacchi di tipo DoS (Denial of Service). Questo linguaggio è praticamente una lista di codici operazione, simili a funzioni, che prendono gli argomenti dallo stack e operano su di essi. Qui la lista completa.
Due forme comuni di script per Bitcoin sono il Pay-to-Pubkey Hash and Pay-to-Script Hash.
Per il momento è tutto.
Per aspera, ad astra.
Un caldo abbraccio, Andrea