Open rcini-com opened 4 months ago
Gostei das ideias, vou contribuir com mais 10 cents.
Marcos
"Criar um arquivo txt que armazene a última chave testada com o nome Last_key_Test_xx.txt onde xx é o número do desafio. Assim quando reiniciar, pode ao menos continuar de onde parou, vai que está a fim de rodar outro para arriscar a sorte?"
Essa ideia eu estou fazendo kkk, esotu fazendo que ao salvar a ticket de 5 segundos salve o numero carteira e a ultima chave, assim qnd reabrir e escolher a opção de continuar o modo sequencial da ultima chave ele busca no arquivo e continua o range, e tipo se quiser alterar o range, vai inserir o numero do range, para continuar, igual do btc finder
Realizei o pull request, caso queiram conferir o codigo : https://github.com/lmajowka/btcgo/pull/15 👍
Deixei um comentario la @lucastoledo95 gostei do codigo! Obrigado por contribuir
Deixei um comentario la @lucastoledo95 gostei do codigo! Obrigado por contribuir
Feito mano, feliz em contribuir.
Adicionei a porcentagem atual para exibir no log... (iniciei em 62%)
Chaves checadas: 66,021,225 Chaves por segundo: 386,874 Porcentagem de range verificado: 62.000000005987%
Eae pessoal, tudo blz? Quero contribuir com algumas ideias para aprimorar o sistema.
Webhooks: Seria ótimo ter uma opção de webhooks. Poderíamos add a URL via terminal mesmo ou em um arquivo de configuração. Esse webhook seria acionado quando uma carteira fosse encontrada, enviando uma requisição POST para a URL configurada com uma mensagem do tipo "Carteira encontrada". Isso seria útil especialmente para quem, como eu, está rodando a aplicação em um Raspberry Pi (para evitar acessar via SSH ou conectar um monitor). Com webhooks, poderíamos automatizar 1001 coisas.
Arquivo de Configurações: Com o rápido crescimento da aplicação e a quantidade crescente de inputs no terminal, seria interessante ter um arquivo dedicado apenas para configurações. Esse arquivo conteria parâmetros de configuração no formato "chave:valor" e um por linha. Isso também ajudaria a padronizar a questão de salvar o estado atual (última chave gerada) que já existe.
Porcentagem Atual: Também tinha pensado na mesma coisa que o amigo @samoellaureano sugeriu, de exibir a porcentagem atual no terminal. Nos testes que eu estava fazendo, coloquei para exibir a chave atual, o que já dava uma boa noção do quanto o processo estava evoluindo. Acho que a ideia de implementar essas métricas ajudaria bastante a acompanhar o progresso.
TView para Métricas: Considerando o aumento das métricas exibidas no terminal, sugiro a utilização da biblioteca TView para criar telas e/ou widgets no terminal. É uma solução bem legal e ajudaria a organizar melhor as informações.
Padrões de Melhores Práticas: Seria interessante adotar um padrão básico de melhores práticas no código. Notei algumas inconsistências na escrita, nomes de variáveis, funções e comentários. Por exemplo, há uma mistura de inglês e português e também algumas variáveis que não seguem o padrão camelCase. Padronizar esses aspectos pode melhorar a legibilidade e a manutenção do código.
Espero que essas sugestões sejam úteis. Vou continuar acompanhando e contribuindo na medida do possível. Abraços.
Aqui fica mais uma ideia Criar uma versão com ligação a um servidor (online, com grpc por exemplo ou outra forma) e uma base de dados (partilhada por todos os btcgo's), onde o range é dividido em blocos. A base de dados guarda os blocos já verificados e disponibiliza novos blocos que ainda não tenham sido testados. Evitando assim a repetição dos testes. Sempre que um btcgo termina um bloco informa o server que terminou e recebe um novo bloco.
galera, vou propor aqui mais um aprimoramento que pode ou vai reduzir/ELIMINAR alguns cálculos durante a geração das chaves para teste e consequentemente aumentar um pouco a velocidade/quantidade de chaves testadas.
com base nesse documento (link abaixo) do bitcoin, é possivel reverter o endereço público até a saída do RIPEMD-160. https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses#How_to_create_Bitcoin_Address [https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses#How_to_create_Bitcoin_Address] dessa forma se remove 5 etapas da geração que são desnecessárias, reduzindo muito o processamento dos endereços.
ETAPAS ELIMINADAS do passo 4 ao passo 9 do documento acima:
vou deixar 2 códigos anexos, sendo o primeiro com a geração passo-a-passo e a reversão do endereço _(para entendimento de como funcinam as etapas "gera_endereco_passo_apasso.go"), e outro apenas com a parte da reversão do endereço público até a saida dele em RIPEMD-160 _(pub_address_to_RIPEMD160.go).
Neste segundo, vc tem uma lista dos endereços públicos que quer converter/simplificar até o RIPEMD-160 e ele gera uma saída em um arquivo novo.
PS: no arquivo de endereços de exemplo a converter, eu deixei os puzzle 66, 67 e 68. PS2: os códigos foram renomeados com a adição da extenção .TXT para poder enviar aqui.
gera_endereco_passo_a_passo.go.txt pub_address_to_RIPEMD_160.go.txt btc_pub_address.txt
E abaixo, uma pequena parte do código que estou usando, que gera os endereços até a saída do RIPEMD e faz a comparação. (apenas para referencia e auxiliar na possível implementação)
` go:
// Chave privada ECDSA
privateKeyBytes, err := hex.DecodeString(privateKeyHex)
if err != nil {
fmt.Printf("Erro ao decodificar chave privada hexadecimal: %v\n", err)
return
}
privateKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), privateKeyBytes)
// Chave pública (33 bytes, começando com 0x02 ou 0x03 dependendo da paridade de Y)
publicKeyBytes := privateKey.PubKey().SerializeCompressed()
// SHA-256 da chave pública
sha256Hash := sha256.Sum256(publicKeyBytes)
// RIPEMD-160 do SHA-256
ripemd160Hasher := ripemd160.New()
ripemd160Hasher.Write(sha256Hash[:])
ripemd160Hash := ripemd160Hasher.Sum(nil)
// Converte ripemd160Hash para string hexadecimal
hashStr := hex.EncodeToString(ripemd160Hash)
// Busca binária para verificar se ripemd160Hash está no arquivo btc_pub_address_RIPEMD-160.txt
idx := sort.SearchStrings(ripemd160Hashes, hashStr)
if idx < len(ripemd160Hashes) && ripemd160Hashes[idx] == hashStr {
// Encontrou um match, exibe e salva no arquivo "loop_ENCONTRADOS.txt"
mu.Lock()
fmt.Printf("Private Key Hex: %s\nRIPEMD-160 Hash: %s\n", privateKeyHex, hashStr)
// Gerar a chave privada WIF
wif, err := btcutil.NewWIF(privateKey, &chaincfg.MainNetParams, true)
if err != nil {
fmt.Printf("Erro ao gerar WIF: %v\n", err)
mu.Unlock()
return
}
fmt.Printf("Chave privada WIF (Compressed): %s\n", wif.String())
`
bora tornar esse buscador de btc o melhor de todos. e mais um PS: eu fiz esses exemplos em GO usando o ChatGPT, e essa é a primeira vez que estou usando GO.
gostei muito desse sistema e gostaria de deixar algumas idéias para melhoria e aumento de performance do sistema.
1-ao selecionar um range, é importante buscar apenas a carteira referente a esse range. [em meus testes, ao escolher o range 66 e deixar apenas a carteira referente a ele em "wallets.json", aumentou em 4x a quantidade de chaves por segundo, pois não tem sentido ficar em loop de todas as carteiras já que sabemos que existe apenas uma em cada range]
2-exibir na tela junto com a informação de total de chaves checadas, o último HEX que foi testado. [dessa forma se eu precisar interropmper a busca, eu edito o "ranges.json" e coloco esse hex como inicial para continuar de onde parou.
3-o limite MAXIMO do range da carteira não está funcionando, pois caso vc não tenha uma carteira válida/encontrada dentro do range especificado, ele continua buscando carteiras infinitamente. [seria legal fazer com que ao terminar de buscar o range ele pare de rodar]
4-e implementar uma forma de definir o numero de CPUs a ser utilizado, se marcado com "0" utiliza todas, demais numeros é a quantidade a ser utilizada.
e parabéns por fazer esse código em GO, nunca tinha fuçado em nada em GO, e achei bem interessante.
Rafael