Bitcoin Puzzle 71: Bloom Filter Explica a Caçada aos BTC
Leitura: ~9 min
TL;DR
- O Bitcoin Puzzle Transaction distribuiu chaves privadas com dificuldade crescente, e o intervalo de 71 bits ainda resiste — o prêmio remanescente do conjunto gira em torno de 32 BTC.
- Um Bloom Filter permite testar bilhões de candidatos a chave sem estourar a memória RAM, trocando certeza absoluta por uma taxa de falso positivo controlada.
- Testamos um gerador de candidatos em Python com Bloom Filter para deduplicação — útil para estudo de estruturas de dados probabilísticas, não como ferramenta de ataque real.
Aviso Financeiro: Este conteúdo é estritamente informativo e educacional. Não constitui conselho, recomendação ou oferta de investimento. Consulte um profissional habilitado antes de tomar decisões financeiras.
Nota Técnica: Os scripts apresentados têm fins exclusivamente educacionais sobre estruturas de dados probabilísticas. Contra o espaço de chaves real de 256 bits, a busca por força bruta é matematicamente inviável — o puzzle discutido aqui usa intervalos deliberadamente reduzidos pelo próprio criador. O @CanalQb não se responsabiliza pelo uso indevido do conteúdo.
71 bits de espaço de busca ainda não caíram — e o motivo não é falta de gente tentando.
Desde 2015, uma sequência de endereços Bitcoin com dificuldade crescente vem sendo "caçada" publicamente por milhares de pessoas. Cada endereço guarda uma chave privada dentro de um intervalo numérico conhecido, e quem encontrar a chave correta leva o saldo. Parece simples. Na prática, é aqui que a maioria dos scripts amadores trava — não por falta de poder de GPU, mas por falta de uma estrutura de dados adequada para evitar retrabalho.
Neste post eu vou destrinchar como o Bitcoin Puzzle Transaction funciona, por que o Bloom Filter é a peça central de qualquer implementação séria de varredura em larga escala, e vou deixar um script Python funcional — testado aqui no ambiente do @CanalQb — para quem quiser estudar a estrutura por trás do problema.
O que é o Bitcoin Puzzle Transaction?
O Bitcoin Puzzle Transaction é um conjunto de endereços criados por um usuário anônimo em 2015, cada um financiado com uma quantia crescente de BTC e protegido por uma chave privada restrita a um intervalo de bits específico. O endereço do "puzzle 1" guarda uma chave de 1 bit; o "puzzle 71" guarda uma chave em algum ponto entre 2⁷⁰ e 2⁷¹−1. Aqui no @CanalQb, validamos que essa mecânica de dificuldade progressiva é o que transformou o experimento em um dos maiores laboratórios públicos de criptografia aplicada da comunidade Bitcoin.
A ideia central é simples de entender e brutal de executar: a cada nível, o espaço de busca dobra. Encontrar a chave do puzzle 71 exige testar, em teoria, até 2⁷¹ combinações possíveis — um número da ordem de 2,3 sextilhões. Mesmo com hardware GPU otimizado processando trilhões de chaves por segundo, como mostram os logs reais compartilhados por pesquisadores da comunidade, o tempo estimado de conclusão de uma varredura sequencial completa ainda é medido em dezenas de anos.
Por que ninguém resolve o puzzle 71 com força bruta pura?
Testar sequencialmente cada chave dentro de um intervalo de 71 bits é inviável mesmo para clusters de GPU dedicados. A resposta direta é: o espaço de busca cresce exponencialmente a cada bit adicionado, então cada novo puzzle dobra o custo computacional do anterior — e a maioria dos participantes sequer aplica técnicas de otimização como Kangaroo ou Baby-step Giant-step corretamente.
É aqui que entra um segundo problema, menos falado: mesmo quem otimiza a geração de candidatos esbarra em outro gargalo — como verificar rapidamente se uma chave já foi testada, sem consumir toda a memória disponível? É exatamente o problema que o Bloom Filter resolve.
O que é um Bloom Filter e como ele funciona?
Um Bloom Filter é uma estrutura de dados probabilística criada para responder uma única pergunta com extrema eficiência de memória: "este elemento provavelmente já está no conjunto?". Diferente de um set tradicional em Python ou de uma hash table convencional, o Bloom Filter não guarda os elementos em si — ele guarda apenas a "sombra" deles, representada em um vetor de bits.
O funcionamento é direto. Ao inserir um elemento, várias funções hash independentes calculam posições diferentes dentro do vetor de bits e marcam essas posições como 1. Para consultar se um elemento já existe, o filtro recalcula as mesmas posições hash e verifica se todas estão marcadas. Se qualquer uma delas estiver zerada, a resposta é categórica: o elemento definitivamente não está no conjunto. Se todas estiverem marcadas, a resposta é probabilística: o elemento provavelmente está no conjunto — mas pode ser um falso positivo.
Essa é a característica mais importante para entender: o Bloom Filter nunca gera falso negativo, apenas falso positivo. Ele nunca vai dizer "não está" quando na verdade está. Isso o torna seguro para descartar candidatos repetidos em uma varredura — na pior das hipóteses, você recalcula um candidato que já foi testado, o que é um custo muito menor do que armazenar bilhões de valores de 256 bits em memória bruta.
Por que o Bloom Filter é essencial para varreduras em larga escala?
Guardar bilhões de chaves de 71 bits (ou mais) em um set Python convencional consome memória de forma linear e cara — cada entrada carrega overhead do interpretador, ponteiros e metadados do objeto. Um Bloom Filter, por outro lado, representa a mesma quantidade de elementos usando poucos bits por entrada, com o trade-off de aceitar uma taxa de erro configurável.
Na prática dos scripts de varredura que circulam na comunidade — como os logs de execução com Bloom Filter de 154 milhões de entradas ocupando pouco mais de 350 MB — fica claro o ganho: sem essa estrutura, armazenar o mesmo volume de checkpoints em uma lista comum exigiria múltiplos gigabytes, inviabilizando a execução em hardware doméstico.
Mas o porém é justamente o que separa quem entende a estrutura de quem só copia código pronto: quanto menor a taxa de erro desejada (error_rate), maior o vetor de bits necessário. Escolher esse parâmetro é um equilíbrio direto entre precisão e consumo de memória — e é o primeiro ajuste que qualquer implementação séria precisa calibrar antes de rodar em escala.
Como gerar candidatos e deduplicar com Bloom Filter em Python?
Abaixo está uma versão didática do processo: geração de números aleatórios dentro de um intervalo de bits, deduplicação via Bloom Filter e conversão para os formatos HEX e WIF usados pelo protocolo Bitcoin. O objetivo é estudar a estrutura — não uma ferramenta pronta para produção em GPU.
Bibliotecas necessárias
pip install pybloom_live base58
O módulo secrets e hashlib já vêm na biblioteca padrão do Python, então não precisam de instalação separada. O pybloom_live fornece a implementação do Bloom Filter, e o base58 cuida da codificação usada no formato WIF das chaves Bitcoin.
Script de exemplo
from pybloom_live import BloomFilter
import secrets
import hashlib
import base58
# Intervalo do puzzle: chaves entre 2^70 e (2^71 - 1)
MIN_KEY = 2 ** 70
MAX_KEY = (2 ** 71) - 1
TOTAL_CANDIDATOS = 500
# Bloom Filter com taxa de erro de 1 em 1 bilhao
bloom = BloomFilter(capacity=TOTAL_CANDIDATOS * 2, error_rate=1e-9)
candidatos = []
def chave_para_wif(hex_key, comprimida=True):
payload = b'\x80' + bytes.fromhex(hex_key)
if comprimida:
payload += b'\x01'
checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
return base58.b58encode(payload + checksum).decode()
while len(candidatos) < TOTAL_CANDIDATOS:
numero = secrets.randbelow(MAX_KEY - MIN_KEY + 1) + MIN_KEY
if numero in bloom:
continue # provavel duplicata, descarta
bloom.add(numero)
candidatos.append(numero)
with open("candidatos.txt", "w") as arquivo:
for numero in sorted(candidatos):
hex_priv = f"{numero:064x}"
wif = chave_para_wif(hex_priv, comprimida=True)
arquivo.write(f"INT: {numero}\nHEX: {hex_priv}\nWIF: {wif}\n{'-'*60}\n")
print(f"Gerados {len(candidatos)} candidatos unicos dentro do intervalo.")
Repare no ponto central: o if numero in bloom substitui o que seria uma busca custosa em uma lista ou até mesmo em um set gigante, por uma verificação de complexidade constante — independentemente de o filtro guardar mil ou um bilhão de entradas.
Quais os limites reais dessa abordagem?
Vale reforçar o ponto que muita gente ignora: gerar candidatos aleatórios dentro de um intervalo de 71 bits e testar contra um único endereço tem probabilidade de sucesso próxima de zero em tempo humano, mesmo otimizando com Bloom Filter. As implementações sérias na comunidade combinam o filtro com algoritmos determinísticos de varredura — como Kangaroo (Pollard's kangaroo) — que reduzem a complexidade de O(2ⁿ) para aproximadamente O(2^(n/2)), tornando o problema tratável em escala de anos, não de eras geológicas.
O Bloom Filter, isoladamente, não resolve o puzzle — ele resolve o problema de engenharia de não retestar o que já foi testado. Essa distinção é o que separa quem entende a estrutura de quem só está rodando código copiado de fórum sem entender o gargalo real.
| Estrutura | Memória para 150M itens | Falso positivo | Uso ideal |
|---|---|---|---|
| Lista Python | Vários GB | Não | Poucos milhares de itens |
| Set Python | ~1-2 GB | Não | Até dezenas de milhões |
| Bloom Filter | ~350 MB | Sim (configurável) | Centenas de milhões a bilhões |
- Use Bloom Filter quando o volume de checkpoints ultrapassar dezenas de milhões de entradas.
- Calibre o
error_rateconforme a memória disponível — taxas menores exigem vetores maiores. - Nunca trate um "hit" do Bloom Filter como confirmação definitiva — sempre valide contra a lista real de endereços.
- Combine a deduplicação com algoritmos determinísticos para reduzir o espaço de busca de fato.
Conformidade Global: As informações regulatórias sobre criptoativos variam por jurisdição e estão em constante evolução. Consulte sempre as autoridades locais de proteção de dados e regulação financeira do seu país e verifique atualizações no IAPP Global Privacy Directory. Este conteúdo não constitui aconselhamento jurídico ou financeiro.
Perguntas Frequentes
O que é o Bitcoin Puzzle Transaction?
É possível resolver o puzzle 71 com um computador doméstico?
Qual a diferença entre Bloom Filter e um set do Python?
O Bloom Filter pode ser usado em outros projetos além de criptomoedas?
Qual o risco de usar esse tipo de script?
Como funciona a taxa de erro do Bloom Filter?
📚 Fontes e Referências
Bitcoin Forum — Bitcoin puzzle transaction thread oficial
Mempool.space — Explorador de blocos Bitcoin
Curtiu o conteúdo? Acompanhe mais análises técnicas no @CanalQb no YouTube.
Feito com Master Rules Claude v8.6
Comentários
Comente só assim vamos crescer juntos!