Glossário / Nós e software
Filtro compacto de bloco
- O que é um filtro compacto de bloco?
- Um filtro compacto de bloco é um pequeno resumo com codificação Golomb dos scripts de saída que um bloco cria e gasta, publicado por nós completos para que uma carteira leve possa testar blocos sem revelar o que possui.
Especificação no BIP-158.
Um filtro cobre um bloco, e lista scripts de saída, não endereços, valores ou identificadores de transação. O BIP-158 fixa o tipo básico em 0x00, com P igual a 19 e M igual a 784.931, então um elemento que não está no bloco ainda coincide mais ou menos uma vez a cada 784.931 tentativas. Como a comparação roda no seu dispositivo, o nó que serve o filtro nunca fica sabendo quais bitcoins são seus.
Como funciona
Um filtro compacto de bloco é montado ao aplicar hash sobre os scripts de saída que um bloco cria e gasta em um único intervalo numérico, ordenar os resultados e anotar apenas as distâncias entre eles.
A especificação fixa a lista de itens, então dois nós honestos produzem filtros idênticos byte a byte para o mesmo bloco. Para cada transação, o filtro toma o script de saída anterior que cada entrada gasta, pulando a transação coinbase, e o scriptPubKey de cada saída. Uma categoria fica de fora de propósito: as saídas que começam com OP_RETURN. O BIP-158 as exclui para que, mais tarde, os filtros possam ser comprometidos dentro de uma saída OP_RETURN da coinbase, como o compromisso de testemunha já é, sem que o compromisso precise cobrir a si mesmo.
O hash usa SipHash com c igual a 2 e d igual a 4, com chave nos primeiros 16 bytes do hash do bloco em sua forma padrão little-endian. Essa chave muda a cada bloco, então o mesmo script cai em um lugar diferente em cada um e ninguém pode montar uma tabela de consulta que funcione em toda a cadeia. Cada resultado de 64 bits é então mapeado no intervalo de zero a N vezes M com uma multiplicação e um deslocamento, em vez de uma divisão.
A compressão é o que o nome indica: os valores ordenados são substituídos por suas diferenças sucessivas, e cada diferença vira um quociente em unário seguido de 19 bits de resto, que é a codificação Golomb-Rice. A saída não pode ser menor que N vezes 20 bits, e vem precedida da contagem de itens N como um CompactSize; um bloco cujo filtro não tem elementos é armazenado como um único byte de zeros. Um nó disposto a servir esses filtros anuncia o bit de serviço NODE_COMPACT_FILTERS, definido como 1 deslocado para a esquerda em 6 posições.
Onde você encontra isso
Os filtros compactos de bloco são o método de sincronização escolhido por carteiras que preferem gastar largura de banda a entregar uma lista de endereços ao servidor de outra pessoa.
A Wasabi Wallet é o exemplo em nossas próprias análises: apenas para desktop, apenas bitcoin, toda conexão por Tor por padrão, e sincronização a partir de filtros, para que nenhum servidor descubra quais endereços pertencem a você. Nossa classificação dá 3,6 e marca cautela, por um motivo que não tem nada a ver com a sincronização. A Electrum, com classificação 4,4, segue o outro caminho: verifica por SPV contra um servidor de indexação que qualquer um pode rodar, e esse servidor acaba ficando com a lista de endereços que você possui.
Vale conhecer dois limites antes de depender dos filtros. Um filtro é baseado em scripts, então não é possível consultar um identificador de transação nele: com apenas um txid, você ainda precisa de um nó ou de um explorador. E as saídas OP_RETURN estão ausentes por construção, então software que observa saídas que carregam dados não pode ser construído sobre esse mecanismo de forma alguma.
Filtro compacto de bloco vs retransmissão de bloco compacto
Um filtro compacto de bloco diz a uma carteira se vale a pena baixar um bloco; a retransmissão de bloco compacto, especificada no BIP152, encolhe um bloco que já está a caminho entre dois nós completos.
Os públicos são diferentes. Os filtros são por bloco, determinísticos, com chave nos primeiros 16 bytes do hash do bloco, e são baixados por clientes que não mantêm cadeia própria. A retransmissão substitui a maior parte das transações de um bloco por identificadores de 48 bits com chave gerada a partir do hash do cabeçalho do bloco junto com um nonce que o remetente escolhe, e não economiza nada para um receptor cuja mempool ainda não tem essas transações. Um poupa um celular de baixar blocos de que ele não precisa; o outro poupa um nó de receber transações duas vezes. A palavra compartilhada “compacto” é toda a semelhança.