Blog.

UTXO: come funziona il modello Unspent Transaction Outputs


Autore
Andrea Provino
Data
Tempo di lettura
5 minuti
Categoria
Blockchain

bitcoin-utxo

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:

A comparison between the Account Model and the UTXO model

Facciamo due esempi per capire meglio il funzionamento del modello. Il metodo è di studiare gli estremi:

  1. Cosa succede quando vogliamo trasferire una quantità inferiore al valore di una UTXO?
  2. 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

Taggedbitcoinblockchain


Ultimi post

Patricia Merkle Trie

Il Practical Algorithm To Retrieve Information Coded In Alphanumeric Merkle Trie, o Patricia Merkle Trie è una struttura dati chiave-valore usatada Ethereum e particolarmente efficiente per il salvataggio e la verifica dell’integrità dell’informazione. In questo post ne studieremo le caratteristiche. Prima di procedere, ci conviene ripassare l’introduzione al Merkle Tree nella quale abbiamo chiarito il […]

Andrea Provino
ethereum-patricia-merkle-tree
Tree Data Structure: cos’è un Merkle Tree

Un Merkle Tree è una struttura dati efficiente per verificare che un dato appartenga a un insieme esteso di elementi. È comunemente impiegato nelle Peer to Peer network in cui la generazione efficiente di prove (proof) contribuisce alla scalabilità della rete. Capire i vantaggi di questa struttura ci tornerà utile nel nostro percorso di esplorazione […]

Andrea Provino
merkle-tree-cover
Cos’è Ethereum

Possiamo definire Ethereum come una macchina a stati distribuita che traccia le transizioni di un archivio dati general-purpose (i.e. una memoria in grado di registrare qualsiasi dato esprimibile come coppia di chiave e valore o key-value) all’interno della Ethereum Blockchain. È arrivato il momento di esplorare uno dei progetti tecnologici più innovativi e interessanti degli […]

Andrea Provino
ethereum