Pular para o conteúdo
buybitcoinsmart

Glossário / Nós e software

Filtro de Bloom

Outros nomes: BIP37.

O que é um filtro de Bloom?
Um filtro de Bloom é um conjunto probabilístico compacto que as carteiras leves de BIP37 enviavam a um nó completo para que o nó encaminhasse apenas as transações que plausivelmente lhes pertenciam.

Especificação no BIP-37.

O projeto trocava largura de banda pelo que seus autores esperavam que fosse privacidade, e a privacidade nunca chegou. O Bitcoin Core deixou de fornecer esses filtros por padrão na versão 0.19.0, lançada em novembro de 2019, depois que anos de pesquisa mostraram o quanto eles vazam. Uma carteira que ainda depende de um está entregando à máquina de um desconhecido uma lista utilizável dos bitcoins que você possui.

Como funciona

Status: a filtragem de Bloom do BIP37 foi desativada por padrão no Bitcoin Core 0.19.0 em novembro de 2019, e os filtros compactos de blocos do BIP157 e do BIP158 assumiram a tarefa das carteiras leves.

Um filtro de Bloom é um vetor de bits mais um punhado de funções hash. Para inserir um item, você calcula o hash dele de várias maneiras, toma cada resultado módulo o comprimento do vetor e define esses bits como um. Para testar um item, você calcula o hash dele das mesmas maneiras e observa. Se algum desses bits for zero, o item com certeza nunca foi inserido; se todos forem um, o item provavelmente foi inserido, ou outras inserções por acaso definiram os mesmos bits. Falsos negativos não podem ocorrer. Falsos positivos podem, e sua taxa é o parâmetro que se ajusta.

O BIP37 fixou a aritmética. Um filtro tem limite de 36.000 bytes e de 50 funções hash, e o hash usa a versão 3 da função Murmur de 32 bits, inicializada com o número do hash multiplicado por 0xFBA4C795 mais um ajuste escolhido pelo cliente. Três mensagens o governam: filterload instala um filtro na conexão, filteradd o amplia e filterclear o remove. Uma vez definido um filtro, o par responde a uma solicitação de bloco com um merkleblock que carrega o cabeçalho de 80 bytes, as transações que coincidiram e os ramos de Merkle que provam que elas pertencem a esse bloco. Mais tarde, o BIP111 acrescentou o bit de serviço NODE_BLOOM para que um nó pudesse anunciar se iria colaborar ou não.

Toda a história da privacidade repousava nessa taxa de falsos positivos. Amplie o filtro, capture transações alheias junto com as suas, e um observador supostamente não consegue distinguir quais são quais. Isso não se sustenta. Um trabalho acadêmico publicado em 2014 mostrou que um filtro com um número realista de endereços entrega a maioria deles, e que dois filtros carregados pela mesma carteira podem ser intersectados para retirar a camuflagem. Reconectar-se a um par novo com um filtro novo piora o problema, não melhora.

A outra falha era mais simples de explicar. Fornecer um filtro significa escanear blocos do disco a pedido de um desconhecido, então qualquer par podia fazer um nó com disco mecânico realizar uma quantidade enorme de trabalho não remunerado. Esse argumento de negação de serviço, e não a pesquisa sobre privacidade, é o que as notas de lançamento da versão 0.19.0 trazem em primeiro lugar.

Onde você o encontra

Os filtros de Bloom sobrevivem principalmente em software escrito antes de 2019 e em arquivos de configuração que contornam sua ausência.

As carteiras Android construídas sobre a biblioteca bitcoinj usavam o BIP37 como seu único backend de cadeia, e algumas ainda estão instaladas. O Bisq também precisava dele, e por isso sua documentação costumava instruir as pessoas a adicionar peerbloomfilters=1 à configuração do próprio nó. Essa linha é o indício: quando um programa pede que você reative a filtragem de Bloom em um nó que você opera, ele está pedindo uma técnica que o cliente de referência desativou por boas razões.

O substituto moderno funciona ao contrário. Com o BIP157 e o BIP158, o nó constrói um filtro por bloco e o publica para todos, e a carteira faz a correspondência no próprio hardware, de modo que nada sobre seus endereços sai do dispositivo.

Filtro de Bloom vs SPV

Um filtro de Bloom era um mecanismo de entrega; a verificação de pagamento simplificada é um modelo de confiança, e confundir os dois leva as pessoas a supor que o modelo morreu com o mecanismo. SPV significa verificar que uma transação está sob a raiz de Merkle de um cabeçalho da cadeia com mais trabalho acumulado, sem validar o restante do conteúdo dessa cadeia. Esse raciocínio não mudou. O que mudou é como uma carteira leve encontra as transações que vale a pena verificar: antes ela difundia um esboço com perdas dos próprios endereços e torcia, e agora baixa um filtro por bloco e o testa em casa.

Não confundir com

Perguntas frequentes

As carteiras de bitcoin ainda usam filtros de Bloom?

Raramente, e você deve evitá-los. O Bitcoin Core deixou de servir os filtros de BIP37 por padrão na versão 0.19.0 em novembro de 2019, e as carteiras leves agora usam os filtros compactos de blocos do BIP157 e do BIP158, que mantêm sua lista de endereços no próprio dispositivo.

Os filtros de Bloom ocultam quais endereços minha carteira observa?

Não. Uma pesquisa publicada em 2014 mostrou que um filtro com um número realista de endereços vaza a maioria deles, e que dois filtros da mesma carteira podem ser intersectados para remover por completo a camuflagem dos falsos positivos.

Leia a seguir

Termos relacionados

Mais em Nós e software

Ler esta página em inglês