lmajowka / btcgo

btcfinder implemented using go
64 stars 58 forks source link

idéias para aprimorar o sistema #11

Open rcini-com opened 4 months ago

rcini-com commented 4 months ago

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

MarcosJRcwb commented 4 months ago

Gostei das ideias, vou contribuir com mais 10 cents.

  1. 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?
  2. Se processado um range, vamos supor que comece com 53.82837%, guarde esta chave para efeitos de memória e na hora de parar que tenha uma confirmação da última testada (tipo ideia 1). Assim, vai ter histórico de zonas de exclusão, vamos supor que queria procurar um % abaixo do anterior. Ao rodar já sabe a faixa que deve ignorar ou mesmo a galera vai contribuido com faixas de exclusão.
  3. Poderia colocar uma chamada de Token da API do Telegram para que vá informando em um BOT (do desafio) como andam as pesquisas? Já uso estes BOT´s com Python e dão muito certo.

Marcos

lucastoledo95 commented 4 months ago

"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 image image

lucastoledo95 commented 4 months ago

Realizei o pull request, caso queiram conferir o codigo : https://github.com/lmajowka/btcgo/pull/15 👍

lmajowka commented 4 months ago

Deixei um comentario la @lucastoledo95 gostei do codigo! Obrigado por contribuir

lucastoledo95 commented 4 months ago

Deixei um comentario la @lucastoledo95 gostei do codigo! Obrigado por contribuir

Feito mano, feliz em contribuir.

samoellaureano commented 4 months ago

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%
felipeneri commented 4 months ago

Eae pessoal, tudo blz? Quero contribuir com algumas ideias para aprimorar o sistema.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

RhaPT commented 4 months ago

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.

rcini-com commented 4 months ago

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.