VanitySearch es un buscador de prefijos de direcciones bitcoin. Si desea generar claves privadas seguras, use la opción -s para ingresar su frase de contraseña que se usará para generar una clave base según el estándar BIP38 ( VanitySearch.exe -s "My PassPhrase" 1MyPrefix ). También puede utilizar VanitySearch.exe -ps "Mi frase de contraseña" , que agregará una semilla criptosegura a su frase de contraseña.
Es posible que VanitySearch no calcule un buen tamaño de cuadrícula para su GPU, así que pruebe diferentes valores usando la opción -g para obtener el mejor rendimiento. Si desea utilizar GPU y CPU juntas, puede obtener mejores rendimientos manteniendo un núcleo de CPU para manejar los intercambios de GPU/CPU (use la opción -t para establecer el número de subprocesos de CPU).
Discusión sobre VanitySearch@bitcointalk
Puede descargar la última versión desde https://github.com/JeanLucPons/VanitySearch/releases
VanitySearch [-check] [-v] [-u] [-b] [-c] [-gpu] [-stop] [-i inputfile]
[-gpuId gpuId1[,gpuId2,...]] [-g g1x,g1y,[,g2x,g2y,...]]
[-o outputfile] [-m maxFound] [-ps seed] [-s seed] [-t nbThread]
[-nosse] [-r rekey] [-check] [-kp] [-sp startPubKey]
[-rp privkey partialkeyfile] [prefix]
prefix: prefix to search (Can contains wildcard '?' or '*')
-v: Print version
-u: Search uncompressed addresses
-b: Search both uncompressed or compressed addresses
-c: Case unsensitive search
-gpu: Enable gpu calculation
-stop: Stop when all prefixes are found
-i inputfile: Get list of prefixes to search from specified file
-o outputfile: Output results to the specified file
-gpu gpuId1,gpuId2,...: List of GPU(s) to use, default is 0
-g g1x,g1y,g2x,g2y, ...: Specify GPU(s) kernel gridsize, default is 8*(MP number),128
-m: Specify maximun number of prefixes found by each kernel call
-s seed: Specify a seed for the base key, default is random
-ps seed: Specify a seed concatened with a crypto secure random seed
-t threadNumber: Specify number of CPU thread, default is number of core
-nosse: Disable SSE hash function
-l: List cuda enabled devices
-check: Check CPU and GPU kernel vs CPU
-cp privKey: Compute public key (privKey in hex hormat)
-kp: Generate key pair
-rp privkey partialkeyfile: Reconstruct final private key(s) from partial key(s) info.
-sp startPubKey: Start the search with a pubKey (for private key splitting)
-r rekey: Rekey interval in MegaKey, default is disabled
Ejemplo (Windows, Intel Core i7-4770 3,4 GHz 8 núcleos multiproceso, GeForce GTX 1050 Ti):
C:C++VanitySearchx64Release>VanitySearch.exe -stop -gpu 1TryMe
VanitySearch v1.17
Difficulty: 15318045009
Search: 1TryMe [Compressed]
Start Fri Jan 31 08:12:19 2020
Base Key: DA12E013325F12D6B68520E327847218128B788E6A9F2247BC104A0EE2818F44
Number of CPU thread: 7
GPU: GPU #0 GeForce GTX 1050 Ti (6x128 cores) Grid(48x128)
[251.82 Mkey/s][GPU 235.91 Mkey/s][Total 2^32.82][Prob 39.1%][50% in 00:00:12][Found 0]
PubAddress: 1TryMeJT7cfs4M6csEyhWVQJPAPmJ4NGw
Priv (WIF): p2pkh:Kxs4iWcqYHGBfzVpH4K94STNMHHz72DjaCuNdZeM5VMiP9zxMg15
Priv (HEX): 0x310DBFD6AAB6A63FC71CAB1150A0305ECABBE46819641D2594155CD41D081AF1
C:C++VanitySearchx64Release>VanitySearch.exe -stop -gpu 3MyCoin
VanitySearch v1.11
Difficulty: 15318045009
Search: 3MyCoin [Compressed]
Start Wed Apr 3 14:52:45 2019
Base Key:FAF4F856077398AE087372110BF47A1A713C8F94B19CDD962D240B6A853CAD8B
Number of CPU thread: 7
GPU: GPU #0 GeForce GTX 1050 Ti (6x128 cores) Grid(48x128)
124.232 MK/s (GPU 115.601 MK/s) (2^33.18) [P 47.02%][50.00% in 00:00:07][0]
Pub Addr: 3MyCoinoA167kmgPprAidSvv5NoM3Nh6N3
Priv (WIF): p2wpkh-p2sh:L2qvghanHHov914THEzDMTpAyoRmxo7Rh85FLE9oKwYUrycWqudp
Priv (HEX): 0xA7D14FBF43696CA0B3DBFFD0AB7C9ED740FE338B2B856E09F2E681543A444D58
C:C++VanitySearchx64Release>VanitySearch.exe -stop -gpu bc1quantum
VanitySearch v1.11
Difficulty: 1073741824
Search: bc1quantum [Compressed]
Start Wed Apr 3 15:01:15 2019
Base Key:B00FD8CDA85B11D4744C09E65C527D35E231D19084FBCA0BF2E48186F31936AE
Number of CPU thread: 7
GPU: GPU #0 GeForce GTX 1050 Ti (6x128 cores) Grid(48x128)
256.896 MK/s (GPU 226.482 MK/s) (2^28.94) [P 38.03%][50.00% in 00:00:00][0]
Pub Addr: bc1quantum898l8mx5pkvq2x250kkqsj7enpx3u4yt
Priv (WIF): p2wpkh:L37xBVcFGeAZ9Tii7igqXBWmfiBhiwwiKQmchNXPV2LNREXQDLCp
Priv (HEX): 0xB00FD8CDA85B11D4744C09E65C527D35E2B1D19095CFCA0BF2E48186F31979C2
Es posible generar una dirección personalizada para un tercero de forma segura utilizando una clave dividida.
Por ejemplo, Alice quiere un prefijo bonito pero no tiene potencia de CPU. Bob tiene la potencia de CPU solicitada pero no puede conocer la clave privada de Alice, Alice tiene que usar una clave dividida.
Alice genera un par de claves en su computadora y luego envía la clave pública generada y el prefijo deseado a Bob. Se puede hacer por correo electrónico, nada es secreto. Sin embargo, Alice debe mantener de forma segura la clave privada y no exponerla.
VanitySearch.exe -s "AliceSeed" -kp
Priv : L4U2Ca2wyo721n7j9nXM9oUWLzCj19nKtLeJuTXZP3AohW9wVgrH
Pub : 03FC71AE1E88F143E8B05326FC9A83F4DAB93EA88FFEACD37465ED843FCC75AA81
Nota: El par de claves es un par de claves SecpK1 estándar y se puede generar con un software de terceros.
Bob ejecuta VanitySearch utilizando la clave pública de Alice y el prefijo deseado.
VanitySearch.exe -sp 03FC71AE1E88F143E8B05326FC9A83F4DAB93EA88FFEACD37465ED843FCC75AA81 -gpu -stop -o keyinfo.txt 1ALice
Genera un archivo keyinfo.txt que contiene la clave privada parcial.
PubAddress: 1ALicegohz9YgrLLa4ADCmam7X2Zr6xJZx
PartialPriv: L2hbovuDd8nG4nxjDq1yd5qDsSQiG8xFsAFbHMcThqfjSP6WLg89
Bob le devuelve este archivo a Alice. También se puede hacer por correo electrónico. La clave privada parcial no permite que nadie adivine la clave privada final de Alice.
Luego, Alice puede reconstruir la clave privada final utilizando su clave privada (la generada en el paso 1) y el keyinfo.txt de Bob.
VanitySearch.exe -rp L4U2Ca2wyo721n7j9nXM9oUWLzCj19nKtLeJuTXZP3AohW9wVgrH keyinfo.txt
Pub Addr: 1ALicegohz9YgrLLa4ADCmam7X2Zr6xJZx
Priv (WIF): p2pkh:L1NHFgT826hYNpNN2qd85S7F7cyZTEJ4QQeEinsCFzknt3nj9gqg
Priv (HEX): 0x7BC226A19A1E9770D3B0584FF2CF89E5D43F0DC19076A7DE1943F284DA3FB2D0
Básicamente, -sp (clave pública inicial) agrega la clave pública inicial especificada (llamémosla Q) a las claves iniciales de cada subproceso. Eso significa que cuando busca (usando -sp), no busca addr(kG) sino addr(k parte .G+Q) donde k es la clave privada en el primer caso y k parte la "clave privada parcial". " en el segundo caso. G es el punto generador SecpK1.
Luego, el solicitante puede reconstruir la clave privada final haciendo k parte +k secreto (mod n) donde k parte es la clave privada parcial encontrada por el buscador y k secreto es la clave privada de Q (Q=k secreto .G). Éste es el propósito de la opción -rp.
El buscador ha encontrado una coincidencia para addr(k part .G+k secret .G) sin conocer k secret , por lo que el solicitante tiene la dirección deseada addr(k part .G+Q) y la clave privada correspondiente k part +k secret ( mod n). El buscador no puede adivinar esta clave privada final porque no conoce k secreto (sólo conoce Q).
Nota: Esta explicación está simplificada, no se ocupa de las optimizaciones de simetría y endomorfismo, pero la idea es la misma.
La dirección bitcoin (P2PKH) consta de un hash160 (que se muestra en formato Base58), lo que significa que hay 2160 direcciones posibles. Una función hash segura puede verse como un pseudogenerador de números, que transforma un mensaje determinado en un número aleatorio. En este caso, un número (distribuido uniformemente) en el rango [0,2 160 ]. Entonces, la probabilidad de alcanzar un número particular después de n intentos es 1-(1-1/2 160 ) n . Realizamos n ensayos de Bernoulli estadísticamente independientes.
Si tenemos una lista de m direcciones distintas (m<=2 160 ), el espacio de búsqueda se reduce a 2 160 /m, la probabilidad de encontrar una colisión después de 1 intento se convierte en m/2 160 y la probabilidad de encontrar una colisión después de n intentos se convierte en 1-(1-m/2 160 ) n .
Un ejemplo:
Tenemos un hardware capaz de generar 1GKey/s y tenemos una lista de entrada de 10 6 direcciones, la siguiente tabla muestra la probabilidad de encontrar una colisión después de un cierto tiempo:
Tiempo | Probabilidad |
---|---|
1 segundo | 6.8e-34 |
1 minuto | 4e-32 |
1 hora | 2.4e-30 |
1 dia | 5.9e-29 |
1 año | 2.1e-26 |
10 años | 2.1e-25 |
1000 años | 2.1e-23 |
edad de la tierra | 8.64e-17 |
Era del universo | 2.8e-16 (mucho menos que ganar en la lotería) |
El cálculo se ha realizado utilizando esta calculadora en línea de alta precisión.
Como puedes ver, incluso con un hardware de la competencia, es muy poco probable que te encuentres con una colisión. La paradoja del cumpleaños no se aplica en este contexto, solo funciona si ya conocemos la clave pública (no la dirección, el hash de la clave pública) que queremos encontrar. Este programa no busca colisiones entre claves públicas. Solo busca colisiones con direcciones con un prefijo determinado.
Instale CUDA SDK y abra VanitySearch.sln en Visual C++ 2017.
Es posible que deba restablecer su versión del SDK de Windows en las propiedades del proyecto.
En Build->Configuration Manager, seleccione la configuración de versión .
Construye y disfruta.
Nota: La versión actual se compiló con CUDA SDK 10.0; si tiene una versión diferente de CUDA SDK, es posible que deba actualizar las rutas de CUDA SDK en VanitySearch.vcxproj usando un editor de texto. La opción nvcc actual está configurada para la arquitectura a partir de la capacidad 3.0; para hardware más antiguo, agregue las capacidades informáticas deseadas a la lista en propiedades de GPUEngine.cu, CUDA C/C++, Dispositivo, Generación de código.
Instale el SDK de CUDA.
Instale g++ anterior (solo para CUDA SDK). Dependiendo de la versión de CUDA SDK y de su distribución de Linux, es posible que necesite instalar un g++ anterior.
Instale gcc reciente. VanitySearch debe compilarse y vincularse con un gcc reciente (>=7). La versión actual se ha compilado con gcc 7.3.0.
Edite el archivo MAKE y configure el SDK de CUDA y las rutas del compilador apropiados para nvcc. O pasarlos como variables para make
la invocación.
CUDA = /usr/local/cuda-8.0
CXXCUDA = /usr/bin/g++-4.8
Puede ingresar una lista de arquitecturas (consulte la documentación de nvcc) si tiene varias GPU con arquitectura diferente.
Configure CCAP en la capacidad informática deseada según su hardware. Consulte la sección acoplable para obtener más información. La capacidad informática 2.0 (Fermi) está obsoleta para el SDK de CUDA reciente.
Vaya al directorio VanitySearch.
Para crear una versión solo para CPU (sin soporte CUDA):
$ make all
Para construir con CUDA:
$ make gpu=1 CCAP=2.0 all
Runnig VanitySearch (CPU Intel(R) Xeon(R), 8 núcleos, a 2,93 GHz, Quadro 600 (x2))
$ export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64
$ ./VanitySearch -t 7 -gpu -gpuId 0,1 1TryMe
# VanitySearch v1.10
# Difficulty: 15318045009
# Search: 1TryMe [Compressed]
# Start Wed Mar 27 10:26:43 2019
# Base Key:C6718D8E50C1A5877DE3E52021C116F7598826873C61496BDB7CAD668CE3DCE5
# Number of CPU thread: 7
# GPU: GPU #1 Quadro 600 (2x48 cores) Grid(16x128)
# GPU: GPU #0 Quadro 600 (2x48 cores) Grid(16x128)
# 40.284 MK/s (GPU 27.520 MK/s) (2^31.84) [P 22.24%][50.00% in 00:02:47][0]
#
# Pub Addr: 1TryMeERTZK7RCTemSJB5SNb2WcKSx45p
# Priv (WIF): Ky9bMLDpb9o5rBwHtLaidREyA6NzLFkWJ19QjPDe2XDYJdmdUsRk
# Priv (HEX): 0x398E7271AF3E5A78821C1ADFDE3EE90760A6B65F72D856CFE455B1264350BCE8
latest
, cuda-ccap-6
, cuda-ccap-6.0
(cuda/Dockerfile)cuda-ccap-5
, cuda-ccap-5.2
(cuda/Dockerfile)cuda-ccap-2
, cuda-ccap-2.0
(cuda/ccap-2.0.Dockerfile)cpu
(cpu/archivo Docker) Las imágenes de Docker se crean para la versión solo de CPU y para cada versión de capacidad de CUDA Compute ( CCAP
) compatible. Generalmente, los usuarios deben elegir CCAP
más reciente compatible con su hardware y controlador. La tabla de compatibilidad se puede encontrar en Wikipedia o en la página web oficial de NVIDIA de su producto.
Docker utiliza compilaciones de varias etapas para mejorar el tamaño de la imagen final. Se proporcionan scripts para facilitar el proceso de construcción.
Al crear por su cuenta, el nombre completo de la imagen (incluidas las partes del propietario/repositorio) se puede personalizar mediante la variable de entorno IMAGE_NAME
. El valor predeterminado es solo vanitysearch
sin nuestra parte del propietario. Las imágenes prediseñadas están disponibles en Docker Hub de @ratijas.
Cree y etiquete vanitysearch:cpu
:
$ ./docker/cpu/build.sh
Compile con compatibilidad con GPU "predeterminada", que podría no ser adecuada para su sistema:
$ ./docker/cuda/build.sh
Construya con soporte de GPU personalizado:
$ env CCAP=5.2 CUDA=10.2 ./docker/cuda/build.sh
En cuanto a la gente de Docker Compose, lo siento, las GPU compuestas por Docker no son (todavía) compatibles con una rama 3.x. Pero (con suerte) cambiará pronto.
Nota: La imagen de VanitySearch no requiere (ni debería) requerir acceso a la red. Para garantizar aún más que no se filtren datos del contenedor en ejecución, pase siempre --network none
al comando docker run.
$ docker run -it --rm --gpus all --network none ratijas/vanitysearch:cuda-ccap-5.2 -gpu -c -stop 1docker
# VanitySearch v1.18
# Difficulty: 957377813
# Search: 1docker [Compressed, Case unsensitive] (Lookup size 3)
# Start Sat Jul 11 17:41:32 2020
# Base Key: B506F2C7CA8AA2E826F2947012CFF15D2E6CD3DA5C562E8252C9F755F2A4C5D3
# Number of CPU thread: 1
# GPU: GPU #0 GeForce GTX 970M (10x128 cores) Grid(80x128)
#
# PubAddress: 1DoCKeRXYyydeQy6xxpneqtDovXFarAwrE
# Priv (WIF): p2pkh:KzESATCZFmnH1RfwT5XbCF9dZSnDGTS8z61YjnQbgFiM7tXtcH73
# Priv (HEX): 0x59E27084C6252377A8B7AABB20AFD975060914B3747BD6392930BC5BE7A06565
VanitySearch tiene licencia GPLv3.