Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_dump.py
Show All 19 Lines | with open(file_name, encoding='utf8') as inputfile: | ||||
found_script_addr = 0 | found_script_addr = 0 | ||||
found_addr_chg = 0 | found_addr_chg = 0 | ||||
found_addr_rsv = 0 | found_addr_rsv = 0 | ||||
hd_master_addr_ret = None | hd_master_addr_ret = None | ||||
for line in inputfile: | for line in inputfile: | ||||
# only read non comment lines | # only read non comment lines | ||||
if line[0] != "#" and len(line) > 10: | if line[0] != "#" and len(line) > 10: | ||||
# split out some data | # split out some data | ||||
key_label, comment = line.split("#") | key_date_label, comment = line.split("#") | ||||
# key = key_label.split(" ")[0] | key_date_label = key_date_label.split(" ") | ||||
keytype = key_label.split(" ")[2] | # key = key_date_label[0] | ||||
if len(comment) > 1: | date = key_date_label[1] | ||||
keytype = key_date_label[2] | |||||
if not len(comment) or date.startswith('1970'): | |||||
continue | |||||
addr_keypath = comment.split(" addr=")[1] | addr_keypath = comment.split(" addr=")[1] | ||||
addr = addr_keypath.split(" ")[0] | addr = addr_keypath.split(" ")[0] | ||||
keypath = None | keypath = None | ||||
if keytype == "inactivehdseed=1": | if keytype == "inactivehdseed=1": | ||||
# ensure the old master is still available | # ensure the old master is still available | ||||
assert hd_master_addr_old == addr | assert hd_master_addr_old == addr | ||||
elif keytype == "hdseed=1": | elif keytype == "hdseed=1": | ||||
# ensure we have generated a new hd master key | # ensure we have generated a new hd master key | ||||
assert hd_master_addr_old != addr | assert hd_master_addr_old != addr | ||||
hd_master_addr_ret = addr | hd_master_addr_ret = addr | ||||
elif keytype == "script=1": | elif keytype == "script=1": | ||||
# scripts don't have keypaths | # scripts don't have keypaths | ||||
keypath = None | keypath = None | ||||
else: | else: | ||||
keypath = addr_keypath.rstrip().split("hdkeypath=")[1] | keypath = addr_keypath.rstrip().split("hdkeypath=")[1] | ||||
# count key types | # count key types | ||||
for addrObj in addrs: | for addrObj in addrs: | ||||
if addrObj['address'] == addr and addrObj['hdkeypath'] == keypath and keytype == "label=": | if addrObj['address'] == addr and addrObj['hdkeypath'] == keypath and keytype == "label=": | ||||
found_addr += 1 | found_addr += 1 | ||||
break | break | ||||
elif keytype == "change=1": | elif keytype == "change=1": | ||||
found_addr_chg += 1 | found_addr_chg += 1 | ||||
break | break | ||||
elif keytype == "reserve=1": | elif keytype == "reserve=1": | ||||
found_addr_rsv += 1 | found_addr_rsv += 1 | ||||
break | break | ||||
# count scripts | # count scripts | ||||
for script_addr in script_addrs: | for script_addr in script_addrs: | ||||
if script_addr == addr.rstrip() and keytype == "script=1": | if script_addr == addr.rstrip() and keytype == "script=1": | ||||
found_script_addr += 1 | found_script_addr += 1 | ||||
break | break | ||||
return found_addr, found_script_addr, found_addr_chg, found_addr_rsv, hd_master_addr_ret | return found_addr, found_script_addr, found_addr_chg, found_addr_rsv, hd_master_addr_ret | ||||
class WalletDumpTest(BitcoinTestFramework): | class WalletDumpTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
self.extra_args = [["-keypool=90"]] | self.extra_args = [["-keypool=90"]] | ||||
Show All 32 Lines | def run_test(self): | ||||
found_addr, found_script_addr, found_addr_chg, found_addr_rsv, hd_master_addr_unenc = \ | found_addr, found_script_addr, found_addr_chg, found_addr_rsv, hd_master_addr_unenc = \ | ||||
read_dump(tmpdir + "/node0/wallet.unencrypted.dump", | read_dump(tmpdir + "/node0/wallet.unencrypted.dump", | ||||
addrs, [multisig_addr], None) | addrs, [multisig_addr], None) | ||||
# all keys must be in the dump | # all keys must be in the dump | ||||
assert_equal(found_addr, test_addr_count) | assert_equal(found_addr, test_addr_count) | ||||
# all scripts must be in the dump | # all scripts must be in the dump | ||||
assert_equal(found_script_addr, 1) | assert_equal(found_script_addr, 1) | ||||
# 50 blocks where mined | # 0 blocks where mined | ||||
assert_equal(found_addr_chg, 50) | assert_equal(found_addr_chg, 0) | ||||
# 90 keys plus 100% internal keys | # 90 keys plus 100% internal keys | ||||
assert_equal(found_addr_rsv, 90 * 2) | assert_equal(found_addr_rsv, 90 * 2) | ||||
# encrypt wallet, restart, unlock and dump | # encrypt wallet, restart, unlock and dump | ||||
self.nodes[0].node_encrypt_wallet('test') | self.nodes[0].node_encrypt_wallet('test') | ||||
self.start_node(0) | self.start_node(0) | ||||
self.nodes[0].walletpassphrase('test', 10) | self.nodes[0].walletpassphrase('test', 10) | ||||
# Should be a no-op: | # Should be a no-op: | ||||
self.nodes[0].keypoolrefill() | self.nodes[0].keypoolrefill() | ||||
self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.encrypted.dump") | self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.encrypted.dump") | ||||
found_addr, found_script_addr, found_addr_chg, found_addr_rsv, _ = \ | found_addr, found_script_addr, found_addr_chg, found_addr_rsv, _ = \ | ||||
read_dump(tmpdir + "/node0/wallet.encrypted.dump", | read_dump(tmpdir + "/node0/wallet.encrypted.dump", | ||||
addrs, [multisig_addr], hd_master_addr_unenc) | addrs, [multisig_addr], hd_master_addr_unenc) | ||||
assert_equal(found_addr, test_addr_count) | assert_equal(found_addr, test_addr_count) | ||||
assert_equal(found_script_addr, 1) | assert_equal(found_script_addr, 1) | ||||
# old reserve keys are marked as change now | # old reserve keys are marked as change now | ||||
assert_equal(found_addr_chg, 90 * 2 + 50) | assert_equal(found_addr_chg, 90 * 2) | ||||
assert_equal(found_addr_rsv, 90 * 2) | assert_equal(found_addr_rsv, 90 * 2) | ||||
# Overwriting should fail | # Overwriting should fail | ||||
assert_raises_rpc_error(-8, "already exists", | assert_raises_rpc_error(-8, "already exists", | ||||
self.nodes[0].dumpwallet, tmpdir + "/node0/wallet.unencrypted.dump") | self.nodes[0].dumpwallet, tmpdir + "/node0/wallet.unencrypted.dump") | ||||
# Restart node with new wallet, and test importwallet | # Restart node with new wallet, and test importwallet | ||||
self.stop_node(0) | self.stop_node(0) | ||||
Show All 16 Lines |