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. | ||||
"""Test Hierarchical Deterministic wallet function.""" | """Test Hierarchical Deterministic wallet function.""" | ||||
import os | import os | ||||
import shutil | import shutil | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import assert_equal, connect_nodes_bi | from test_framework.util import ( | ||||
assert_equal, | |||||
connect_nodes_bi, | |||||
assert_raises_rpc_error | |||||
) | |||||
class WalletHDTest(BitcoinTestFramework): | class WalletHDTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
self.num_nodes = 2 | self.num_nodes = 2 | ||||
self.extra_args = [[], ['-keypool=0']] | self.extra_args = [[], ['-keypool=0']] | ||||
▲ Show 20 Lines • Show All 108 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
keypath = "" | keypath = "" | ||||
for out in outs: | for out in outs: | ||||
if out['value'] != 1: | if out['value'] != 1: | ||||
keypath = self.nodes[1].getaddressinfo( | keypath = self.nodes[1].getaddressinfo( | ||||
out['scriptPubKey']['addresses'][0])['hdkeypath'] | out['scriptPubKey']['addresses'][0])['hdkeypath'] | ||||
assert_equal(keypath[0:7], "m/0'/1'") | assert_equal(keypath[0:7], "m/0'/1'") | ||||
# Generate a new HD seed on node 1 and make sure it is set | |||||
orig_masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] | |||||
self.nodes[1].sethdseed() | |||||
new_masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] | |||||
assert orig_masterkeyid != new_masterkeyid | |||||
addr = self.nodes[1].getnewaddress() | |||||
# Make sure the new address is the first from the keypool | |||||
assert_equal(self.nodes[1].getaddressinfo( | |||||
addr)['hdkeypath'], 'm/0\'/0\'/0\'') | |||||
self.nodes[1].keypoolrefill(1) # Fill keypool with 1 key | |||||
# Set a new HD seed on node 1 without flushing the keypool | |||||
new_seed = self.nodes[0].dumpprivkey(self.nodes[0].getnewaddress()) | |||||
orig_masterkeyid = new_masterkeyid | |||||
self.nodes[1].sethdseed(False, new_seed) | |||||
new_masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] | |||||
assert orig_masterkeyid != new_masterkeyid | |||||
addr = self.nodes[1].getnewaddress() | |||||
assert_equal(orig_masterkeyid, self.nodes[1].getaddressinfo( | |||||
addr)['hdmasterkeyid']) | |||||
# Make sure the new address continues previous keypool | |||||
assert_equal(self.nodes[1].getaddressinfo( | |||||
addr)['hdkeypath'], 'm/0\'/0\'/1\'') | |||||
# Check that the next address is from the new seed | |||||
self.nodes[1].keypoolrefill(1) | |||||
next_addr = self.nodes[1].getnewaddress() | |||||
assert_equal(new_masterkeyid, self.nodes[1].getaddressinfo( | |||||
next_addr)['hdmasterkeyid']) | |||||
# Make sure the new address is not from previous keypool | |||||
assert_equal(self.nodes[1].getaddressinfo( | |||||
next_addr)['hdkeypath'], 'm/0\'/0\'/0\'') | |||||
assert next_addr != addr | |||||
# Sethdseed parameter validity | |||||
assert_raises_rpc_error(-1, 'sethdseed', | |||||
self.nodes[0].sethdseed, False, new_seed, 0) | |||||
assert_raises_rpc_error(-5, "Invalid private key", | |||||
self.nodes[1].sethdseed, False, "not_wif") | |||||
assert_raises_rpc_error(-1, "JSON value is not a boolean as expected", | |||||
self.nodes[1].sethdseed, "Not_bool") | |||||
assert_raises_rpc_error(-1, "JSON value is not a string as expected", | |||||
self.nodes[1].sethdseed, False, True) | |||||
assert_raises_rpc_error(-5, "Already have this key", | |||||
self.nodes[1].sethdseed, False, new_seed) | |||||
assert_raises_rpc_error(-5, "Already have this key", | |||||
self.nodes[1].sethdseed, False, self.nodes[1].dumpprivkey(self.nodes[1].getnewaddress())) | |||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
WalletHDTest().main() | WalletHDTest().main() |