Como encontrar Bitcoins usando Google App Script

Para quem não conhece, em 2015, para mostrar toda a imensidão do espaço da chave privada (ou talvez apenas por diversão), alguém criou um “quebra-cabeça” onde ela disponibilizava um range (intervalo entre dois espaços) de chaves privadas e o endereço de sua respectiva carteira Bitcoin.

Dessa forma, seguindo as regras sobre os algoritimos criptográficos que regem o Bitcoin, podemos ser capazes de descobrir a chave privada de uma carteira Bitcoin simplesmente sorteando os dos valores deste range e verificando através dos algoritmos criptográficos se aquela chave privada escolhida gera uma chave pública válida de carteira Bitcoin. A chave da carteira Bitcoin é uma chave pública onde qualquer pessoa pode ter o acesso. A magia deste script está em através da geração aleatória da chave privada, conseguir descobrir se esta chave privada gera uma chave pública de carteira Biticoin através dos algoritimos criptográficos que regem o Bitcoin. Caso esta verificação seja verdadeira, meu parabéns! você acaba de ganhar uma bolada na loteria Bitcoin!

Desta forma, tudo que o código deste projeto busca resolver é encontrar uma chave privada válida dentro da imensidão deste espaço. Como é matemáticamente quase impossível achar este valor. O criador deste desafio o fez com total segurança de que ele nunca seria completado. Só para você ter uma ideia da grandeza deste espaço, imagina esconder algo no universo que pode estar dentro de qualquer lugar, inclusive de um átomo.

Você é livre para iniciar a sua busca a partir de qualquer ponto no universo. Mas depois de iniciado a busca, você só dependerá de suas pernas para se locomover no espaço. Conseguiu imaginar isso? Esse é um exemplo do grau de dificuldade que você vai enfrentar ao tentar achar uma chave privada usando este script.

Sobre o script

Conforme eu expliquei acima as chances de você conseguir encontrar uma chave de carteira válida são muito pequenas. Porém como você não vai gastar nada além do seu tempo com a configuração do projeto, eu acredito que mesmo assim ainda está valendo a pena.

A decisão de adaptar este script para o Google App Script é bem simples, veja:

  1. O Google App Script é gratuito
  2. Você pode executar o script em background através de um acionador
  3. Caso a chave seja encontrada, você pode se auto notificar automaticamente
  4. Você pode criar várias intâncias do mesmo script e deixar rodando

Estas são algumas das vantagens de se usar o Google App Script para este desafio louco!

Conforme a imagem abaixo, quando você baixar os arquivos do projeto pelo github, você deverá acessar o seu Google Drive através deste link: https://drive.google.com/drive/.

Dentro do google drive você pode criar uma pasta ou pode criar o arquivo de script diretamente. Veja a imagem abaixo:

Apenas clique com o botão direito do mouse sobre a tela para abrir este menu. Vá na última guia chamada “Mais” e depois selecione “Script do Google Apps”. Ele vai abrir um arquivo de script que será uma tela semelhante a imagem abaixo:

Primeiro você pode renomear o projeto. Onde está escrito “Projeto sem título” você pode colocar o nome do seu projeto. Do lado esquerdo onde está escrito Código.gs é onde você deve colar o código que está neste mesmo arquivo lá no Github. Apenas sobre escreva o Código.gs com o código do Github.

Dentro do projeto no Google App Script, você pode adicionar novos arquivos. Tudo que precisa fazer é seleciona o ícone do “+” para abrir um menu conforme a imagem abaixo.

Selecione Script para inserir um novo arquivo no projeto. Este arquivo você o nomeia conforme a imagem abaixo:

Observe que os arquivos precisam estar nesta mesma ordem. Para mudar a ordem dos arquivos, basta clicar no ícone dos três pontinhos para aparecer o menu da imagem abaixo:

Com o menu aberto, você pode mover o arquivo para cima ou para baixo e dessa forma você será capaz de organizar os arquivos do projeto conforme a ordem correta.

Tudo que você precisa fazer é copiar cada um dos arquivos no projeto do Github e colar dentro do Google App Script pela opção de criar novo arquivo.

Quando você finalizar isso o seu projeto será semelhante a isso aqui em termos de organização:

Configurando a execução do script de forma programada

A maravilha do Google App Script acontece com sua opção de configuração de “Acionadores”. Se você conferir nas imagens anteriores, vai perceber que existe um ícone de um “Relógio”. Nete ícone você acessa ao menu de configuração dos acionadores.

Mas antes disso, vamos testar o script. Abra o arquivo Código.gs e vá na função: start() linha 106. Dentro dela na função getWallet(66); nós podemos escolher o número da carteira. Coloque uma carteira já descoberta como a carteira 5 por exemplo.

Após isso, vá no menu select conforme a imagem abaixo e selecione a função start. Este menu select vai sempre listar todas as funções do script em geral. Você precisa apenas selecionar a função start que é responsável por inicializar o script.

Após selecionada esta função, você deve clicar no botão “Executar” do lado esquerdo da imagem acima. Isso vai fazer o script ser executado. Porém como é a primeira vez que você vai execuar o seu script. Talvez o Google App Script possa disparar uma tela por cima do script perguntando se você concorda que este script seja executado. Você deve dar as permissões para que o script seja executado. Mas se não me angano, esta pergunta só aparece se o script for acessar algum outro aplicativo seu do Google como Google Planilha, alguma pasta do Drive e etc. Como este script não faz isso, é bem provável que esta mensagem nem apareça.

Mas após clicado no botão “Executar” o script vai ter dar uma resposta como a imagem abaixo na área de “Registro de execução” que é como se fosse um console de saída do resultado.

Neste exemplo eu pesqueisei pela carteira 5 e consegui encontrar a respoata que é 15. Se você for conferir no site https://privatekeys.pw/puzzles/bitcoin-puzzle-tx . Vai perceber que na tabela oficial a resposta do desafio 5 é realmente 15 conforme a imagem abaixo:

Dessa forma podemos validar que o script realmente funciona.

Configurando o acionador

Para configurar o acionador é muito simples. Você precisa primeiro clicar no ícone do relógio para abrir a tela de configuração do acionado. Feito isso você vai se deparar com uma tela como esta:

Observe que no meu caso eu já tenho um acionador configurado na minha conta. Na sua tela não haverá nada listado ainda. Mas tudo que precisa fazer é clicar no botão azul “+ Adicionar acionador” para abrir a próxima tela conforme a imagem abaixo:

Esta tela acima é o menu de configurações do acionador. O que você precisa fazer é: Escolher qual será a função a ser executada. Neste caso você deve selecionar a função start(). Na opção de implantação a ser executada você pode manter como está. Na opção de origem do evento você deve selecionar em origem baseado no tempo. Na opção de tipo de acionador, escolha contador de minutos. E a última opção que não apareceu na imagem você vai definir o intervalo de tempo na qual a função start() deverá ser chamada. Eu sugiro colocar 5 min, pois é tempo suficiente para que o script execute o seu processamento. Menos do que isso (1 min no caso) pode fazer com que o script seja novamente executado antes mesmo dele terminar a sua execução.

Após configurado o seu acionador, você terá em suas mãos um projeto rodando na nuvem que fica caçando Bitcoins para você. E se você tiver muita sorte, quem sabe não fique rico com isso.

Eu acredito que o único trabalho que terá, será de tempos em tempos conferir se o acionador ainda está em execução. Pois com o passar de meses ou mais, talvez o Google App Script possa desativa-lo ao fazer algo do tipo.

Configurando mensagens de aviso “ESTOU RICO! kkk”

Toda vez que o script for executado de 5 em 5 minutos. Você terá a tal chance quase impossível de descobrir a chave privada. E caso isso aconteça, você pode configurar o script para enviar um email para você e salvar a chave privada dentro do seu próprio script.

Se você é meio maluco e acha que vão interceptar o seu email e roubar a sua chave, fique tranquilo. Basta alterar o código para te enviar apenas um email de aviso sem enviar a chave. Assim você fica sabendo que ficou rico e que basta acessar o script para visualizar a sua chave privada.

Por padrão o script está enviando um email com a chave privada e ao msmo tempo salvando esta chave dentro do script caso você consiga descobrir. Se a chave não for descoberta na tentativa, nenhuma mensagem será disparada.

Imagine o quão legal será, você receber um email como este:

 

Dentro do script você deve alterar as contas de email que vão receber a mensagem caso a chave seja encontrada.

Neste trecho do código:

const EMAILS_TO = 'maickon4developers.redmi12@gmail.com;maickon2test@gmail.com';
Basta alterar as contas de email.
Na linha 172 em:
saveWallet('PRIVATE_KEY', privateKeyInt.toString(16));

Este código é responsável por salvar a chave privada encontrada dentro do script. Para visualizar a chave privada, basta clicar no ícone de menu de engrenagem do lado esquerdo do editor do Google App Script. O nome do menu é “Configurações do projeto”.

Você vai visualizar uma tela como esta:

Basta apenas rolar para baixo até você chegar aqui:

Neste exemplo temos duas propriedades salvas que são o PRIVAT_KEY e o WALLET20. Na sua conta não haverá nenhum deste campos. Mas quando uma chave for encotrada, o campo PRIVATE_KEY estará lá. O campo WALLET20 não deve ser levado em consideração, pois eu estava tentando implementar uma outra coisa que não terminei. Então este campo não vem ao caso e deve ser ignorado.

Então, assumindo este contexto. Temos duas ações que acontecem caso a sua chave seja encontrada:

  1. Em email é disparado para a sua conta com os dados da chave privada
  2. A chave privada é salva em PRIVAT_KEY

Caso você não queira receber o email com a informação da chave de forma explicita. Basta altera o script na linha 173, neste trecho:

const mailMessage = `
PARABÉNS!!! HOJE É O SEU DIA! A CHAVE PRIVADA DA CARTEIRA ${wallet.id} FOI ENCONTRADA
CHAVE PRIVADA ENCONTRADA: ${privateKeyInt.toString(16)}
CARA, TU TA RICO!!! kkkkk`;

Você pode simplesmente remover a variável: ${privateKeyInt.toString(16)por XXXXX ou qualquer outra coisa que quiser. Então quando receber este email, basta você conferir o PRIVAT_KEY dentro das configurações do projeto.

Duplicando o script e aumentando as minhas chances de encontrar Bitcoin

Com tudo isso que aprendeu, é só você repetir o processo de configuração do script na sua conta do Google. Ou até melhor, apenas duplique o arquivo de script dentro de sua pasta do Drive. Crie centenas e centenas de scripts como este e deixe-os rodando para aumentar as suas chances.

Mas já venho de vos avisar que mesmo que você conseguisse duplicar o script a cada segundo de sua vida, e mesmo que você vivesse 100, 200 ou 300 anos e gastasse todo o seu tempo só fazendo isso (DUPLICANDO O SCRIPT PARA RODAR), mesmo assim, todo o seu esforço seria como adiciona uma gota de água no oceano e querer achar que todo mundo vai perceber que o nivel do mar aumentou.

A vastidão da grandeza do espaço das chaves privadas é algo inconcebível as nossas mentes humanas.

Novas funcionalidades e ideias

Fuçando o script, vocês podem perceber que existem alguns códigos comentados lá. Isso foram algumas tentativas de por algumas ideias na prática. Mas quando percebi que iria tomar muito o meu tempo eu desisti. Pois na minha opinião é um esforço semelhante ao exemplo da gota d’água no oceano.

Porém se alguém achar que vale a pena, vou deixar aqui a ideia que tive e quem quiser implementar isso, sinta-se livre para fazer. Crie um fork do código lá no Github e mãos na massa!

O que eu pensei foi em primeiro subdividir o espaço das chaves privadas em pequenas áreas. Eu vou dar um exemplo usando números decimais por ser mais fácil de explicar do que em hexadecimal.

Exemplo: Supondo que a carteira X tenha um espaço entre 1…100 eu subdividiria ela em partes menores. Onde poderiam ser 5 áreas de endereços 1…19, 20…39, 40…49, 60…89, 90…100. Dessa forma quando alguém for tentar resolver o desafio, ele vai cair numa destas subáreas. Vai sortear um valor aleatório neste intervalo e começar a verificar partindo deste ponto aleatório em diante.

Ao final da execução do script, caso a chave não seja encontrada, esta verificação deverá ser salva numa base de dados geral. Dessa forma quando este usuário for novamente rodar o script e caso o script caia na mesma subárea. O script deverá ser inteligente o suficiente para excluir o rage já verificado para evitar que este usuário verifique por chaves que já foram verificadas.

Então o script sempre consulta a base de dados para recuperar e com ela, evitar que a busca seja feita em áreas já percorridas.

A ideia geral é que cada pessoa que duplicar este projeto para usar o script, sempre que ela rodar uma busca, todas as chaves não encontradas devem ser salvas na base de dados. Ou seja pra cada pessoa que usar o script, todas as chaves que não forem válidas vão ficar salvas nesta base de dados central. E isso vai poupar que novos usuários percam tempo pesquisando por intervalos que já foram verificados.

Minha ideia geral era algo parecido com isso. Mas a implementação disso é complexo e demorado e por isso desisti.

A minha outra ideia, menos importante, mas que também seria interessante. Seria montar uma página web que fosse mostrado o status das áreas já verificadas. Por exemplo: A carteira X que foi dividida em 10 subáreas, cada subárea vai ter uma mensagem informativa tipo: 1…19 [0,0000000012%] de verificação concluída. Eu acho que isso vai dar uma visão geral do quanto é impossível conseguir resolver isso kkkkk

Alguns dos códigos que fazem o que tentei explicar já foram implementados no script, mas não estão sendo usados. Se você achar estas ideias interessantes e quiser implementar fique a vontade.

Loading