Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet-hd.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2016 The Bitcoin Core developers | # Copyright (c) 2016 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import ( | from test_framework.util import ( | ||||
assert_equal, | assert_equal, | ||||
connect_nodes_bi, | connect_nodes_bi, | ||||
) | ) | ||||
import shutil | import shutil | ||||
class WalletHDTest(BitcoinTestFramework): | class WalletHDTest(BitcoinTestFramework): | ||||
def set_test_params(self): | |||||
def __init__(self): | |||||
super().__init__() | |||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
self.num_nodes = 2 | self.num_nodes = 2 | ||||
self.extra_args = [['-usehd=0'], ['-usehd=1', '-keypool=0']] | self.extra_args = [['-usehd=0'], ['-usehd=1', '-keypool=0']] | ||||
def run_test(self): | def run_test(self): | ||||
tmpdir = self.options.tmpdir | tmpdir = self.options.tmpdir | ||||
# Make sure can't switch off usehd after wallet creation | # Make sure can't switch off usehd after wallet creation | ||||
self.stop_node(1) | self.stop_node(1) | ||||
self.assert_start_raises_init_error( | self.assert_start_raises_init_error( | ||||
1, self.options.tmpdir, ['-usehd=0'], 'already existing HD wallet') | 1, ['-usehd=0'], 'already existing HD wallet') | ||||
self.nodes[1] = self.start_node( | self.start_node(1) | ||||
1, self.options.tmpdir, self.extra_args[1]) | |||||
connect_nodes_bi(self.nodes, 0, 1) | connect_nodes_bi(self.nodes, 0, 1) | ||||
# 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) | ||||
# create an internal key | # create an internal key | ||||
change_addr = self.nodes[1].getrawchangeaddress() | change_addr = self.nodes[1].getrawchangeaddress() | ||||
Show All 36 Lines | def run_test(self): | ||||
self.log.info("Restore backup ...") | self.log.info("Restore backup ...") | ||||
self.stop_node(1) | self.stop_node(1) | ||||
# we need to delete the complete regtest directory | # we need to delete the complete regtest directory | ||||
# otherwise node1 would auto-recover all funds in flag the keypool keys as used | # otherwise node1 would auto-recover all funds in flag the keypool keys as used | ||||
shutil.rmtree(tmpdir + "/node1/regtest/blocks") | shutil.rmtree(tmpdir + "/node1/regtest/blocks") | ||||
shutil.rmtree(tmpdir + "/node1/regtest/chainstate") | shutil.rmtree(tmpdir + "/node1/regtest/chainstate") | ||||
shutil.copyfile(tmpdir + "/hd.bak", tmpdir + | shutil.copyfile(tmpdir + "/hd.bak", tmpdir + | ||||
"/node1/regtest/wallet.dat") | "/node1/regtest/wallet.dat") | ||||
self.nodes[1] = self.start_node( | self.start_node(1) | ||||
1, self.options.tmpdir, self.extra_args[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(_) + "'") | assert_equal(hd_info_2["hdkeypath"], "m/0'/0'/" + str(_) + "'") | ||||
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) | ||||
connect_nodes_bi(self.nodes, 0, 1) | connect_nodes_bi(self.nodes, 0, 1) | ||||
self.sync_all() | self.sync_all() | ||||
# Needs rescan | # Needs rescan | ||||
self.stop_node(1) | self.stop_node(1) | ||||
self.nodes[1] = self.start_node( | self.start_node(1, extra_args=self.extra_args[1] + ['-rescan']) | ||||
1, self.options.tmpdir, self.extra_args[1] + ['-rescan']) | |||||
assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1) | assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1) | ||||
# send a tx and make sure its using the internal chain for the changeoutput | # send a tx and make sure its using the internal chain for the changeoutput | ||||
txid = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 1) | txid = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 1) | ||||
outs = self.nodes[1].decoderawtransaction( | outs = self.nodes[1].decoderawtransaction( | ||||
self.nodes[1].gettransaction(txid)['hex'])['vout'] | self.nodes[1].gettransaction(txid)['hex'])['vout'] | ||||
keypath = "" | keypath = "" | ||||
for out in outs: | for out in outs: | ||||
Show All 9 Lines |