mirror of
https://github.com/jwinterm/SimpleVanity.git
synced 2026-10-17 05:51:25 +02:00
111 lines
4.0 KiB
Python
Executable File
111 lines
4.0 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import argparse, os, sys, time
|
|
from subprocess import PIPE, Popen
|
|
from threading import Thread
|
|
from Queue import Queue, Empty
|
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("-m", "--match-anywhere", help="match anywhere in address", action="store_true")
|
|
parser.add_argument("wallet_name", help="file name for wallet binary")
|
|
parser.add_argument("wallet_pw", help="desired wallet password")
|
|
parser.add_argument("target", help="string to match in address")
|
|
args = parser.parse_args()
|
|
|
|
ON_POSIX = 'posix' in sys.builtin_module_names
|
|
|
|
|
|
def enqueue_output(out, queue):
|
|
for line in iter(out.readline, b''):
|
|
queue.put(line)
|
|
out.close()
|
|
|
|
|
|
def createWallet():
|
|
"""Method that will loop on itself in a single thread until match"""
|
|
p = Popen(["./simplewallet", "--set_log", "0", "--generate-new-wallet",
|
|
args.wallet_name, "--password", args.wallet_pw],
|
|
stdout=PIPE,
|
|
stdin=PIPE,
|
|
bufsize=1,
|
|
close_fds=ON_POSIX)
|
|
|
|
q = Queue()
|
|
t = Thread(target=enqueue_output, args=(p.stdout, q))
|
|
t.daemon = True # thread dies with the program
|
|
t.start()
|
|
|
|
t_start = time.time()
|
|
electrum = ''
|
|
electrum_coming = False
|
|
|
|
while time.time() - t_start < 10:
|
|
try:
|
|
line = q.get_nowait()
|
|
if "new wallet:" in line:
|
|
address = line.rstrip().split(': ')[1]
|
|
if "view key:" in line:
|
|
view_key = line.rstrip().split(': ')[1]
|
|
if electrum_coming:
|
|
electrum = line.rstrip()
|
|
if "PLEASE NOTE:" in line:
|
|
electrum_coming = line.rstrip()
|
|
except Empty:
|
|
pass
|
|
else:
|
|
pass
|
|
if len(electrum) > 2:
|
|
break
|
|
|
|
p.kill()
|
|
|
|
# print "Generated address: {0}".format(address)
|
|
if not args.match_anywhere:
|
|
print "Target: {0}, Address first chars: {1}".format(args.target, address[2:len(args.target)+2])
|
|
if args.target in address[2:len(args.target)+2]:
|
|
print "success1!"
|
|
with open('./{0}_info.txt'.format(args.wallet_name), 'w') as f:
|
|
f.write("Name:\n{0}\n\nAddress:\n{1}\n\nView key:\n{2}\n\nElectrum seed:\n{3}".format(
|
|
args.wallet_name, address, view_key, electrum))
|
|
return 0
|
|
else:
|
|
os.remove('./{0}'.format(args.wallet_name))
|
|
os.remove('./{0}.keys'.format(args.wallet_name))
|
|
os.remove('./{0}.address.txt'.format(args.wallet_name))
|
|
os.remove('./simplewallet.log')
|
|
return 1
|
|
elif args.match_anywhere:
|
|
print "Target: {0}, Address: {1}".format(args.target, address)
|
|
if args.target in address:
|
|
print "success2!"
|
|
with open('./{0}_info.txt'.format(args.wallet_name), 'w') as f:
|
|
f.write("Name:\n{0}\n\nAddress:\n{1}\n\nView key:\n{2}\n\nElectrum seed:\n{3}".format(
|
|
args.wallet_name, address, view_key, electrum))
|
|
return 0
|
|
else:
|
|
os.remove('./{0}'.format(args.wallet_name))
|
|
os.remove('./{0}.keys'.format(args.wallet_name))
|
|
os.remove('./{0}.address.txt'.format(args.wallet_name))
|
|
os.remove('./simplewallet.log')
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if not args.match_anywhere:
|
|
print "You're target is {0} characters, expect to need {1} attempts to match at begininning of address".format(len(args.target), 62**len(args.target))
|
|
elif args.match_anywhere:
|
|
print "You're target is {0} characters, expect to need {1:.0f} attempts to match anywhere in the address".format(len(args.target), 1.0/((94.0-len(args.target))*(62.0**(94-len(args.target)))/(62.0**94)))
|
|
print 'starting'
|
|
time.sleep(1)
|
|
print '...'
|
|
time.sleep(1)
|
|
n = 1
|
|
t = time.time()
|
|
while True:
|
|
print "Attempt #{0}, total time = {1:.2f} seconds".format(n+1, time.time()-t)
|
|
out = createWallet()
|
|
if out == 0:
|
|
break
|
|
n += 1
|
|
|