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 E1. Introdução2. Indicações3. Instalação no Windows4. Instalação no Linux5. Utilização6. Bônus: Compartilhamento de processamento (sem intermediários)7. Comparativos de performance8. 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:
1GooGLENHF5qVhatsHyUsyczdj6XJR54xd1BitcoinhqMmNrqnBKvdHeA4vmzb4uvuSg1234mNnAPb8YnCsbacaNhB4BqwxB4U43211FoxBitjXcBeZUS4eDzPZ7b124q3N7QJK71234567891p1rBJWFPmHTUiupi1VA6YKQw1BTCSaves51HfxTygLgGX2EcUgT6A1pyvKA imaginação é o limite! Depende de você (e do seu hardware e tempo) para alcançá-lo
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):
$ 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:
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):
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:
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 2
Bob executa o VanitySearch usando a chave pública da Alice e o prefixo desejado.
VanitySearch.exe -sp 03FC71AE1E88F143E8B05326FC9A83F4DAB93EA88FFEACD37465ED843FCC75AA81 -gpu -stop -o keyinfo.txt 1ALice
Ele gera um arquivo keyinfo.txt que contém a chave privada parcial.
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.
Como funcionaBasicamente, 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):