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 os | |||||
import shutil | import shutil | ||||
class WalletHDTest(BitcoinTestFramework): | class WalletHDTest(BitcoinTestFramework): | ||||
def __init__(self): | def __init__(self): | ||||
super().__init__() | super().__init__() | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
▲ Show 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
# second internal child key | # second internal child key | ||||
assert_equal(change_addrV["hdkeypath"], "m/0'/1'/1'") | assert_equal(change_addrV["hdkeypath"], "m/0'/1'/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) | ||||
self.log.info("Restore backup ...") | self.log.info("Restore backup ...") | ||||
self.stop_node(1) | self.stop_node(1) | ||||
os.remove(self.options.tmpdir + "/node1/regtest/wallet.dat") | # we need to delete the complete regtest directory | ||||
# 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/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.nodes[1] = self.start_node( | ||||
1, self.options.tmpdir, self.extra_args[1]) | 1, self.options.tmpdir, self.extra_args[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) | ||||
connect_nodes_bi(self.nodes, 0, 1) | |||||
self.sync_all() | |||||
# Needs rescan | # Needs rescan | ||||
self.stop_node(1) | self.stop_node(1) | ||||
self.nodes[1] = self.start_node( | self.nodes[1] = self.start_node( | ||||
1, self.options.tmpdir, self.extra_args[1] + ['-rescan']) | 1, self.options.tmpdir, self.extra_args[1] + ['-rescan']) | ||||
#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) | ||||
# 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 |