Author

Topic: [Tutorial] Gerando endereços Bitcoin personalizados (Legacy/Segwit) (Read 263 times)

legendary
Activity: 2296
Merit: 1170
Advertise Here - PM for more info!
Interessante. Não sabia que existia um vanity generator segwit para Windows.

Eu conhecia apenas um que o nullius fez em 2018 , mas só Linux.
https://bitcointalksearch.org/topic/segvan-segwit-vanity-address-bulk-address-generator-2934774

Olhando por alto, esse dai não usa GPU. Acho que a evolução foi essa.
legendary
Activity: 2212
Merit: 5622
Non-custodial BTC Wallet
Interessante. Não sabia que existia um vanity generator segwit para Windows.

Eu conhecia apenas um que o nullius fez em 2018 , mas só Linux.
https://bitcointalksearch.org/topic/segvan-segwit-vanity-address-bulk-address-generator-2934774
hero member
Activity: 1498
Merit: 556
25/01/2020
- correção (typo em Utilização / Passo 1) - tks @dive


27/01/2020
- adição (Introdução)
- adição (curiosidade quanto aos serviços disponíveis no mercado para este fim)
- correção (tabulação em Indicações / Passo 2)


29/01/2020
- adição (Índice e links de ancoragem)
hero member
Activity: 1498
Merit: 556
Wowww,
Quanta disposição às 01 da madrugada pra escrever um post de desse, meus parabéns!
Eu já tinha até utilizado um "Vanity" para endereços segwit, mas não me recordo o nome dele e nem se tinha todo o "poder" desse aí.

Quando tu falou do compartilhamento de processamento, logo me veio a lembrança do site Vanity Pool onde qualquer um pode requisitar geração de um vanity address e em troca oferecer certa recomepensa.
Bacana também pra quem deseja ganhar uma graninha extra tentando "ajudar" esse pessoal.
Valeu, ale! A realidade é que eu comecei a rabiscar alguma coisa ainda na parte da tarde, fui terminar essa hora mesmo... a coisa foi esticando que quando vi, já tinha ido hehe

Sobre a Vanity Pool, eu cheguei a mencioná-la mesmo bem no começo do tópico bônus Smiley a parte ruim é que pelo que notei faz um tempinho já que não rola uma operação por lá Undecided

Opa, parabéns pelo tópico, muito completo e didático. O meu tutorial eu fiz na época em que saiu o primeiro gerador para bech32 e ainda era bem simples só funcionava no linux. Bom saber que agora temos ferramentas mais completas para fazer esse trabalho.

Acho muito interessante a parte de endereços vanity e para quem se interessar este é um tópico excelente. Você poderia colocar uma breve descrição do que é um endereço vanity, muita gente não conhece.

Hoje gastei meu último merit, quando tiver mais passarei por aqui  Wink
Valeu, Loga! Toda a inspiração começou no teu tópico mesmo Grin Ao referenciá-lo logo no início, inclusive, a idéia era justamente fazer um gancho e já dar uma introdução ao assunto. Vou montar algo bacana e atualizar o tópico com algo nesse sentido Wink

Excelente artigo! Bem detalhado e completo!

Encontrei um pequeno typo na linha de comando...
VanitySeacrh
Valeu, dive!

Quanto ao typo, reli diversas vezes e não encontrei, até ir na base do CTRL+F hehe e não é que veio do fragmento do repositório?!? Tá errado por lá:



Mas não é porque está errado por lá que temos que manter por aqui, certo?! Arrumado! Smiley
full member
Activity: 194
Merit: 179
Excelente artigo! Bem detalhado e completo!

Encontrei um pequeno typo na linha de comando...
VanitySeacrh
hero member
Activity: 1764
Merit: 881
Opa, parabéns pelo tópico, muito completo e didático. O meu tutorial eu fiz na época em que saiu o primeiro gerador para bech32 e ainda era bem simples só funcionava no linux. Bom saber que agora temos ferramentas mais completas para fazer esse trabalho.

Acho muito interessante a parte de endereços vanity e para quem se interessar este é um tópico excelente. Você poderia colocar uma breve descrição do que é um endereço vanity, muita gente não conhece.

Hoje gastei meu último merit, quando tiver mais passarei por aqui  Wink
legendary
Activity: 2352
Merit: 1121
☢️ alegotardo™️
Wowww,
Quanta disposição às 01 da madrugada pra escrever um post de desse, meus parabéns!
Eu já tinha até utilizado um "Vanity" para endereços segwit, mas não me recordo o nome dele e nem se tinha todo o "poder" desse aí.

Quando tu falou do compartilhamento de processamento, logo me veio a lembrança do site Vanity Pool onde qualquer um pode requisitar geração de um vanity address e em troca oferecer certa recomepensa.
Bacana também pra quem deseja ganhar uma graninha extra tentando "ajudar" esse pessoal.
hero member
Activity: 1498
Merit: 556
Com a necessidade de gerar um novo endereço personalizado recentemente, recorri aos geradores de endereços vanity me lembrei deste tópico massa do @Loganota, em que ele apontava a ferramenta Vanitygen (open-source) que o usuário @samr7 codificou para este propósito.

A ferramenta, apesar de muito simples e objetiva, acabou sentindo o peso da idade (o release foi realizado em 2011) e sua performance já não era mais compatível com os novos equipamentos e o poderio absurdo que alcançam comparado à performance dos disponíveis à época. Isso se deu, principalmente, pela forma como os cálculos eram realizados na aplicação. Visando este gap, o usuário @Jean_Luc criou um outro aplicativo extremamente similares, o VanitySearch, também open-source.

Apresentado pelo seu criador como um app similar ao vanitygen, ele destaca que a principal vantagem em relação à primeira solução, é justamente em relação a performance (tradução): "As principais diferenças com o Vanitygen são que o VanitySearch não está usando o OpenSSL, pesado para o cálculo da CPU, e que o kernel é escrito em Cuda para aproveitar ao máximo o assembly PTX embutido.". Somado a esse trabalho direto no modelo de cálculo, a GPU também pode ser utilizada (uma mão na roda para quem tem alguma mid-high end dando sopa por aí). Como isso tudo se reflete em casos reais? Mais agilidade e, consequentemente, menor tempo de processamento e encontro do endereço com o fragmento desejado!

Sem mais delongas, me basearei nos procedimentos do próprio repositório para este breve tutorial.



Í N D I C E

1. Introdução
2. Indicações
3. Instalação no Windows
4. Instalação no Linux
5. Utilização
6. Bônus: Compartilhamento de processamento (sem intermediários)
7. Comparativos de performance
8. Curiosidades



1. INTRODUÇÃO

Um vanity address nada mais é do que um endereço personalizado. O conceito aqui é permitir que um determinado fragmento de texto seja "'humano-legível", ou seja, que entre seus caracteres e números exista uma formação que contemple um fragmento que venha a significar/remeter a algo - a critério do usuário, é claro.

É sabido que há uma série absurda de combinações possíveis dentro da composição dos endereços do Bitcoin. A idéia é, dentre elas, encontrar uma private key que estabeleça o acesso a um endereço que contenha esse conjunto de caracteres.

Mas como isso é feito? Para entender o resultado, é importante entender como o endereço do Bitcoin é formado. Diferente do que alguns imaginam, a criação do endereço público é um resultado de uma função de hash unidirecional sobre a chave privada, não o inverso. A operação é realizada em um trabalho entre os algoritmos SHA-256 e RIPEMD-160 e pode ser melhor compreendido neste artigo, em um fluxo que se resume em 10 etapas.

Da mesma forma que um bloco é calculado com um determinado poder computacional, aplicações com o fim de encontrar estes endereços (de acordo com as diretrizes impostas pelo usuário) também foram desenvolvidas usando o mesmo conceito. Seu funcionamento, assim como no cálculo matemático para a busca da solução no primeiro caso, depende unicamente do poderio da estação utilizada com este fim para, na base de tentativa e erro, seguir o fluxo indicado acima até que a resultante seja um endereço que contenha o desejado.

Os exemplos abaixo (alguns retirados deste tópico) dão uma idéia de quão interessante e vasto se mostra este campo:

1GooGLENHF5qVhatsHyUsyczdj6XJR54xd
1BitcoinhqMmNrqnBKvdHeA4vmzb4uvuSg
1234mNnAPb8YnCsbacaNhB4BqwxB4U4321
1FoxBitjXcBeZUS4eDzPZ7b124q3N7QJK7
1234567891p1rBJWFPmHTUiupi1VA6YKQw
1BTCSaves51HfxTygLgGX2EcUgT6A1pyvK

A imaginação é o limite! Depende de você (e do seu hardware e tempo) para alcançá-lo Smiley



2. INDICAÇÕES

Como sabemos, nossas atividades no PC estão sendo sempre monitoradas (advertida ou inadvertidamente) e a melhro forma de evitar esta situação é se livrar dos possíveis pontos de falha. Neste caso, a maior e melhor indicação para lidar não apenas com o processo de geração de chaves pública/privada, mas com suas chaves no geral, é tratar diretamente a causa e não os sintomas: utilizar um PC que não está conectado à internet ou desligar algum que esteja conectado à grande rede, porém, executar sobre ele uma instância.

Para quem não sabe ao certo do que se trata, estamos falando de efetuar o carregamento do Sistema Operacional na memória RAM de seu PC. Esta, por sua vez, por se tratar de uma memória volátil (ou seja, que perde o estado na ausência de energia) não manterá nenhuma informação assim que a estação for desligada.

O processo, comumente chamado de Live OS pode ser executado por intermédio de qualquer meio de armazenamento externo, servindo como ponte para que os arquivos necessários para a execução da plataforma sejam carregados logo em sua inicialização. Logicamente, este não é o escopo central deste passo-a-passo e, certamente o deixaria bem extenso. Separei, então, alguns tutoriais que poderão auxiliar os iniciantes nesta tarefa:





3. INSTALAÇÃO NO WINDOWS

1) Baixe o arquivo VanitySearch.exe (ou a versão mais atualizada na aba de Releases - lembrando que este tutorial está sendo montado sobre a versão corrente v1.16. As etapas estão sujeitas a alterações em possíveis versões subsequentes).

2) Abra o prompt de comando (Iniciar > Executar > cmd) e acesse a pasta onde o arquivo .exe foi baixado anteriormente (utilize o comando cd caminho - onde caminho é o caminho absoluto do diretório em questão, ex: cd C:/vanity) ou PowerShell (acesse o diretório que contém o arquivo .exe e com a tecla Shift pressionada, clique com o botão direto em algum lugar e escolha a opção Abrir janela do PowerShell aqui).



4. INSTALAÇÃO NO LINUX

1) Baixe o arquivo 1.16.tar.gz (ou a versão mais atualizada na aba de Releases - lembrando que este tutorial está sendo montado sobre a versão corrente v1.16. As etapas estão sujeitas a alterações em possíveis versões subsequentes).

2) Acesse o diretório, compile e execute o VanitySearch (caso o CUDA SDK não esteja instalado ainda, instale-o e altere CUDA e CXXCUDA com os respectivos diretorios, em makefile):
Code:
$ make gpu=1 ccap=20 all
~/VanitySearch$ ./VanitySearch



5. UTILIZAÇÃO

1) No prompt de comando você deverá entrar com o nome do executável (se mantido o original, VanitySearch.exe), seguido dos argumentos desejados para o início da operação precedidos por um hífen. Os argumentos são as opções disponíveis para mudanças no comportamento durante a execução do aplicativo. Seguem todos os disponíveis e respectivas descrições:

Quote
VanitySearch [-check] [-v] [-u] [-b] [-c] [-gpu] [-stop] [-i inputfile]
             [-gpuId gpuId1[,gpuId2,...]] [-g gridSize1[,gridSize2,...]]
             [-o outputfile] [-m maxFound] [-ps seed] [-s seed] [-t nbThread]
             [-nosse] [-r rekey] [-check] [-kp] [-sp startPubKey]
             [-rp privkey partialkeyfile] [prefix]

prefix: prefixo para buscar (pode conter wildcards - '?' ou '*') - lembre-se que para endereços segwit, bc1q ou 3 terão de ser utilizado, assim como 1 para os legacy
-v: imprimir a versão
-u: buscar endereços não comprimidos
-b: buscar tanto endereços não comprimidos como endereços comprimidos
-c: busca case unsensitive (não há diferenciação de maiúsculas e minúsculas)
-gpu: habilitar cálculo por GPU
-stop: parar quando todos os prefixos forem encontrados
-i inputfile: utilizar uma lista de prefixos para serem buscados a partir de um arquivo (utilize o caminho absoluto do mesmo)
-o outputfile: resultados exportados para um arquivo externo (utilize um caminho absoluto)
-gpu gpuId1,gpuId2,...: lista de GPUs para utilizar, o padrão é 0
-g gridSize1,gridSize2,...: especificar o gridsize do kernel da(s) GPU(s), o padrão é 8*(MP number)
-m: especificar o número máximo de prefixos encontrados por cada chamada do kernel
-s seed: especificar uma seed para a chave base, a padrão é aleatória
-ps seed: especificar uma seed concatenada com uma seed aleatória segura criptografada
-t threadNumber: especificar o número de threads da CPU, o padrão é o número de núcleos disponíveis na mesma
-nosse: desabilitar a função de hash SSE
-l: listar os dispositivos habilitados pela Cuda
-check: checar CPU + GPU vs CPU
-kp: gerar os pares de chave
-rp privkey partialkeyfile: reconstruir chave(s) privada(s) final(is) a partir de uma ou mais chaves parciais.
-sp startPubKey: iniciar a pesquisa com uma chave pública (para divisão de chave privada)
-r rekey: Intervalo de Rekey na MegaKey, o padrão é desabilitado

2) Como podem notar, temos uma série de opções disponíveis. Acredito que justamente por termos uma variedade tão extensa, seria bem difícil cobrir todos os cenários possíveis, então darei alguns exemplos com o que eu acredito que possivelmente serão os mais comuns (obs.: exemplos com diretórios em ambiente Windows; a mesma estrutura de argumentos se aplica ao Linux, porém, com as definições corretas de caminho):

  • a) Buscar endereço legacy que:
    • utilize apenas a CPU com a contagem de threads padrão;
    • contenha o prefixo teste e que esteja contido logo no início do endereço;
    • pare a pesquisa quando o grupo de caracteres for encontrado;
    Code:
    VanitySearch.exe -stop 1teste
  • b) Buscar endereço segwit que:
    • utilize tanto a CPU quanto a GPU com a contagem de threads padrão;
    • contenha o prefixo teste, que independa sua posição no endereço e que não se diferencie maiúsculas e minúsculas;
    • pare a pesquisa quando o grupo de caracteres for encontrado;
    • a GPU seja utilizada;
    Code:
    VanitySearch.exe -stop -gpu -c bc1q*teste*
  • c) Buscar endereço segwit/legacy que:
    • utilize tanto a CPU quanto a GPU com a contagem de threads padrão;
    • contenha os prefixos de uma lista contida em um arquivo chamado exemplos.txt (obs.: inserir um grupo de caracteres por linha dentro do arquivo, para correta interpretação, e seguir a mesma padronização de wildcards) localizado na raiz do drive C:
    • a GPU seja utilizada;
    • pare a pesquisa quando o grupo de caracteres for encontrado;
    Code:
    VanitySearch.exe -stop -gpu -i C:\exemplos.txt
  • d) Buscar endereço segwit que:
    • utilize tanto a CPU quanto a GPU com a contagem de threads padrão;
    • contenha o prefixo teste e que independa sua posição no endereço;
    • pare a pesquisa quando o grupo de caracteres for encontrado;
    • exporte os resultados para um arquivo de texto chamado seeds.txt localizado na raiz do drive C:
    Code:
    VanitySearch.exe -stop -gpu -o C:\seeds.txt bc1q*teste*


    6. BÔNUS: COMPARTILHAMENTO DE PROCESSAMENTO (SEM INTERMEDIÁRIOS)

    Com a chegada da primeira solução do samr7 (Vanitygen) e com a lenta performance enfrentada pelas máquinas na época de seu release, essa distribuição era extremamente necessária até mesmo para os grupos de caracteres mais curtos. Um processo que hoje leva segundos ou minutos, naquela época levava horas e dias. Visando este gap, uma pool foi criada pelo user @ThePiachu - como na mineração, a idéia aqui era fornecer poder computacional para ajudar nos cálculos para o encontro do endereço com o fragmento desejado e até uma recompensa em BTC era envolvida no processo.

    Pelo que noto já há muito ela não é utilizada, mas nem por isso a idéia da distribuição precisava morrer... buscando um resultado semelhante, mas por meios distintos, o VanitySearch trouxe consigo característica bacana  para distribuir a tarefa de processamento de uma chave realizando a segmentação dos processos de cálculo, de maneira que não exista vínculo entre eles e, principalmente, que não exista o papel de um agente centralizador. A idéia é que todos os agentes do processo tenham um fragmento da informação e nunca ela por inteiro, impedindo seu agrupamento por outro que não o originador da tarefa e consequente acesso ao endereço.

    O fragmento abaixo é uma tradução direta da explicação dada pelo Jean no repositório, incluindo um cenário proposto para dar mais forma ao funcionamento da coisa:

    Quote
    Gerando um endereço vanity para um terceiro usando uma split-key

    É possível gerar um endereço personalizado para terceiros de maneira segura usando uma split-key.
    Por exemplo, Alice deseja um bom prefixo, mas não possui desemepnho suficiente em sua CPU. Bob tem uma CPU com o desempenho necessário para a tarefa, mas não pode conhecer a chave privada de Alice, Alice precisa usar uma split-key.

    • Etapa 1
      Alice gera um par de chaves em seu computador e envia a chave pública gerada e o prefixo desejado a Bob. Isso pode ser feito por e-mail, nada é secreto. No entanto, Alice precisa manter com segurança a chave privada e não expô-la.
      Code:
      VanitySearch.exe -s "AliceSeed" -kp
      Priv : L4U2Ca2wyo721n7j9nXM9oUWLzCj19nKtLeJuTXZP3AohW9wVgrH
      Pub  : 03FC71AE1E88F143E8B05326FC9A83F4DAB93EA88FFEACD37465ED843FCC75AA81
      Nota: O par de chaves (key pair) é um par de chaves padrão SecpK1 e pode ser gerado com um software de terceiros.

    • Etapa 2
      Bob executa o VanitySearch usando a chave pública da Alice e o prefixo desejado.
      Code:
      VanitySearch.exe -sp 03FC71AE1E88F143E8B05326FC9A83F4DAB93EA88FFEACD37465ED843FCC75AA81 -gpu -stop -o keyinfo.txt 1ALice
      Ele gera um arquivo keyinfo.txt que contém a chave privada parcial.
      Code:
      Endereço Público: 1ALicegohz9YgrLLa4ADCmam7X2Zr6xJZx
      Chave Privada parcial: L2hbovuDd8nG4nxjDq1yd5qDsSQiG8xFsAFbHMcThqfjSP6WLg89
      Bob envia de volta este arquivo para Alice. Também pode ser feito por e-mail. A chave privada parcial não permite que ninguém adivinhe a chave privada final de Alice.

    • Etapa 3
      Alice pode reconstruir a chave privada final usando sua chave privada (a gerada na Etapa 1) e o conteúdo do arquivo keyinfo.txt de Bob.
      Code:
      VanitySearch.exe -rp L4U2Ca2wyo721n7j9nXM9oUWLzCj19nKtLeJuTXZP3AohW9wVgrH keyinfo.txt

      Pub Addr: 1ALicegohz9YgrLLa4ADCmam7X2Zr6xJZx
      Priv (WIF): p2pkh:L1NHFgT826hYNpNN2qd85S7F7cyZTEJ4QQeEinsCFzknt3nj9gqg
      Priv (HEX): 0x7BC226A19A1E9770D3B0584FF2CF89E5D43F0DC19076A7DE1943F284DA3FB2D0

      Como funciona
      Basicamente, o argumento -sp (start public key) adiciona a chave pública inicial especificada (vamos chamá-la de Q) às chaves iniciais de cada thread. Isso significa que, quando você pesquisa (usando -sp), não procura por addr(k.G), mas por addr(kpart.G+Q), onde k é a chave privada no primeiro caso e kpart a "chave privada parcial" no segundo caso. G é o ponto do gerador SecpK1.

      Em seguida, o solicitante pode reconstruir a chave privada final executando kpart+ksecret(mod n) em que kpart é a chave privada parcial encontrada pelo pesquisador e ksecret é a chave privada de Q (Q=ksecret.G). Esse é o objetivo do argumento -rp.

      O pesquisador encontrou uma correspondência para addr(kpart.G+ksecret.G) sem conhecer o ksecret, para que o solicitante tenha o endereço desejado addr(kpart.G+Q) e a chave privada correspondente kpart+ksecret(mod n). O pesquisador não consegue adivinhar essa chave privada final porque ele não conhece o ksecret (ele conhece apenas Q).

      Nota: Essa explicação é simplificada, ela não trata das otimizações de simetria e endomorfismo, mas a ideia é a mesma.



      7. COMPARATIVOS DE PERFORMANCE

      Depois que o VanitySearch viu a luz do dia, uma série de testes começaram a ser realizados pela comunidade e o usuário @DaveF fez um catado de todas até aquele momento (último update em 25/Nov/19). A disposição está um pouco confusa, então eu dei uma tweakada para ficar com uma visualização um pouco mais fácil e objetiva (com destaque em vermelho para os com melhores números):

      |
      Data
      Jump to:
      © 2020, Bitcointalksearch.org