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.