UTXO

Uma saída de transação não gasta

Diagrama mostrando as UTXOs como as saídas não gastas em um grafo de transações.

Uma UTXO é uma saída de transação não gasta (Unspent Transaction Output).

Toda transação de bitcoin cria saídas que podem ser consumidas como entradas em transações futuras. As UTXOs são simplesmente as saídas de transação que ainda não foram consumidas e que ainda podem ser usadas para gastar.

Então, se você pensar nos bitcoins como parte de um grande grafo de transações, as UTXOs estão nas pontas dele.

A coleção de todas as UTXOs é chamada de conjunto de UTXOs (UTXO set).

Uso

Como as UTXOs são usadas no Bitcoin?

Acompanhar as UTXOs é útil por dois motivos:

  1. Validar transações
  2. Calcular o saldo de endereços

1. Validar transações

Quando o seu nó recebe uma nova transação da rede, ele precisa validar que todas as entradas dela referenciam saídas que ainda não foram gastas.

Se todas as entradas da transação forem saídas não gastas (UTXOs), então a transação é válida:

Diagrama mostrando uma transação válida gastando uma saída não gasta de uma transação anterior.

Porém, se a transação tentar gastar uma saída que já foi gasta em uma transação anterior, então a transação é inválida e será rejeitada:

Diagrama mostrando uma transação inválida tentando gastar uma saída de uma transação anterior que já foi gasta.

2. Calcular o saldo de endereços

O "saldo" de um endereço é a soma de todas as UTXOs travadas a esse endereço:

Diagrama mostrando o saldo de um endereço como a soma das saídas não gastas travadas a esse endereço.

Você pode ver o saldo de endereços em exploradores de blockchain como mempool.space e bitcoinexplorer.org.

É importante notar que os bitcoins não "moram" dentro dos endereços. Os bitcoins ficam dentro de saídas, e um endereço é essencialmente uma trava que pode ser colocada sobre uma saída. Portanto, o saldo de um endereço é apenas a soma de todas as UTXOs que foram travadas a ele.

Localização

Onde as UTXOs são armazenadas?

No Bitcoin Core, todas as UTXOs são armazenadas no banco de dados chainstate:

~/.bitcoin/chainstate

Esse é um banco de dados separado que fica armazenado na memória (RAM), o que torna o acesso mais rápido do que ter que vasculhar os arquivos brutos da blockchain para verificar se uma saída foi gasta ou não.

O banco de dados chainstate é um simples banco LevelDB de chave:valor que contém as seguintes informações:

O banco de dados chainstate é atualizado a cada nova transação minerada na blockchain: as UTXOs gastas em uma transação são removidas do banco de dados, e as novas saídas são adicionadas a ele.

Você pode descobrir algumas informações básicas sobre o conjunto de UTXOs do seu nó local rodando o bitcoin-cli gettxoutsetinfo:

$ bitcoin-cli gettxoutsetinfo

{
  "height": 796565,
  "bestblock": "00000000000000000002f63578950b747bfaa88dcd0bc0d8730827176d01b1f9",
  "txouts": 106662924,
  "bogosize": 8071055609,
  "hash_serialized_2": "596d06c8a5052e1d3e492ee26a811606f5fe30b20bbbd9db2fe64e44e411c17a",
  "total_amount": 19415818.12246298,
  "transactions": 68046641,
  "disk_size": 6827932282
}

O exemplo acima é apenas uma amostra da saída do bitcoin-cli gettxoutsetinfo. Ao rodar esse comando, pode levar alguns segundos para retornar os resultados.

Ferramentas

Resumo

Em poucas palavras

Uma UTXO é apenas um nome chique para uma saída de transação que ainda não foi gasta.

Portanto, o conjunto de UTXOs (UTXO set) representa o fornecimento de bitcoins em circulação.

Há muitas siglas no Bitcoin, mas, no fim, quase sempre são nomes que soam complexos para coisas bastante simples. Não deixe isso te assustar.

Recursos