Formulário de contato

Nome

E-mail *

Mensagem *

Imagem

Script de Integração IceSecp256k1: Gere e Verifique WIFs Bitcoin

Script de Integração IceSecp256k1: Gere e Verifique WIFs Bitcoin

Publicado por em


@CanalQb no YouTube


@CanalQb Banner

Script de Integração IceSecp256k1: Gere e Verifique WIFs Bitcoin

Leitura: 8 min
TL;DR:
  • O script integra a DLL IceSecp256k1 com fallback automático para Python puro, permitindo gerar e verificar WIFs mesmo sem a DLL nativa.
  • Oferece 3 camadas de operação criptográfica — DLL, coincurve e ponto-a-ponto manual — garantindo funcionamento em qualquer ambiente Windows.
  • Inclui conversão WIF/hex, hash160, derivação de endereço Bitcoin e verificação em lote, com correção recente de compatibilidade entre versões da lib base58.

ID de vídeo padrão usado — substituir antes de publicar

Nota Técnica: Scripts e automações fornecidos têm fins exclusivamente educacionais. Teste sempre em ambiente controlado. O @CanalQb não se responsabiliza por danos, perdas ou bloqueios decorrentes do uso indevido. Este conteúdo é parte do ecossistema canalqb.com.br.

O que o script wif_ice_integration.py faz?

O wif_ice_integration.py é uma ferramenta desenvolvida em Python que integra a DLL IceSecp256k1 (criada por k3ntina/kTimesG) para realizar operações criptográficas da curva secp256k1 do Bitcoin. Ele converte chaves privadas para o formato WIF (Wallet Import Format), deriva endereços Bitcoin, calcula hash160 e verifica a validade de WIFs — tudo isso com fallback automático quando a DLL não está disponível.

Aqui no @CanalQb, validamos que esse tipo de script é essencial para quem trabalha com análise de carteiras, geração de chaves, testes de integração ou ferramentas de auditoria on-chain. O grande diferencial é a arquitetura de fallback em três camadas, que permite o script funcionar em qualquer máquina Windows mesmo sem a DLL compilada.

Para que serve o WIF no ecossistema Bitcoin?

WIF (Wallet Import Format) é o formato padrão usado para representar chaves privadas Bitcoin de forma compacta e segura, com checksum embutido via base58check. Uma chave privada em hex como 0000000000000000000000000000000000000000000000000000000000000001 vira o WIF KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn.

Esse formato é universal em carteiras Bitcoin: toda carteira que exporta ou importa chaves privadas usa WIF. Sem ele, você teria que lidar com hex bruto de 64 caracteres, sem proteção contra erros de digitação. O checksum embutido no base58check detecta erros de transcrição antes que você tente usar a chave.

O script permite circular entre os dois formatos livremente: priv_to_wif() converte hex para WIF e wif_to_priv() faz o caminho inverso. A utilidade prática aparece quando você precisa importar chaves geradas por ferramentas técnicas em carteiras comuns como Electrum, Bitcoin Core ou BlueWallet.

Como funciona a integração com a DLL IceSecp256k1?

A DLL ice_secp256k1.dll expõe funções otimizadas em C para operações na curva elíptica secp256k1. O script usa ctypes para carregá-la e configurar as assinaturas das funções manualmente, já que a DLL não tem arquivos de cabeçalho no estilo Windows padrão.

As funções da DLL que o script tenta usar são:

  • privatekey_loop_h160 — loop de chave privada para hash160 (ideal para varredura em lote)
  • hash160 — SHA256 + RIPEMD160 em uma chamada
  • hash_to_address — hash160 para endereço Bitcoin
  • priv_to_pub — multiplicação escalar na curva secp256k1

O carregamento é feito como singleton via IceSecp256k1DLL.load(), que só tenta carregar a DLL uma vez e armazena o resultado em cache. Se a DLL não existe ou falha ao carregar, o script armazena o erro e retorna None — momento em que todas as funções que dependem dela ativam o fallback automático.

Passo a passo: como usar o script

Passo 1: Instale as dependências

O script depende de duas bibliotecas Python: base58 e coincurve. A base58 é responsável pela codificação/decodificação no formato base58check, que é o que dá ao WIF sua representação compacta com checksum. A coincurve é uma binding Python otimizada para a libsecp256k1 do Bitcoin Core, usada como primeira alternativa à DLL.

Esse passo é necessário porque o script importa ambos os pacotes no topo. Sem eles, você receberá um ModuleNotFoundError antes mesmo de qualquer execução.

Comando para instalar:

pip install base58 coincurve

Quando funcionar, você verá as bibliotecas sendo baixadas e instaladas, seguidas do prompt de comando novamente. Se já estiverem instaladas, o pip apenas confirma que os requisitos já foram atendidos.

Passo 2: Coloque a DLL no diretório correto

A DLL ice_secp256k1.dll deve estar na pasta puzzlescript/ (um nível acima do script). O script constrói o caminho automaticamente com SCRIPT_DIR = Path(__file__).parent.parent, resultando em puzzlescript/ice_secp256k1.dll.

Esse passo é necessário porque o script verifica a existência do arquivo com DLL_PATH.exists() antes de tentar carregar. Se a DLL não estiver no local exato, o script carrega None e usa exclusivamente os fallbacks Python — o que funciona, mas perde a performance da implementação nativa em C.

Quando a DLL está no lugar certo, a saída na inicialização mostra:

DLL path: C:\Users\SeuUser\Desktop\puzzlescript\ice_secp256k1.dll DLL exists: True DLL loaded successfully

Se a DLL não for encontrada, a mensagem será DLL not found e o script continua com os fallbacks.

Erro comum: Se você colocar a DLL na mesma pasta do script em vez da pasta pai, o DLL_PATH não vai encontrá-la. O script espera a estrutura puzzlescript/scripts/wif_ice_integration.py e puzzlescript/ice_secp256k1.dll. Verifique a árvore de diretórios antes de executar.

Passo 3: Execute o script

Navegue até a pasta scripts/ e execute o script com Python:

cd C:\Users\SeuUser\Desktop\puzzlescript\scripts python wif_ice_integration.py

Esse comando executa o bloco if __name__ == "__main__" que está no final do arquivo. Ele testa a DLL, gera o WIF para a chave privada 1, deriva o endereço e exibe os resultados.

Resultado esperado com DLL carregada:

IceSecp256k1 DLL integration test DLL path: C:\Users\Qb\Desktop\puzzlescript\ice_secp256k1.dll DLL exists: True DLL loaded successfully Test priv: 0000000000000000000000000000000000000000000000000000000000000001 Test WIF: KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn Address: 1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH Hash160: 751e76e8199196d454941c45d1b3a323f1433bd6

O endereço 1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH é o endereço Bitcoin conhecido para a chave privada 1 (compressed). Se você ver esse endereço, o script está funcionando perfeitamente.

Erro comum — KeyError: 'address': Esse erro ocorre quando a função wif_to_priv() retorna None porque a biblioteca base58 já remove o checksum de 4 bytes na decodificação, mas o código antigo esperava o checksum presente. A correção (já aplicada na versão atual do script) ajusta a verificação de tamanho para aceitar 33 ou 34 bytes (com checksum removido) ou 37/38 bytes (com checksum presente), garantindo compatibilidade com todas as versões da lib base58.

Passo 4 (opcional): Use as funções individualmente no seu código

O script foi projetado para ser importado como módulo. Você pode usar as funções principais em seus próprios scripts:

from wif_ice_integration import priv_to_wif, wif_to_priv, verify_wif, batch_verify_wifs # Gerar WIF a partir de uma chave privada hex wif = priv_to_wif("0000000000000000000000000000000000000000000000000000000000000001", compress=True) print(wif) # KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn # Verificar um WIF result = verify_wif(wif) print(result["address"]) # 1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH # Verificar múltiplos WIFs em lote wifs = ["KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn"] results = batch_verify_wifs(wifs)

Esse passo é útil se você está construindo uma ferramenta maior, como um gerador de carteiras, um verificador de chaves ou um script de auditoria. Note que o parâmetro compress=True gera WIF comprimido (com sufixo 0x01), que é o padrão da maioria das carteiras modernas.

Análise do código: funções principais

priv_to_wif e wif_to_priv: conversão entre hex e WIF

Essas duas funções são simétricas. priv_to_wif() pega uma string hex de 64 caracteres, adiciona o prefixo 0x80 (mainnet), o sufixo 0x01 se comprimido, e codifica tudo em base58check. A biblioteca base58 cuida do checksum de 4 bytes (duplo SHA256) automaticamente.

O caminho inverso, wif_to_priv(), decodifica o base58check, remove prefixo e sufixo, e retorna apenas os 32 bytes da chave em hex. A correção que aplicamos aqui no @CanalQb foi crucial para compatibilidade: diferentes versões da lib base58 tratam o checksum de forma diferente (algumas removem, outras mantêm), e o código agora lida com ambas as situações.

coincurve_pub_compressed: chave pública a partir da privada

Esta função tenta usar a biblioteca coincurve (binding C otimizada) para derivar a chave pública comprimida. Se falhar, ativa o fallback _python_pub_compressed(), que implementa a multiplicação escalar na curva secp256k1 inteiramente em Python puro, usando o algoritmo de duplicação-e-soma (double-and-add) sobre as coordenadas do ponto G da curva.

O fallback em Python puro é lento — leva alguns segundos por chave — mas não depende de nenhuma biblioteca externa além do próprio Python. Para uma única verificação ocasional, é suficiente. Para processamento em lote, a DLL ou o coincurve são muito mais rápidos.

verify_wif: verificação completa de um WIF

Esta função amarra todo o fluxo: decodifica o WIF, deriva a chave pública, calcula o hash160, gera o endereço Bitcoin e retorna um dicionário completo com todos os dados. Se um endereço esperado for fornecido, ela compara e retorna um campo address_match booleano.

O dicionário de retorno inclui: wif, private_key_hex, public_key_compressed, hash160, address, valid e dll_used. Isso permite que você use o resultado em programas maiores sem precisar reprocessar nada.

O que podemos aprimorar no script?

O script atual é funcional e robusto, mas há várias melhorias possíveis para deixá-lo ainda mais útil:

1. Suporte a endereços SegWit e Bech32

Atualmente o script gera apenas endereços Legacy (P2PKH) começando com 1. Adicionar suporte a P2SH-P2WPKH (endereços 3) e Bech32 (endereços bc1) aumentaria muito a utilidade prática, já que a maioria das carteiras modernas usa SegWit.

2. Modo de varredura em lote com a DLL

A DLL expõe a função privatekey_loop_h160, que é otimizada para processar múltiplas chaves rapidamente. O script atual não usa essa função — seria um ganho enorme de performance implementar um loop que passe uma faixa de chaves privadas diretamente para a DLL, em vez de chamar a função de derivação uma vez por chave.

3. Exportação para CSV

Seria útil adicionar uma função que exporte os resultados da verificação em lote para um arquivo CSV, com colunas para WIF, chave privada, chave pública, hash160 e endereço. Isso facilitaria a análise em planilhas e a integração com outras ferramentas.

4. Testes automatizados

O script não tem testes unitários. Adicionar testes com pytest para as funções principais, usando chaves conhecidas (como a chave 1, 2 e a chave aleatória do Bitcoin Testnet), tornaria o código mais confiável para integração em projetos maiores.

5. Suporte a Testnet e Regtest

O prefixo 0x80 está hardcoded para mainnet. Adicionar um parâmetro de rede que altere o prefixo para 0xEF (testnet) ou 0x6F (regtest) permitiria usar o script em ambientes de teste sem risco de perder fundos reais.

6. Otimização do fallback Python puro

A implementação _python_pub_compressed() é didática mas lenta. Dá para otimizar usando janelas de janelas (window method) ou pré-computação de pontos para acelerar a multiplicação escalar em Python puro — útil para ambientes sem coincurve nem DLL.

Perguntas Frequentes (FAQ)

O que é WIF e por que usar em vez de hex bruto?
WIF (Wallet Import Format) é uma codificação base58check que adiciona prefixo de rede, flag de compressão e checksum de 4 bytes à chave privada. Isso torna o formato mais seguro para transporte manual, porque o checksum detecta erros de digitação. Enquanto um hex de 64 caracteres sem checksum pode ser copiado errado sem aviso, um WIF com um caractere trocado resulta em erro de decodificação. Além disso, todas as carteiras Bitcoin mainstream importam e exportam no formato WIF, então é o formato padrão de facto para interoperabilidade.
Preciso da DLL IceSecp256k1 para usar o script?
Não. O script foi projetado com fallback em três camadas: a DLL nativa (mais rápida), a biblioteca coincurve (binding C do libsecp256k1) e, por último, uma implementação puramente Python da multiplicação escalar na curva secp256k1. Se a DLL não estiver presente, o script usa coincurve. Se coincurve não estiver instalado, o fallback Python puro é ativado. Isso significa que o script funciona em qualquer ambiente Windows com Python, independentemente de dependências compiladas. A única diferença é a performance: a DLL pode processar centenas de chaves por segundo, enquanto o fallback Python leva alguns segundos por chave.
O erro "KeyError: 'address'" foi corrigido permanentemente?
Sim, a correção foi aplicada diretamente no código-fonte do script. A causa raiz era que a função wif_to_priv() verificava len(decoded) in (37, 38) para determinar se o WIF era válido, mas diferentes versões da biblioteca base58 se comportam de forma diferente: algumas removem o checksum de 4 bytes na decodificação (resultando em 33 ou 34 bytes), outras mantêm (resultando em 37 ou 38 bytes). A correção adicionou uma verificação que detecta qual versão está em uso e ajusta o tratamento adequadamente, tornando o script compatível com todas as versões da lib base58 sem exigir instalação de uma versão específica.
O script funciona no Linux ou macOS?
O script foi escrito especificamente para Windows, pois a DLL ice_secp256k1.dll é uma biblioteca compilada para Windows (formato PE). No entanto, todas as funções que não dependem da DLL — priv_to_wif, wif_to_priv, hashlib_hash160, coincurve_pub_compressed e o fallback Python puro — funcionam em qualquer sistema operacional onde o Python rode. Para usar em Linux ou macOS, basta remover ou condicionar a parte de carregamento da DLL e confiar no coincurve ou no fallback Python. O coincurve, inclusive, tem versões nativas para Linux e macOS.
Como verificar se um WIF corresponde a um endereço específico?
Use a função verify_wif(wif, expected_address) passando o WIF e o endereço como parâmetros. A função decodifica o WIF, deriva a chave pública, calcula o hash160, gera o endereço Bitcoin e compara com o endereço fornecido. O resultado inclui o campo address_match (True ou False) e o campo valid (True se a comparação for bem-sucedida ou se nenhum endereço foi fornecido). Para verificar múltiplos pares de uma vez, use batch_verify_wifs(lista_wifs, lista_enderecos), que itera sobre os pares e retorna uma lista de resultados.

Referências e links úteis

Gostou do conteúdo?

Inscreva-se no @CanalQb no YouTube para mais tutoriais sobre Bitcoin, criptografia, automação e ferramentas práticas.

Feito com Master Rules Claude v9.0

Nota Jurídica: Este conteúdo pode estar sujeito a diferentes leis de privacidade dependendo da sua jurisdição. Consulte o IAPP Global Privacy Directory para informações específicas da sua região.

Marcadores: Automação bitcoin criptografia DLL Python Script secp256k1 Tutorial

© agosto 27, 2026 CanalQb — Python, Scripts, Automação, Airdrops e Criptomoedas | Web3 e Tech na Prática



SEO Dashboard @CanalQb

Carregando dados...

Dados GA4 + Search Console | Atualizar | gerado via API Google