VanitySearch는 비트코인 주소 접두사 찾기입니다. 안전한 개인 키를 생성하려면 -s 옵션을 사용하여 BIP38 표준( VanitySearch.exe -s "My PassPhrase" 1MyPrefix )과 같이 기본 키를 생성하는 데 사용되는 암호를 입력하세요. 또한 암호 문구에 암호화 보안 시드를 추가하는 VanitySearch.exe -ps "My PassPhrase"를 사용할 수도 있습니다.
VanitySearch는 GPU에 적합한 그리드 크기를 계산하지 못할 수 있으므로 최상의 성능을 얻으려면 -g 옵션을 사용하여 다른 값을 사용해 보십시오. GPU와 CPU를 함께 사용하려는 경우 GPU/CPU 교환을 처리하기 위해 하나의 CPU 코어를 유지하면 최상의 성능을 얻을 수 있습니다(CPU 스레드 수를 설정하려면 -t 옵션 사용).
VanitySearch@bitcointalk에 대한 토론
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
예(Windows, Intel Core i7-4770 3.4GHz 8 멀티스레드 코어, 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
분할키를 이용하면 안전하게 제3자를 위한 가상 주소를 생성할 수 있습니다.
예를 들어 Alice는 좋은 접두사를 원하지만 CPU 성능이 없습니다. Bob은 요청한 CPU 성능을 가지고 있지만 Alice의 개인 키를 알 수 없으므로 Alice는 분할 키를 사용해야 합니다.
Alice는 자신의 컴퓨터에서 키 쌍을 생성한 다음 생성된 공개 키와 원하는 접두사를 Bob에게 보냅니다. 이메일로 할 수 있으며 비밀은 없습니다. 그럼에도 불구하고 앨리스는 개인키를 안전하게 보관하고 노출하지 않아야 합니다.
VanitySearch.exe -s "AliceSeed" -kp
Priv : L4U2Ca2wyo721n7j9nXM9oUWLzCj19nKtLeJuTXZP3AohW9wVgrH
Pub : 03FC71AE1E88F143E8B05326FC9A83F4DAB93EA88FFEACD37465ED843FCC75AA81
참고: 키 쌍은 표준 SecpK1 키 쌍이며 타사 소프트웨어를 사용하여 생성할 수 있습니다.
Bob은 Alice의 공개 키와 원하는 접두사를 사용하여 VanitySearch를 실행합니다.
VanitySearch.exe -sp 03FC71AE1E88F143E8B05326FC9A83F4DAB93EA88FFEACD37465ED843FCC75AA81 -gpu -stop -o keyinfo.txt 1ALice
부분 개인 키가 포함된 keyinfo.txt 파일을 생성합니다.
PubAddress: 1ALicegohz9YgrLLa4ADCmam7X2Zr6xJZx
PartialPriv: L2hbovuDd8nG4nxjDq1yd5qDsSQiG8xFsAFbHMcThqfjSP6WLg89
Bob은 이 파일을 Alice에게 다시 보냅니다. 이메일로도 가능합니다. 부분 개인 키는 누구도 최종 앨리스의 개인 키를 추측하는 것을 허용하지 않습니다.
그런 다음 Alice는 자신의 개인 키(1단계에서 생성된 키)와 Bob의 keyinfo.txt를 사용하여 최종 개인 키를 재구성할 수 있습니다.
VanitySearch.exe -rp L4U2Ca2wyo721n7j9nXM9oUWLzCj19nKtLeJuTXZP3AohW9wVgrH keyinfo.txt
Pub Addr: 1ALicegohz9YgrLLa4ADCmam7X2Zr6xJZx
Priv (WIF): p2pkh:L1NHFgT826hYNpNN2qd85S7F7cyZTEJ4QQeEinsCFzknt3nj9gqg
Priv (HEX): 0x7BC226A19A1E9770D3B0584FF2CF89E5D43F0DC19076A7DE1943F284DA3FB2D0
기본적으로 -sp(시작 공개 키)는 지정된 시작 공개 키(Q라고 부르겠습니다)를 각 스레드의 시작 키에 추가합니다. 이는 -sp를 사용하여 검색할 때 addr(kG)를 검색하지 않고 addr(k 부분 .G+Q)를 검색한다는 의미입니다. 여기서 k는 첫 번째 경우의 개인 키이고 k 부분은 "부분 개인 키"입니다. " 두 번째 경우. G는 SecpK1 생성기 지점입니다.
그런 다음 요청자는 k 부분 +k 비밀 (mod n)을 수행하여 최종 개인 키를 재구성할 수 있습니다. 여기서 k 부분은 검색자가 찾은 부분 개인 키이고 k 비밀은 Q의 개인 키입니다(Q=k 비밀 .G). 이것이 -rp 옵션의 목적입니다.
검색자는 k 비밀을 모르고 addr(k 부분 .G+k secret .G)와 일치하는 항목을 찾았으므로 요청자는 원하는 주소 addr(k 부분 .G+Q)와 해당 개인 키 k 부분 +k 비밀 ( 모드 n). 검색자는 k 비밀을 모르기 때문에 (Q만 알고 있기 때문에) 이 최종 개인키를 추측할 수 없습니다.
참고: 이 설명은 단순화되어 대칭 및 내형성 최적화를 처리하지 않지만 아이디어는 동일합니다.
비트코인 주소(P2PKH)는 hash160(Base58 형식으로 표시)으로 구성되며 이는 2,160 개의 가능한 주소가 있음을 의미합니다. 보안 해시 함수는 의사 숫자 생성기로 볼 수 있으며, 주어진 메시지를 난수로 변환합니다. 이 경우 [0,2 160 ] 범위의 숫자(균일 분포)입니다. 따라서 n회 시도 후 특정 숫자에 도달할 확률은 1-(1-1/2 160 ) n 입니다. 우리는 통계적으로 독립적인 n Bernoulli 시행을 수행합니다.
m개의 개별 주소 목록(m<=2 160 )이 있는 경우 검색 공간은 2 160 /m으로 줄어들고 1회 시도 후 충돌을 찾을 확률은 m/2 160 이 되고 충돌을 찾을 확률은 n 번 시도한 후에는 1-(1-m/2 160 ) n 이 됩니다.
예:
우리는 1GKey/s를 생성할 수 있는 하드웨어를 가지고 있고 10 6 개의 주소로 구성된 입력 목록을 가지고 있습니다. 다음 표는 일정 시간이 지난 후 충돌을 발견할 확률을 보여줍니다.
시간 | 개연성 |
---|---|
1초 | 6.8e-34 |
1분 | 4e-32 |
1시간 | 2.4e-30 |
1일 | 5.9e-29 |
1년 | 2.1e-26 |
10년 | 2.1e-25 |
1000년 | 2.1e-23 |
지구의 나이 | 8.64e-17 |
우주의 나이 | 2.8e-16 (복권 당첨보다 훨씬 적음) |
계산은 이 온라인 고정밀 계산기를 사용하여 수행되었습니다.
보시다시피 경쟁적인 하드웨어를 사용하더라도 충돌이 발생할 가능성은 거의 없습니다. 생일 역설은 이 맥락에서 적용되지 않습니다. 이는 우리가 찾고자 하는 공개 키(주소, 공개 키의 해시가 아님)를 이미 알고 있는 경우에만 작동합니다. 이 프로그램은 공개 키 간의 충돌을 찾지 않습니다. 특정 접두사가 있는 주소와의 충돌만 검색합니다.
CUDA SDK를 설치하고 Visual C++ 2017에서 VanitySearch.sln을 엽니다.
프로젝트 속성에서 Windows SDK 버전을 재설정해야 할 수도 있습니다.
빌드->구성 관리자에서 릴리스 구성을 선택합니다.
구축하고 즐기세요.
참고: 현재 릴리스는 CUDA SDK 10.0으로 컴파일되었습니다. CUDA SDK의 다른 릴리스가 있는 경우 텍스트 편집기를 사용하여 VanitySearch.vcxproj에서 CUDA SDK 경로를 업데이트해야 할 수도 있습니다. 현재 nvcc 옵션은 3.0 기능부터 시작하는 아키텍처로 설정되어 있습니다. 이전 하드웨어의 경우 원하는 컴퓨팅 기능을 GPUEngine.cu 속성, CUDA C/C++, 장치, 코드 생성 목록에 추가하세요.
CUDA SDK를 설치합니다.
이전 g++를 설치합니다(CUDA SDK에만 해당). CUDA SDK 버전과 Linux 배포판에 따라 이전 g++를 설치해야 할 수도 있습니다.
최근 gcc를 설치하세요. VanitySearch는 최근 gcc(>=7)로 컴파일하고 연결해야 합니다. 현재 릴리스는 gcc 7.3.0으로 컴파일되었습니다.
makefile을 편집하고 nvcc에 대한 적절한 CUDA SDK 및 컴파일러 경로를 설정하십시오. 또는 make
을 위해 변수로 전달합니다.
CUDA = /usr/local/cuda-8.0
CXXCUDA = /usr/bin/g++-4.8
서로 다른 아키텍처를 가진 GPU가 여러 개 있는 경우 아키텍처 목록을 입력할 수 있습니다(nvcc 문서 참조).
하드웨어에 따라 CCAP를 원하는 컴퓨팅 기능으로 설정하십시오. 자세한 내용은 도커 섹션을 참조하세요. 최근 CUDA SDK에서는 컴퓨팅 기능 2.0(Fermi)이 더 이상 사용되지 않습니다.
VanitySearch 디렉터리로 이동합니다.
CPU 전용 버전을 빌드하려면(CUDA 지원 없음):
$ make all
CUDA로 빌드하려면:
$ make gpu=1 CCAP=2.0 all
Runnig VanitySearch(Intel(R) Xeon(R) CPU, 8코어, @ 2.93GHz, 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/Docker파일) Docker 이미지는 CPU 전용 버전 및 지원되는 각 CUDA 컴퓨팅 기능 버전( CCAP
)에 대해 빌드됩니다. 일반적으로 사용자는 하드웨어와 드라이버에서 지원하는 최신 CCAP
선택해야 합니다. 호환성 표는 Wikipedia 또는 제품의 공식 NVIDIA 웹페이지에서 확인할 수 있습니다.
Docker는 다단계 빌드를 사용하여 최종 이미지 크기를 개선합니다. 빌드 프로세스를 용이하게 하기 위해 스크립트가 제공됩니다.
직접 빌드하는 경우 IMAGE_NAME
환경 변수를 통해 전체 이미지 이름(소유자/저장소 부분 포함)을 맞춤설정할 수 있습니다. 기본적으로 소유자 부분이 포함된 vanitysearch
만 사용됩니다. 사전 빌드된 이미지는 @ratijas의 Docker 허브에서 사용할 수 있습니다.
vanitysearch:cpu
이미지 빌드 및 태그 지정:
$ ./docker/cpu/build.sh
시스템에 적합하지 않을 수 있는 "기본" GPU 지원을 사용하여 구축하세요.
$ ./docker/cuda/build.sh
맞춤형 GPU 지원으로 구축:
$ env CCAP=5.2 CUDA=10.2 ./docker/cuda/build.sh
docker-compose 사용자의 경우 죄송합니다. docker로 구성된 GPU는 (아직) 3.x 브랜치에서 지원되지 않습니다. 하지만 (희망적으로) 곧 바뀔 것입니다.
참고: VanitySearch 이미지에는 네트워크 액세스가 필요하지 않습니다. 실행 중인 컨테이너에서 데이터가 누출되지 않도록 하려면 항상 --network none
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는 GPLv3에 따라 라이센스가 부여됩니다.