180 / 736BIP157/158

Compact Block Filters

Como a carteira encontra os blocos necessários sem baixar tudo

Uma carteira no celular precisa encontrar seus pagamentos sem baixar cada transação de cada bloco. Os Compact Block Filters fornecem pequenos resumos que ela consulta localmente. Uma correspondência leva ao bloco real; sozinha, não significa que um pagamento chegou.

Compact Block Filters são pequenos filtros de dados criados para cada bloco. Um bloco é um grupo de transações acrescentado ao histórico compartilhado da rede. Ajudam uma carteira leve a decidir quais blocos podem conter suas transações e merecem ser baixados. Funcionam como um índice compacto de orientação, sujeito a correspondências falsas. A busca acontece na carteira, sem precisar enviar ao servidor sua lista de acompanhamento.

Anna abre a carteira do celular após algum tempo sem usá-la. O aplicativo precisa descobrir se alguém lhe pagou desde a última conexão ou se parte dos fundos foi gasta. Em vez de todas as transações, baixa pequenos filtros e os compara às condições das saídas acompanhadas. Uma saída é a parte de uma transação que define um valor e as regras para gastá-lo depois. Havendo correspondência, o aplicativo pede o bloco inteiro e procura a transação real. Não deve aumentar o saldo apenas pelo resultado do filtro. O filtro não é extrato de conta nem prova de propriedade. Antes da busca, o cliente sincroniza cabeçalhos, dados resumidos que identificam blocos, e os cabeçalhos encadeados dos filtros. [1]

Na abordagem anterior BIP 37, o cliente enviava a outro nó um filtro formado pelos dados que queria acompanhar. Aqui o sentido se inverte: o servidor fornece um filtro do bloco e Anna pesquisa localmente. Para o mesmo bloco e tipo de filtro, os clientes recebem conteúdo igual. Assim, não precisam revelar diretamente a cada servidor os scripts procurados. Isso não garante anonimato: o outro nó ainda pode observar endereço IP, horários e quais blocos completos a carteira pede depois. Distribuir os downloads entre vários nós reduz a informação reunida por um só, mas não elimina toda possibilidade de correlação. [1]

Os Compact Block Filters selecionam blocos que merecem exame. Compact Blocks, definido no BIP 152, resolve outro problema: economizar dados na transmissão de blocos usando identificadores curtos de transações que o destinatário frequentemente já conhece. Ele as busca no seu Mempool, conjunto local de transações não confirmadas, e solicita as ausentes. Nenhuma dessas ferramentas verifica sozinha todas as regras do Bitcoin. Um Full Node, ou nó completo, valida blocos e transações de forma independente segundo as regras da rede. Uma carteira leve que confere apenas cabeçalhos e a inclusão de sua transação faz uma verificação mais restrita. Economizar dados e validar tudo são propriedades diferentes. [1] [5]

O BIP 158 especifica o formato. O filtro basic inclui o scriptPubKey, o script que define condições de gasto, das novas saídas, exceto as iniciadas por OP_RETURN. Também inclui scripts de saídas anteriores gastas dentro do bloco. Para as entradas, a exceção é a coinbase, primeira transação do bloco que distribui a recompensa do minerador e não gasta saídas anteriores comuns. Suas novas saídas seguem as mesmas regras de inclusão que as demais saídas novas. Elementos vazios são omitidos. A carteira deve converter o endereço no script correto; procurar seu texto impresso não basta. O filtro não é um buscador geral de txid, os identificadores de transações, de dados witness como assinaturas, ou de anotações arbitrárias. [2] [3]

Depois de baixar um bloco, Anna pode descobrir que nada ali lhe diz respeito. Essa correspondência falsa é o custo normal de um filtro pequeno, não uma prova de falha por si só. Tecnicamente, os elementos viram impressões numéricas, são ordenados e suas diferenças são armazenadas de forma compacta com codificação Golomb-Rice. Para basic, P=19 e M=784931. Uma consulta sobre um elemento ausente tem probabilidade aproximada de correspondência de 1/M; acompanhar mais elementos cria mais oportunidades. Não é uma taxa fixa de erro para toda a carteira. Um filtro corretamente construído não deixa passar um elemento incluído. Um resultado negativo exige filtro correto, tipo de dado coberto e consulta adequada. [2]

O BIP 157 define o transporte dos filtros e seus cabeçalhos encadeados. Cada cabeçalho liga o hash, uma impressão criptográfica do filtro atual, ao cabeçalho anterior. Alterar o filtro rompe o vínculo esperado. Essa cadeia, porém, não faz parte do cabeçalho do bloco Bitcoin, e a mineração não firma diretamente um compromisso com seu conteúdo. Um nó desonesto pode preparar filtros falsos acompanhados de impressões encadeadas matematicamente corretas. Isso não muda o Bitcoin, mas pode ocultar informações de um cliente isolado. A verificação dos vínculos deve, portanto, vir acompanhada da verificação dos dados. [1]

O BIP 157 pressupõe a comparação de nós com pelo menos uma fonte honesta. Se houver divergência, o cliente pode localizar o primeiro ponto de desacordo e conferir o filtro com os dados originais. Construir basic pode exigir mais que o novo bloco: também são necessários scripts das saídas anteriores gastas por suas transações. Uma reorganização requer cuidado especial: a rede passa a outro ramo de blocos válidos com maior trabalho acumulado. A carteira precisa ligar os filtros ao novo ramo e atualizar histórico e saldo. A mesma altura, ou posição na cadeia, não identifica necessariamente o mesmo bloco. [1] [3]

A carteira precisa de filtros disponíveis e de uma maneira de obter os blocos completos selecionados. Um nó pode apagar blocos antigos depois de criar seus filtros; outra fonte terá de fornecê-los. No Bitcoin Core, getblockfilter retorna o filtro e seu cabeçalho para um bloco específico quando o índice correspondente está ativo. A disponibilidade do comando não prova a existência de serviço público P2P para outros nós nem acesso a todo o histórico. Filtros de blocos existentes também não anunciam transações não confirmadas no Mempool. Para mostrar pagamentos pendentes, o aplicativo precisa de outro mecanismo. Esses detalhes determinam se uma carteira leve funciona bem de fato. [1] [4]

Para ter uma visão mais completa, leia este verbete junto com Compact Block Filters, Neutrino, Full Node, Privacidade no Bitcoin, Compact Blocks, Bitcoin. Também há referências a este verbete em Neutrino, Erlay.

DOC · 001BIP 157 — Client Side Block FilteringEspecificação DOC · 002BIP 158 — Compact Block Filters for Light ClientsEspecificação DOC · 003Bitcoin Core — BasicFilterElementsFonte primária DOC · 004Bitcoin Core 30.0 — getblockfilterDocumentação DOC · 005BIP 152 — Compact Block RelayEspecificação
Revisto em: Fontes em primeiro lugar · Não é recomendação de investimento