Changeset View
Changeset View
Standalone View
Standalone View
qa/rpc-tests/wallet-hd.py
Show All 17 Lines | class WalletHDTest(BitcoinTestFramework): | ||||
def __init__(self): | def __init__(self): | ||||
super().__init__() | super().__init__() | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
self.num_nodes = 2 | self.num_nodes = 2 | ||||
self.node_args = [['-usehd=0'], ['-usehd=1', '-keypool=0']] | self.node_args = [['-usehd=0'], ['-usehd=1', '-keypool=0']] | ||||
def setup_network(self): | def setup_network(self): | ||||
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, self.node_args) | self.nodes = start_nodes( | ||||
self.num_nodes, self.options.tmpdir, self.node_args) | |||||
self.is_network_split = False | self.is_network_split = False | ||||
connect_nodes_bi(self.nodes, 0, 1) | connect_nodes_bi(self.nodes, 0, 1) | ||||
def run_test (self): | def run_test(self): | ||||
tmpdir = self.options.tmpdir | tmpdir = self.options.tmpdir | ||||
# Make sure we use hd, keep masterkeyid | # Make sure we use hd, keep masterkeyid | ||||
masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] | masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] | ||||
assert_equal(len(masterkeyid), 40) | assert_equal(len(masterkeyid), 40) | ||||
# Import a non-HD private key in the HD wallet | # Import a non-HD private key in the HD wallet | ||||
non_hd_add = self.nodes[0].getnewaddress() | non_hd_add = self.nodes[0].getnewaddress() | ||||
self.nodes[1].importprivkey(self.nodes[0].dumpprivkey(non_hd_add)) | self.nodes[1].importprivkey(self.nodes[0].dumpprivkey(non_hd_add)) | ||||
# This should be enough to keep the master key and the non-HD key | # This should be enough to keep the master key and the non-HD key | ||||
self.nodes[1].backupwallet(tmpdir + "/hd.bak") | self.nodes[1].backupwallet(tmpdir + "/hd.bak") | ||||
#self.nodes[1].dumpwallet(tmpdir + "/hd.dump") | # self.nodes[1].dumpwallet(tmpdir + "/hd.dump") | ||||
# Derive some HD addresses and remember the last | # Derive some HD addresses and remember the last | ||||
# Also send funds to each add | # Also send funds to each add | ||||
self.nodes[0].generate(101) | self.nodes[0].generate(101) | ||||
hd_add = None | hd_add = None | ||||
num_hd_adds = 300 | num_hd_adds = 300 | ||||
for i in range(num_hd_adds): | for i in range(num_hd_adds): | ||||
hd_add = self.nodes[1].getnewaddress() | hd_add = self.nodes[1].getnewaddress() | ||||
hd_info = self.nodes[1].validateaddress(hd_add) | hd_info = self.nodes[1].validateaddress(hd_add) | ||||
assert_equal(hd_info["hdkeypath"], "m/0'/0'/"+str(i+1)+"'") | assert_equal(hd_info["hdkeypath"], "m/0'/0'/" + str(i + 1) + "'") | ||||
assert_equal(hd_info["hdmasterkeyid"], masterkeyid) | assert_equal(hd_info["hdmasterkeyid"], masterkeyid) | ||||
self.nodes[0].sendtoaddress(hd_add, 1) | self.nodes[0].sendtoaddress(hd_add, 1) | ||||
self.nodes[0].generate(1) | self.nodes[0].generate(1) | ||||
self.nodes[0].sendtoaddress(non_hd_add, 1) | self.nodes[0].sendtoaddress(non_hd_add, 1) | ||||
self.nodes[0].generate(1) | self.nodes[0].generate(1) | ||||
self.sync_all() | self.sync_all() | ||||
assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1) | assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1) | ||||
print("Restore backup ...") | print("Restore backup ...") | ||||
self.stop_node(1) | self.stop_node(1) | ||||
os.remove(self.options.tmpdir + "/node1/regtest/wallet.dat") | os.remove(self.options.tmpdir + "/node1/regtest/wallet.dat") | ||||
shutil.copyfile(tmpdir + "/hd.bak", tmpdir + "/node1/regtest/wallet.dat") | shutil.copyfile( | ||||
tmpdir + "/hd.bak", tmpdir + "/node1/regtest/wallet.dat") | |||||
self.nodes[1] = start_node(1, self.options.tmpdir, self.node_args[1]) | self.nodes[1] = start_node(1, self.options.tmpdir, self.node_args[1]) | ||||
#connect_nodes_bi(self.nodes, 0, 1) | # connect_nodes_bi(self.nodes, 0, 1) | ||||
# Assert that derivation is deterministic | # Assert that derivation is deterministic | ||||
hd_add_2 = None | hd_add_2 = None | ||||
for _ in range(num_hd_adds): | for _ in range(num_hd_adds): | ||||
hd_add_2 = self.nodes[1].getnewaddress() | hd_add_2 = self.nodes[1].getnewaddress() | ||||
hd_info_2 = self.nodes[1].validateaddress(hd_add_2) | hd_info_2 = self.nodes[1].validateaddress(hd_add_2) | ||||
assert_equal(hd_info_2["hdkeypath"], "m/0'/0'/"+str(_+1)+"'") | assert_equal(hd_info_2["hdkeypath"], "m/0'/0'/" + str(_ + 1) + "'") | ||||
assert_equal(hd_info_2["hdmasterkeyid"], masterkeyid) | assert_equal(hd_info_2["hdmasterkeyid"], masterkeyid) | ||||
assert_equal(hd_add, hd_add_2) | assert_equal(hd_add, hd_add_2) | ||||
# Needs rescan | # Needs rescan | ||||
self.stop_node(1) | self.stop_node(1) | ||||
self.nodes[1] = start_node(1, self.options.tmpdir, self.node_args[1] + ['-rescan']) | self.nodes[1] = start_node( | ||||
1, self.options.tmpdir, self.node_args[1] + ['-rescan']) | |||||
#connect_nodes_bi(self.nodes, 0, 1) | # connect_nodes_bi(self.nodes, 0, 1) | ||||
assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1) | assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1) | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
WalletHDTest().main () | WalletHDTest().main() |