
Algoritmo Pollard's Kangaroo acelerado por GPU para resolver o Problema do Logaritmo Discreto em Curvas Elípticas (ECDLP) no secp256k1, com suporte para backends Vulkan, Metal e DX12.
Algoritmo Pollard's Kangaroo acelerado por GPU para resolver o Problema do Logaritmo Discreto de Curva Elíptica (ECDLP) no secp256k1.
--benchmark para testar hardware, --save-benchmarks para registrar resultadosA maioria das implementações existentes de Kangaroo (JeanLucPons/Kangaroo, RCKangaroo, etc.) suporta apenas GPUs NVIDIA via CUDA. Esta implementação usa WebGPU/wgpu, que fornece computação GPU multiplataforma através de Vulkan, Metal e DX12.
paru -S kangaroo
cargo install kangaroo
git clone https://github.com/oritwoen/kangaroo
cd kangaroo
cargo build --release
cargo build --release --features boha
kangaroo --pubkey <PUBKEY> --start <START> --range <BITS>
É necessário fornecer --target ou --pubkey.
Usando provedor de dados (boha):
# Resolver puzzle usando dados boha (automático: pubkey, start, range)
kangaroo --target boha:b1000/66
# Sobrescrever range (buscar subconjunto menor)
kangaroo --target boha:b1000/66 --range 60
# Listar puzzles disponíveis
kangaroo --list-providers
Parâmetros manuais:
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40
Com restrição modular (k ≡ 37 mod 60):
kangaroo \
--pubkey 03a2efa402fd5268400c77c20e574ba86409ededee7c4020e4b9f0edbee53de0d4 \
--start 8000000000 \
--range 40 \
--mod-step 3c \
--mod-start 25
Isso reduz o espaço de busca em ~60×. Útil quando a estrutura parcial da chave é conhecida (ex.: chave gerada com um padrão de passo previsível).
O algoritmo Pollard's Kangaroo resolve o problema do logaritmo discreto em tempo O(√n), onde n é a faixa de busca. Ele funciona da seguinte forma:
Otimização de Pontos Distintos (DP): em vez de armazenar todos os pontos visitados, armazenamos apenas pontos cuja coordenada x tenha um número específico de bits zero à esquerda. Isso reduz drasticamente o uso de memória, ainda permitindo a detecção de colisões.
Operações esperadas: ~2^(range_bits/2)
Execute kangaroo --benchmark para testar seu hardware sem tocar em arquivos. Use kangaroo --benchmark --save-benchmarks para atualizar BENCHMARKS.md.
| Caso de Uso | Exemplo |
|---|---|
| Chave parcial decodificada | Puzzle dá ~240 bits, precisa encontrar ~16 restantes |
| Chave em faixa conhecida | Sabe-se que a chave está entre X e Y |
| Verificar quase-solução | Tem candidato, buscar ±N bits em torno dele |
NÃO é útil para:
use kangaroo::{KangarooSolver, GpuContext, GpuBackend, parse_pubkey, parse_hex_u256, verify_key};
fn main() -> anyhow::Result<()> {
let pubkey = parse_pubkey("03...")?;
let start = parse_hex_u256("8000000000")?;
let ctx = pollster::block_on(GpuContext::new(0, GpuBackend::Auto))?;
let mut solver = KangarooSolver::new(
ctx,
pubkey.clone(),
start,
40, // range_bits
12, // dp_bits
1024, // num_kangaroos
)?;
loop {
if let Some(key) = solver.step()? {
if verify_key(&key, &pubkey) {
println!("Found: {}", hex::encode(&key));
break;
}
}
}
Ok(())
}
Kangaroo suporta provedores de dados externos para fontes de puzzles. Os provedores fornecem pubkey, faixa de chave e outros metadados do puzzle.
boha fornece dados de puzzles criptográficos, incluindo Bitcoin Puzzle Transaction (b1000).
Compile com suporte a boha:
cargo build --release --features boha
Uso:
# Resolver puzzle específico
kangaroo --target boha:b1000/66
# Listar puzzles solucionáveis (não resolvidos com pubkey conhecida)
kangaroo --list-providers
O provedor valida substituições de range — você não pode pesquisar fora da faixa de chave do puzzle.
src/
├── main.rs # Ponto de entrada CLI
├── lib.rs # Entrada da biblioteca + Args + run()
├── solver.rs # Coordenação do resolvedor GPU
├── cli.rs # Utilitários CLI (tracing, barra de progresso)
├── benchmark.rs # Conjunto de benchmarks integrado
├── modular.rs # Transformação de restrição modular
├── math.rs # Aritmética de 256 bits, geração de máscara DP
├── convert.rs # Conversões Limb/byte para GPU↔CPU
├── provider/
│ ├── mod.rs # Interface do sistema de provedores
│ └── boha.rs # Provedor boha (protegido por feature)
├── cpu/
│ ├── cpu_solver.rs # Resolvedor puro em CPU (teste/comparação)
│ ├── dp_table.rs # Detecção de colisão por Pontos Distintos
│ └── init.rs # Inicialização dos cangurus + tabelas de salto
├── crypto/
│ └── mod.rs # Wrappers k256/secp256k1
├── gpu/
│ ├── pipeline.rs # Configuração do pipeline de computação
│ └── buffers.rs # Gerenciamento de buffers GPU
├── gpu_crypto/
│ ├── context.rs # Contexto GPU + seleção de backend
│ └── shaders/ # Biblioteca de shaders WGSL
│ ├── field.wgsl # Aritmética de corpo secp256k1
│ └── curve.wgsl # Operações de ponto Jacobiano
└── shaders/
└── kangaroo_affine.wgsl # Shader de computação principal Kangaroo
Licença MIT — veja LICENSE para detalhes.
| Argumento | Padrão | Descrição |
|---|
-t, --target | - | Alvo do provedor de dados (ex.: boha:b1000/135) |
-p, --pubkey | - | Chave pública alvo (hex compactado, 33 bytes) |
-s, --start | 0 | Início da faixa de busca (hex, sem prefixo 0x) |
-r, --range | 32 | Faixa de busca em bits (chave está em [start, start + 2^range - 1]) |
-d, --dp-bits | auto | Bits de ponto distinto |
-k, --kangaroos | auto | Número de cangurus paralelos |
--gpu | 0 | Índice do dispositivo GPU |
--backend | auto | Backend GPU: auto, vulkan, dx12, metal, gl |
-o, --output | - | Arquivo de saída para resultado |
-q, --quiet | false | Saída mínima, apenas imprimir a chave encontrada |
--max-ops | 0 | Máximo de operações (0 = ilimitado) |
--cpu | false | Usar resolvedor CPU em vez de GPU |
--json | false | Saída de resultados de benchmark em formato JSON |
--benchmark | false | Executar conjunto de benchmarks |
--save-benchmarks | false | Salvar resultados de benchmark em BENCHMARKS.md quando --benchmark for usado |
--mod-step | 1 | Passo modular M (hex): buscar apenas k ≡ R (mod M) |
--mod-start | 0 | Resíduo modular R (hex): 0 ≤ R < M |
--list-providers | false | Listar puzzles disponíveis dos provedores |