2019-09-29 01:22:39 +00:00
|
|
|
"""
|
|
|
|
Onionr Vanity address generator
|
|
|
|
|
|
|
|
Library to generate vanity ed25519 addresses in various encodings
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
Onionr Vanity Address Generator
|
|
|
|
Copyright (C) 2019 Kevin Froman
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
"""
|
|
|
|
|
2019-09-30 01:55:59 +00:00
|
|
|
import niceware
|
2019-09-29 01:22:39 +00:00
|
|
|
import nacl.signing, nacl.encoding
|
|
|
|
|
|
|
|
import multiprocessing
|
|
|
|
from multiprocessing import Process, Pipe, Queue
|
|
|
|
import re, time
|
|
|
|
import threading
|
|
|
|
|
2019-09-30 01:55:59 +00:00
|
|
|
wordlist = niceware.WORD_LIST
|
2019-09-29 01:22:39 +00:00
|
|
|
|
|
|
|
def find_vanity_mnemonic(start_words: str, queue):
|
|
|
|
key_pair = [b"", b""]
|
|
|
|
vanity_key = ""
|
|
|
|
check = 0
|
|
|
|
while not vanity_key.startswith(start_words):
|
|
|
|
key = nacl.signing.SigningKey.generate()
|
|
|
|
key_pair[1] = key.encode(nacl.encoding.RawEncoder)
|
|
|
|
key_pair[0] = key.verify_key.encode(encoder=nacl.encoding.RawEncoder)
|
2019-09-30 05:13:43 +00:00
|
|
|
vanity_key = '-'.join(niceware.bytes_to_passphrase(key_pair[0]))
|
2019-09-29 01:22:39 +00:00
|
|
|
check += 1
|
|
|
|
else:
|
|
|
|
queue.put(key_pair)
|
|
|
|
#print("DONE", check, key_pair)
|
|
|
|
return key_pair
|
|
|
|
|
|
|
|
def _start(start_words, obj):
|
|
|
|
done = False
|
|
|
|
q = Queue()
|
|
|
|
p = Process(target=find_vanity_mnemonic, args=[start_words, q])
|
|
|
|
p.daemon = True
|
|
|
|
p.start()
|
|
|
|
rec = None
|
|
|
|
while not done:
|
|
|
|
try:
|
|
|
|
if rec == None:
|
|
|
|
rec = q.get(True, 1)
|
|
|
|
except:
|
|
|
|
rec = None
|
|
|
|
if rec != None or obj.done:
|
|
|
|
done = True
|
|
|
|
obj.done = True
|
|
|
|
obj.result = rec
|
|
|
|
return rec
|
|
|
|
|
|
|
|
def handler(start_words: str):
|
|
|
|
obj = lambda test: None
|
|
|
|
obj.done = False
|
|
|
|
for x in range(multiprocessing.cpu_count()):
|
|
|
|
threading.Thread(target=_start, args=[start_words, obj]).start()
|
|
|
|
while not obj.done:
|
|
|
|
time.sleep(1)
|
|
|
|
return obj.result
|
|
|
|
|
|
|
|
def find_multiprocess(start_words: str):
|
|
|
|
start_words = start_words.strip()
|
|
|
|
start_words = re.sub(' +', ' ', start_words)
|
|
|
|
test_words = str(start_words)
|
|
|
|
|
|
|
|
for word in test_words.split(' '):
|
|
|
|
for validword in wordlist:
|
|
|
|
if word == validword:
|
|
|
|
break
|
|
|
|
else:
|
2019-09-30 05:13:43 +00:00
|
|
|
raise ValueError('%s not in wordlist' % (word,))
|
2019-09-29 01:22:39 +00:00
|
|
|
return handler(start_words)
|