pywallet/tests/generate_bip32_test_vectors.py
2017-11-22 09:56:31 +02:00

69 lines
2.2 KiB
Python

"""Generate BIP32 wallet test vectors from pycoin"""
import argparse
from binascii import hexlify
from hashlib import sha256
import json
import random
from pycoin.wallet import Wallet
def dump_node(node):
return {
'private_key': node.wallet_key(True),
'wif': node.wif(),
'public_key': node.wallet_key(False),
'chain_code': hexlify(node.chain_code),
'fingerprint': hexlify(node.fingerprint()),
'depth': node.depth,
'secret_exponent': node.secret_exponent,
}
def get_new_address(wallet_num):
passphrase = sha256(b"%s" % random.randint(0, 2**30)).hexdigest()
wallet = Wallet.from_master_secret(passphrase)
ret = dump_node(wallet)
children = []
# Now build up some random paths
# Just go five deep
path = "m"
for depth in range(5):
child_number = random.randint(0, 0x80000000)
path = "%s/%s" % (path, child_number)
prime = random.choice([True, False])
if prime:
path += "'"
children.append(
{"path": path,
"child": dump_node(wallet.subkey_for_path(path[2:]))})
ret['children'] = children
return ret
def generate_address_vector(outfile, num_addresses, seed):
if args.seed:
random.seed(args.seed)
with open(outfile, 'w') as f:
f.write("[\n")
for i in range(num_addresses):
f.write(json.dumps(get_new_address(i)))
if i < (num_addresses - 1):
f.write(",")
f.write("\n")
f.write("]")
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Generate test vectors for pub/private key validation")
parser.add_argument("-o", "--output", help="output file path",
default="tests/bip32_test_vector.json")
parser.add_argument("-n", "--num-keys", type=int, default=100,
help="Number of keys to generate")
parser.add_argument("-s", "--seed", type=int, default=1234,
help="The random seed for random wallets. Optional.")
args = parser.parse_args()
generate_address_vector(
outfile=args.output, num_addresses=args.num_keys, seed=args.seed)