UTXO

Pubblicato da Matteo il

In questo articolo parleremo delle UTXO (Unspent Transaction Output).
Tutte le transazioni, escludendo la coinbase, fanno riferimento agli UTXO per formare l’input.
La coinbase fa eccezione in quanto l’input non e’ formato da precedenti transazioni ma direttamente dal protocollo Bitcoin, che eroga dei coin per premiare il miner data la risoluzione della sfida crittografica #POW.

C’e’ da dire che anche altre cryptovalute utilizzano il modello transazionale UTXO, come per esempio tutti i fork di Bitcoin. Quando avviene un fork, come quello di Bitcoin cash, fino al blocco 478558, condivideva la stessa storia di bitcoin, e quindi anche tutte le UTXO.

Andiamo nel dettaglio negli aspetti del modello UTXO.

  • Atomicita’

Una UTXO e’ immediatamente spendibile e sempre aggiornata nella sua totale integrita’.

  • Processamento Parallelo

Le transazioni, grazie a tale modello possono essere processate in parallelo.

Ad ogni transazione utilizza un nuovo address per aumentare la privacy. quindi sara’ risalire ai coin appartenenti a quel address.

Per una verifica piu’ veloce i nodi salvano le UTXO in un database.

  • Computazione elevata

Per formalizzare un input di una transazione, potrebbe essere necessario aggregare piu’ UTXO.

Approfondiamo uno degli aspetti piu’ importanti che riguardano le UTXO: il database in cui vengono salvate, Leveldb. 

Leveldb e’ un database chiave valore, open source mantenuto da Google.

all’interno si trova una versione compressa delle transazioni unspent e alcuni metadata.

ogni full node possiede una copia del database contenente tutte le UTXO.

Un entry del db contiene valori come:

  • L’hash della transazione che contiene almeno una UTXO
  • quale output tale transazione ha non speso.
  • l’altezza del blocco dove e’ la transazione.
  • lo scriptPubKey (lo vedremo nel dettaglio nei prossimi articoli).

e tanti altri non strettamente necessari come:

  • L’ultima altezza del blocco registrata, per verificare a quando e’ aggiornato il db.
  • Obfuscation, che serve per offuscare le UTXO agli occhi di antivirus utilizzati su windows.

chiaramente avere un database velocizza di molto la verifica che effettuano i nodi in maniera drastica. ad ulteriore supporto, oltre al db, le UTXO sono caricate in RAM dei full node.

Tutte le UTXO che formano un determinato input devono essere all’interno del db.

Se si tenta di formalizzare una transazione formando l’input con una o piu’ UTXO non presenti nel db, significa che si sta provando ad effettuare una doppia spesa (double spending) con una UTXO gia’ consumanta, in tal caso il nodo respinge la transazione.

Utilizzando il comando RPC gettxoutsetinfo possiamo ottenere delle informazioni sul db del nodo:

./bin/bitcoin-cli gettxoutsetinfo

Risultato:

{
"height": 134283,
"bestblock": "0000000000000794ce4964f440c0579a8b831529a1f90c2bc457a25db70d22e0",
"transactions": 263987,
"txouts": 434928,
"bogosize": 34548570,
"hash_serialized_2": "61c80e006b88ba623774f9901ef5d9d2c8765d67cf745f7122bc4b8116dde992",
"disk_size": 0,
"total_amount": 6714049.98999999
}
  • height: rappresenta l’altezza del blocco.
  • bestblock: rappresenta l’hash dei tip nel db chainstate.
  • transactions: il numero di transazioni con almeno una UTXO.
  • txouts: il numero UTXO.
  • hash_serialized_2: l’hash dell’intero db, serve per confrontarlo con gli altri nodi, per verificarne l’integrita’.
  • total_amount: valore in bitcoin di tutte le UTXO.

Mentre utilizzando il comando getblockchaininfo otteniamo una serie  d’informazioni sulla blockchain.

  "chain": "main",
"blocks": 135856,
"headers": 595029,
"bestblockhash": "000000000000091b90788656ca242315c01eca81ad2f4a806ea877a7f1925104",
"difficulty": 1563027.996116223,
"mediantime": 1310439492,
"verificationprogress": 0.00224707950244011,
"initialblockdownload": true,
"chainwork": "000000000000000000000000000000000000000000000002507ec4e20ef1cae7",
"size_on_disk": 448605059,
"pruned": false,

Puo’ succedere che header bestblock che identifica il tip, non siano allineati, In quanto il database Leveldb all’interno del nodo non e’ ancora stato sincronizzato con l’ultimo blocco. Una cosa importante da ricordare e’ che le informazioni nella rete #P2P si propagano come dei cerchi in uno stagno.