Como Usar a Testnet Chainphon e se Preparar para o Lançamento Oficial
Sempre crie uma frase de segurança única para jogos, testnets ou airdrops e evite usar sua carteira principal.
Gerador de frases BIP-39 com chave privada e banco de dados SQLite
Este artigo apresenta um script avançado em Python para a geração e validação de frases mnemônicas compatíveis com o padrão BIP-39. Ele é capaz de derivar chaves privadas, converter para o formato WIF (Wallet Import Format) e armazenar os dados em bancos de dados SQLite organizados por prefixo de palavras. Essa abordagem permite gerenciamento eficiente, segmentação e reprocessamento inteligente das combinações.
O que são frases mnemônicas BIP-39?
Frases mnemônicas BIP-39 são sequências de palavras legíveis por humanos usadas para gerar determinística e de forma segura carteiras de criptomoedas. Essas frases representam uma seed criptográfica e são amplamente utilizadas para recuperar carteiras em diversos blockchains como Bitcoin, Ethereum e outros.
Funcionalidades do script Python
Este script realiza as seguintes funções:
- Carrega um dicionário de palavras do arquivo
palavras.txt - Gera combinações de 3 palavras para anexar a uma base fixa de 21 palavras
- Verifica se a frase completa gera uma chave privada válida
- Converte a chave para o formato WIF
- Registra os dados em um banco SQLite único para cada prefixo de palavra
Requisitos do sistema
Você deve ter as seguintes bibliotecas instaladas no ambiente Python:
pip install bip_utils
Além disso, é necessário um arquivo palavras.txt contendo palavras separadas por linha, preferencialmente seguindo a lista oficial do BIP-39 para o idioma inglês.
Como o script organiza os dados
A cada nova palavra da combinação, um banco de dados SQLite diferente é criado ou reutilizado. Isso resulta em arquivos como:
controle_ability.dbcontrole_about.dbcontrole_access.db
Essa divisão torna o armazenamento escalável e facilita futuras análises, buscas ou reprocessamento.
Script completo em Python
from bip_utils import Bip39SeedGenerator, Bip44, Bip44Coins
import itertools
import sqlite3
import os
d_contador = 0
c_contador = 0
valid_frases_printed = 0
current_db = None
def criar_tabela_se_nao_existir(conn):
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS mnemonics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
frase TEXT NOT NULL UNIQUE,
private_key TEXT NOT NULL,
wif TEXT NOT NULL
)
''')
conn.commit()
def carregar_palavras():
try:
with open('palavras.txt', 'r') as f:
palavras = f.read().splitlines()
return palavras
except FileNotFoundError:
print("Arquivo 'palavras.txt' não encontrado.")
return []
def verificar_mnemonica(frase):
global d_contador, c_contador, valid_frases_printed, current_db
try:
seed_bytes = Bip39SeedGenerator(frase).Generate()
bip44 = Bip44.FromSeed(seed_bytes, Bip44Coins.BITCOIN)
private_key = bip44.PrivateKey().Raw().ToHex()
wif = bip44.PrivateKey().ToWif()
inserir_no_banco(frase, private_key, wif)
c_contador += 1
if c_contador % 10000 == 0:
valid_frases_printed += 1
print(f"Frase válida #{c_contador}: {frase}\n")
print(f"\tFrases descartadas: {d_contador} \t|\tFrases válidas: {c_contador}", end='\r')
except Exception:
d_contador += 1
print(f"\tFrases descartadas: {d_contador} \t|\tFrases válidas: {c_contador}", end='\r')
def inserir_no_banco(frase, private_key, wif):
global current_db
with sqlite3.connect(current_db) as conn:
cursor = conn.cursor()
try:
cursor.execute('''
INSERT INTO mnemonics (frase, private_key, wif)
VALUES (?, ?, ?)
''', (frase, private_key, wif))
conn.commit()
except sqlite3.IntegrityError:
print(f"Frase duplicada, não inserida: {frase}")
def gerar_frases():
global current_db
palavras = carregar_palavras()
if not palavras:
return
combinacoes_ultimas_palavras = itertools.product(palavras, repeat=3)
bancos_existentes = [f for f in os.listdir() if f.startswith("controle_") and f.endswith(".db")]
bancos_existentes.sort()
if bancos_existentes:
current_db = bancos_existentes[-1]
else:
first_word = palavras[0]
current_db = f'controle_{first_word}.db'
with sqlite3.connect(current_db) as conn:
criar_tabela_se_nao_existir(conn)
print(f"Criando novo banco de dados: {current_db}")
ultima_frase = obter_ultima_frase()
continuar = False if ultima_frase else True
base_frase = 'trim skill build repair either cricket vocal riot vast wink engage puzzle poem bike wall joke august size improve note smooth'
for combinacao in combinacoes_ultimas_palavras:
frasecompleta = base_frase + ' ' + ' '.join(combinacao)
nova_palavra = combinacao[0]
db_name = f'controle_{nova_palavra}.db'
if current_db != db_name:
current_db = db_name
if not os.path.exists(current_db):
with sqlite3.connect(current_db) as conn:
criar_tabela_se_nao_existir(conn)
print(f"Usando banco de dados: {current_db}")
if ultima_frase and not continuar:
if frasecompleta == ultima_frase:
continuar = True
continue
verificar_mnemonica(frasecompleta)
def obter_ultima_frase():
global current_db
with sqlite3.connect(current_db) as conn:
cursor = conn.cursor()
cursor.execute('''SELECT frase FROM mnemonics ORDER BY ROWID DESC LIMIT 1''')
ultima_frase = cursor.fetchone()
return ultima_frase[0] if ultima_frase else None
if __name__ == "__main__":
gerar_frases()
Exemplo prático de saída
Frase mnemônica:
build repair either cricket vocal riot vast wink engage ...
Resultado:
- Chave privada em hexadecimal
- Chave WIF
- Armazenamento seguro em banco SQLite
Importante
Este conteúdo é educativo. O uso prático desse tipo de ferramenta exige conhecimento técnico sólido. Cabe ao usuário realizar uma autoanálise e não utilizar dados reais ou investir dinheiro sem plena compreensão dos riscos envolvidos.

Comentários
Comente só assim vamos crescer juntos!