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.