mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 04:52:59 +01:00
077f21875f
fa8433e379 qa: Remove unneded import_deterministic_coinbase_privkeys overwrite, add comments (MarcoFalke) e413c2ddd1 qa: Fix codespell error and have lint-spelling error instead of warn (MarcoFalke) Pull request description: Currently the functional tests require the wallet module to be compiled into the Bitcoin Core executable. For example the premine (or datadir cache) to speed up tests when run in parallel would mine a bunch of blocks and store the private keys to sign the coinbase tx outputs in a wallet. There is no need to have the overhead of the whole wallet module by using keys that are deterministic for all runs. Note that this change most likely requires the `./test/cache/` to be cleared. Tree-SHA512: 9ce26036b0e10f0f888f66a1e50be6a357343f9ffb302ae24a7bb3df2f083a31702ef308b738a03b08a1b623aeddac5d6563dc1b15078c0357b7dafad7808ec3
161 lines
6.7 KiB
Python
Executable File
161 lines
6.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (c) 2016 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
"""Test the dumpwallet RPC."""
|
|
import os
|
|
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
from test_framework.util import (
|
|
assert_equal,
|
|
assert_raises_rpc_error,
|
|
)
|
|
|
|
|
|
def read_dump(file_name, addrs, script_addrs, hd_master_addr_old):
|
|
"""
|
|
Read the given dump, count the addrs that match, count change and reserve.
|
|
Also check that the old hd_master is inactive
|
|
"""
|
|
with open(file_name, encoding='utf8') as inputfile:
|
|
found_addr = 0
|
|
found_script_addr = 0
|
|
found_addr_chg = 0
|
|
found_addr_rsv = 0
|
|
hd_master_addr_ret = None
|
|
for line in inputfile:
|
|
# only read non comment lines
|
|
if line[0] != "#" and len(line) > 10:
|
|
# split out some data
|
|
key_date_label, comment = line.split("#")
|
|
key_date_label = key_date_label.split(" ")
|
|
# key = key_date_label[0]
|
|
date = key_date_label[1]
|
|
keytype = key_date_label[2]
|
|
|
|
imported_key = date == '1970-01-01T00:00:01Z'
|
|
if imported_key:
|
|
# Imported keys have multiple addresses, no label (keypath) and timestamp
|
|
# Skip them
|
|
continue
|
|
|
|
addr_keypath = comment.split(" addr=")[1]
|
|
addr = addr_keypath.split(" ")[0]
|
|
keypath = None
|
|
if keytype == "inactivehdseed=1":
|
|
# ensure the old master is still available
|
|
assert (hd_master_addr_old == addr)
|
|
elif keytype == "hdseed=1":
|
|
# ensure we have generated a new hd master key
|
|
assert (hd_master_addr_old != addr)
|
|
hd_master_addr_ret = addr
|
|
elif keytype == "script=1":
|
|
# scripts don't have keypaths
|
|
keypath = None
|
|
else:
|
|
keypath = addr_keypath.rstrip().split("hdkeypath=")[1]
|
|
|
|
# count key types
|
|
for addrObj in addrs:
|
|
if addrObj['address'] == addr and addrObj['hdkeypath'] == keypath and keytype == "label=":
|
|
found_addr += 1
|
|
break
|
|
elif keytype == "change=1":
|
|
found_addr_chg += 1
|
|
break
|
|
elif keytype == "reserve=1":
|
|
found_addr_rsv += 1
|
|
break
|
|
|
|
# count scripts
|
|
for script_addr in script_addrs:
|
|
if script_addr == addr.rstrip() and keytype == "script=1":
|
|
found_script_addr += 1
|
|
break
|
|
|
|
return found_addr, found_script_addr, found_addr_chg, found_addr_rsv, hd_master_addr_ret
|
|
|
|
|
|
class WalletDumpTest(BitcoinTestFramework):
|
|
def set_test_params(self):
|
|
self.setup_clean_chain = True
|
|
self.num_nodes = 1
|
|
self.extra_args = [["-keypool=90", "-usehd=1"]]
|
|
self.rpc_timeout = 120
|
|
|
|
def setup_network(self):
|
|
# TODO remove this when usehd=1 becomes the default
|
|
# use our own cache and -usehd=1 as extra arg as the default cache is run with -usehd=0
|
|
self.options.tmpdir = os.path.join(self.options.tmpdir, 'hd')
|
|
self.options.cachedir = os.path.join(self.options.cachedir, 'hd')
|
|
self._initialize_chain(extra_args=self.extra_args[0])
|
|
self.set_cache_mocktime()
|
|
self.add_nodes(self.num_nodes, extra_args=self.extra_args)
|
|
self.start_nodes()
|
|
|
|
def run_test(self):
|
|
wallet_unenc_dump = os.path.join(self.nodes[0].datadir, "wallet.unencrypted.dump")
|
|
wallet_enc_dump = os.path.join(self.nodes[0].datadir, "wallet.encrypted.dump")
|
|
|
|
# generate 20 addresses to compare against the dump
|
|
test_addr_count = 20
|
|
addrs = []
|
|
for i in range(0,test_addr_count):
|
|
addr = self.nodes[0].getnewaddress()
|
|
vaddr= self.nodes[0].getaddressinfo(addr) #required to get hd keypath
|
|
addrs.append(vaddr)
|
|
# Should be a no-op:
|
|
self.nodes[0].keypoolrefill()
|
|
|
|
# Test scripts dump by adding a 1-of-1 multisig address
|
|
multisig_addr = self.nodes[0].addmultisigaddress(1, [addrs[1]["address"]])["address"]
|
|
script_addrs = [multisig_addr]
|
|
|
|
# dump unencrypted wallet
|
|
result = self.nodes[0].dumpwallet(wallet_unenc_dump)
|
|
assert_equal(result['filename'], wallet_unenc_dump)
|
|
|
|
found_addr, found_script_addr, found_addr_chg, found_addr_rsv, hd_master_addr_unenc = \
|
|
read_dump(wallet_unenc_dump, addrs, script_addrs, None)
|
|
assert_equal(found_addr, test_addr_count) # all keys must be in the dump
|
|
# This is 1, not 2 because we aren't testing for witness scripts
|
|
assert_equal(found_script_addr, 1) # all scripts must be in the dump
|
|
assert_equal(found_addr_chg, 0) # 0 blocks where mined
|
|
assert_equal(found_addr_rsv, 180) # keypool size (external+internal)
|
|
|
|
#encrypt wallet, restart, unlock and dump
|
|
self.nodes[0].encryptwallet('test')
|
|
self.nodes[0].walletpassphrase('test', 30)
|
|
# Should be a no-op:
|
|
self.nodes[0].keypoolrefill()
|
|
self.nodes[0].dumpwallet(wallet_enc_dump)
|
|
|
|
found_addr, found_script_addr, found_addr_chg, found_addr_rsv, _ = \
|
|
read_dump(wallet_enc_dump, addrs, script_addrs, hd_master_addr_unenc)
|
|
assert_equal(found_addr, test_addr_count)
|
|
# This is 1, not 2 because we aren't testing for witness scripts
|
|
assert_equal(found_script_addr, 1)
|
|
# TODO clarify if we want the behavior that is tested below in Dash (only when HD seed was generated and not user-provided)
|
|
# assert_equal(found_addr_chg, 180 + 50) # old reserve keys are marked as change now
|
|
assert_equal(found_addr_rsv, 180) # keypool size
|
|
|
|
# Overwriting should fail
|
|
assert_raises_rpc_error(-8, "already exists", lambda: self.nodes[0].dumpwallet(wallet_enc_dump))
|
|
|
|
# Restart node with new wallet, and test importwallet
|
|
self.stop_node(0)
|
|
self.start_node(0, ['-wallet=w2'])
|
|
|
|
# Make sure the address is not IsMine before import
|
|
result = self.nodes[0].getaddressinfo(multisig_addr)
|
|
assert(result['ismine'] == False)
|
|
|
|
self.nodes[0].importwallet(wallet_unenc_dump)
|
|
|
|
# Now check IsMine is true
|
|
result = self.nodes[0].getaddressinfo(multisig_addr)
|
|
assert(result['ismine'] == True)
|
|
|
|
if __name__ == '__main__':
|
|
WalletDumpTest().main()
|