O conjunto UTXO e o chainstate

A base de dados contra a qual cada nó verifica os gastos.

Para decidir se uma nova transação é válida, um nó não pesquisa a cadeia de blocos inteira. Consulta uma tabela: o conjunto UTXO, a lista de cada moeda que existe e ainda não foi gasta.

O que é guardado

Cada entrada é indexada pelo seu outpoint (txid + índice de saída) e guarda o valor, o script de bloqueio, a altura do bloco que a criou, e uma flag se veio de uma transação coinbase. No Bitcoin Core, essa base de dados chama-se chainstate e vive em LevelDB na pasta chainstate.

Como os blocos a mudam

Quando um bloco se conecta, as suas entradas gastas são removidas e as suas novas saídas são adicionadas. O Bitcoin Core também guarda dados «undo» para cada bloco, para que se uma reorganização remover um bloco, as moedas gastas possam ser repostas.

Velocidade e memória

Consultas acontecem para cada entrada de cada transação, então a velocidade importa. O Bitcoin Core guarda moedas em cache na RAM, controlado por -dbcache. A versão 31.0 elevou o padrão de 450 MiB para 1.024 MiB em sistemas com pelo menos 4.096 MiB de RAM. Um cache maior pode acelerar muito a primeira sincronização.

Tamanho

O conjunto UTXO é muito menor do que a cadeia completa, mas ainda assim tem vários gigabytes em disco, e cada nó completo deve guardá-lo todo. Cada nova saída adiciona-se até ser gasta, então criar muitas saídas minúsculas tem um custo para todos. Essa é uma razão para os limites de dust.

Pruning

Um nó podado pode apagar arquivos de blocos antigos, guardando tão pouco como 550 MiB deles, mas deve manter o chainstate completo. Nós podados ainda validam tudo.

Snapshots

O Bitcoin Core pode exportar o conjunto com dumptxoutset. Com assumeutxo, um nó novo pode carregar tal snapshot se o seu hash coincidir com um escrito no código-fonte, e depois verificar a história em segundo plano. Leia sobre isso em Initial block download.