bitcoin/src
Wladimir J. van der Laan c48e788246
Merge #18836: wallet: upgradewallet fixes and additional tests
5f9c0b6360 wallet: Remove -upgradewallet from dummywallet (MarcoFalke)
a314271f08 test: Remove unused wallet.dat (MarcoFalke)
bf7635963c tests: Test specific upgradewallet scenarios and that upgrades work (Andrew Chow)
4b418a9dec test: Add test_framework/bdb.py module for inspecting bdb files (Andrew Chow)
092fc43485 tests: Add a sha256sum_file function to util (Andrew Chow)
0bd995aa19 wallet: upgrade the CHDChain version number when upgrading to split hd (Andrew Chow)
8e32e1c41c wallet: remove nWalletMaxVersion (Andrew Chow)
bd7398cc62 wallet: have ScriptPubKeyMan::Upgrade check against the new version (Andrew Chow)
5f720544f3 wallet: Add GetClosestWalletFeature function (Andrew Chow)
842ae3842d wallet: Add utility method for CanSupportFeature (Andrew Chow)

Pull request description:

  This PR cleans up the wallet upgrade mechanism a bit, fixes some probably bugs, and adds more test cases.

  The `nWalletMaxVersion` member variable has been removed as it made `CanSupportFeature` unintuitive and was causing a couple of bugs. The reason this was introduced originally was to allow a wallet upgrade to only occur when the new feature is first used. While this makes sense for the old `-upgradewallet` option, for an RPC, this does not quite make sense. It's more intuitive for an upgrade to occur if possible if the `upgradewallet` RPC is used as that's an explicit request to upgrade a particular wallet to a newer version. `nWalletMaxVersion` was only relevant for upgrades to `FEATURE_WALLETCRYPT` and `FEATURE_COMPRPUBKEY` both of which are incredibly old features. So for such wallets, the behavior of `upgradewallet` will be that the feature is enabled immediately without the wallet needing to be encrypted at that time (note that `FEATURE_WALLETCRYPT` indicates support for encryption, not that the wallet is encrypted) or for a new key to be generated.

  `CanSupportFeature` would previously indicate whether we could upgrade to `nWalletMaxVersion` not just whether the current wallet version supported a feature. While this property was being used to determine whether we should upgrade to HD and HD chain split, it was also causing a few bugs. Determining whether we should upgrade to HD or HD chain split is resolved by passing into `ScriptPubKeyMan::Upgrade` the version we are upgrading to and checking against that. By removing `nWalletMaxVersion` we also fix a bug where you could upgrade to HD chain split without the pre-split keypool.

  `nWalletMaxVersion` was also the version that was being reported by `getwalletinfo` which meant that the version reported was not always consistent across restarts as it depended on whether `upgradewallet` was used. Additionally to make the wallet versions consistent with actually supported versions, instead of just setting the wallet version to whatever is given to `upgradewallet`, we normalize the version number to the closest supported version number. For example, if given 150000, we would store and report 139900.

  Another bug where CHDChain was not being upgraded to the version supporting HD chain split is also fixed by this PR.

  Lastly several more tests have been added. Some refactoring to the test was made to make these tests easier. These tests check specific upgrading scenarios, such as from non-HD (version 60000) to HD to pre-split keypool. Although not specifically related to `upgradewallet`, `UpgradeKeyMetadata` is now being tested too.

  Part of the new tests is checking that the wallet files are identical before and after failed upgrades. To facilitate this, a utility function `sha256sum_file` has been added. Another part of the tests is to examine the wallet file itself to ensure that the records in the wallet.dat file have been correctly modified. So a new `bdb.py` module has been added to deserialize the BDB db of the wallet.dat file. This format isn't explicitly documented anywhere, but the code and comments in BDB's source code in file `dbinc/db_page.h` describe it. This module just dumps all of the fields into a dict.

ACKs for top commit:
  MarcoFalke:
    approach ACK 5f9c0b6360
  laanwj:
    Code review ACK 5f9c0b6360
  jonatack:
    ACK 5f9c0b6360, approach seems fine, code review, only skimmed the test changes but they look well done, rebased on current master, debug built and verified the `wallet_upgradewallet.py` test runs green both before and after running `test/get_previous_releases.py -b v0.19.1 v0.18.1 v0.17.2 v0.16.3 v0.15.2`

Tree-SHA512: 7c4ebf420850d596a586cb6dd7f2ef39c6477847d12d105fcd362abb07f2a8aa4f7afc5bfd36cbc8b8c72fcdd1de8d2d3f16ad8e8ba736b6f4f31f133fe5feba
2020-11-16 11:03:25 +01:00
..
bench Only relay Taproot spends if next block has it active 2020-10-30 15:52:19 -07:00
compat net: Use C++11 member initialization in protocol 2020-05-20 08:27:07 -04:00
config
consensus doc: Move assumed-values doxygen comments to header 2020-10-15 11:28:13 +02:00
crc32c Import crc32c using subtree merge as as 'src/crc32c' 2020-01-28 17:00:01 +01:00
crypto Merge #19845: net: CNetAddr: add support to (un)serialize as ADDRv2 2020-09-28 12:27:08 -07:00
index Merge #19733: Move comment about BaseIndex::DB from TxIndex::DB 2020-08-21 12:48:46 +08:00
interfaces [send] Make send RPCs return fee reason 2020-09-26 17:57:26 -07:00
leveldb Update to leveldb upstream using subtree merge 2020-01-28 16:59:07 +01:00
logging Remove use of non-standard zero variadic macros 2020-04-30 18:02:04 +08:00
node style and nits for fee-checking in BroadcastTransaction 2020-10-08 14:11:16 -07:00
policy Only relay Taproot spends if next block has it active 2020-10-30 15:52:19 -07:00
primitives Report and verify expirations 2020-10-12 12:14:53 -07:00
qt Merge bitcoin-core/gui#120: Fix multiwallet transaction notifications 2020-11-12 12:23:55 +01:00
rpc Merge #20120: net, rpc, test, bugfix: update GetNetworkName, GetNetworksInfo, regression tests 2020-11-09 17:07:23 +01:00
script script: Make ComputeEntrySchnorr and ComputeEntryECDSA const to clarify contract 2020-10-16 06:26:46 +00:00
secp256k1 Update secp256k1 subtree to latest master 2020-10-27 23:08:48 -07:00
support Move Win32 defines to configure.ac to ensure they are globally defined 2020-08-20 17:55:06 +00:00
test Merge #20033: refactor: minor whitespace fixups, s/const/constexpr/ and remove template (followup to #19845) 2020-11-16 07:57:34 +01:00
univalue Update univalue subtree 2020-02-09 07:44:29 -08:00
util Merge #20080: Strip any trailing / in -datadir and -blocksdir paths 2020-11-02 11:41:38 +13:00
wallet Merge #18836: wallet: upgradewallet fixes and additional tests 2020-11-16 11:03:25 +01:00
zmq zmq: Append address to notify log output 2020-10-01 00:33:38 +02:00
.clang-format tools: clang-format 6 compatibility 2020-07-06 03:52:37 +02:00
addrdb.cpp p2p: Add ReadAnchors() 2020-10-09 14:29:04 +03:00
addrdb.h p2p: Add ReadAnchors() 2020-10-09 14:29:04 +03:00
addrman.cpp [addrman] Specify max addresses and pct when calling GetAddresses() 2020-08-12 09:22:07 +01:00
addrman.h addrman: ensure old versions don't parse peers.dat 2020-11-11 16:05:15 +01:00
amount.h Update copyright headers to 2018 2018-12-29 10:15:01 +01:00
arith_uint256.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
arith_uint256.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
attributes.h
banman.cpp Ignore incorrectly-serialized banlist.dat entries 2020-10-12 15:35:08 -07:00
banman.h Clean up separated ban/discourage interface 2020-07-03 20:43:55 -07:00
base58.cpp Merge #19739: refactor: remove c-string interfaces for DecodeBase58{Check} 2020-08-28 16:50:57 +02:00
base58.h Merge #19739: refactor: remove c-string interfaces for DecodeBase58{Check} 2020-08-28 16:50:57 +02:00
bech32.cpp Add some general std::vector utility functions 2019-10-16 08:56:57 -07:00
bech32.h Assert that the HRP is lowercase in Bech32::Encode 2019-09-05 13:25:11 +12:00
bitcoin-cli-res.rc
bitcoin-cli.cpp cli -netinfo: print oversized/extreme ping times as "-" 2020-10-25 16:51:21 +01:00
bitcoin-tx-res.rc
bitcoin-tx.cpp scripted diff: Improve invalid vout value rpc error message 2020-09-30 20:43:05 +03:30
bitcoin-wallet-res.rc [tools] Add wallet inspection and modification tool 2019-01-30 16:26:52 -05:00
bitcoin-wallet.cpp doc: Document that wallet salvage is experimental 2020-10-30 13:53:28 +01:00
bitcoind-res.rc
bitcoind.cpp doc: Update comments for new chain settings (-signet and -chain=signet) 2020-09-22 22:32:25 +02:00
blockencodings.cpp Get rid of -Wthread-safety-precise warnings 2020-05-28 09:55:39 +03:00
blockencodings.h Get rid of -Wthread-safety-precise warnings 2020-05-28 09:55:39 +03:00
blockfilter.cpp Make CHash256/CHash160 output to Span 2020-07-30 13:57:54 -07:00
blockfilter.h [indexes] Fix default [de]serialization of BlockFilter. 2020-05-26 17:27:15 -04:00
bloom.cpp scripted-diff: TxoutType C++11 scoped enum class 2020-06-21 06:41:55 -04:00
bloom.h Merge #18317: Serialization improvements step 6 (all except wallet/gui) 2020-05-20 07:30:29 -04:00
chain.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
chain.h chain: Remove UB CChain comparison 2020-08-27 20:07:27 -04:00
chainparams.cpp Merge #20238: doc: Missing comments for signet parameters 2020-11-16 10:40:56 +01:00
chainparams.h Remove gArgs global from CreateChainParams to aid testing 2020-09-29 10:20:05 +02:00
chainparamsbase.cpp net: Add alternative port for onion service 2020-09-29 09:59:51 +03:00
chainparamsbase.h net, refactor: Refactor CBaseChainParams::RPCPort function 2020-09-29 09:59:52 +03:00
chainparamsseeds.h net: Hardcoded seeds update for 0.21 2020-10-25 14:25:00 +01:00
checkqueue.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
clientversion.cpp Drop unused GIT_COMMIT_DATE macro 2020-05-04 19:53:58 +03:00
clientversion.h
coins.cpp Add CChainState::ResizeCoinsCaches 2020-07-01 14:44:28 -04:00
coins.h Add CChainState::ResizeCoinsCaches 2020-07-01 14:44:28 -04:00
compat.h Move Win32 defines to configure.ac to ensure they are globally defined 2020-08-20 17:55:06 +00:00
compressor.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
compressor.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
core_io.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
core_memusage.h
core_read.cpp Merge #17775: DecodeHexTx: Try case where txn has inputs first 2020-10-15 10:55:44 +02:00
core_write.cpp refactor: Avoid duplicate map lookup in ScriptToAsmStr 2020-09-04 10:25:44 +01:00
cuckoocache.h tests: Add fuzzing harness for classes/functions in cuckoocache.h 2020-04-08 14:45:27 +00:00
dbwrapper.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
dbwrapper.h Drop unused CDBWrapper methods 2020-07-08 14:26:14 +03:00
dummywallet.cpp wallet: Remove -upgradewallet from dummywallet 2020-11-04 12:16:57 -05:00
flatfile.cpp Style cleanup. 2019-02-22 17:38:45 -08:00
flatfile.h Merge #18317: Serialization improvements step 6 (all except wallet/gui) 2020-05-20 07:30:29 -04:00
fs.cpp Add missing includes to fix compile errors 2020-06-16 15:15:46 -04:00
fs.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
hash.cpp Add TaggedHash function (BIP 340) 2020-10-12 02:06:32 -07:00
hash.h Add TaggedHash function (BIP 340) 2020-10-12 02:06:32 -07:00
httprpc.cpp Merge #18740: Remove g_rpc_node global 2020-05-21 06:53:39 -04:00
httprpc.h refactor: Pass NodeContext to RPC and REST methods through util::Ref 2020-05-13 16:20:13 -04:00
httpserver.cpp scripted-diff: Move ui_interface to the node lib 2020-06-27 11:49:28 -04:00
httpserver.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
indirectmap.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
init.cpp Remove references to CreateWalletFromFile 2020-11-12 13:12:29 +08:00
init.h refactor: Create interfaces earlier during initialization 2020-08-27 14:33:00 -04:00
key_io.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
key_io.h
key.cpp tests: Add fuzzing harness for ec_seckey_import_der(...) and ec_seckey_export_der(...) 2020-08-18 18:03:57 +00:00
key.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
logging.cpp log: remove deprecated db log category 2020-06-07 17:03:49 +02:00
logging.h refactor: Rename LockGuard to StdLockGuard for consistency with StdMutex 2020-05-28 09:54:24 +03:00
Makefile.am Make sqlite support optional (compile-time) 2020-10-20 13:44:43 +00:00
Makefile.bench.include Add libsqlite3 2020-10-14 11:18:12 -04:00
Makefile.crc32c.include build: CRC32C build system integration 2020-01-28 17:01:48 +01:00
Makefile.leveldb.include build: Enable -Wsuggest-override 2020-05-12 18:03:39 +03:00
Makefile.qt_locale.include qt: Pre-splitoff translations update 2020-10-27 19:40:44 +01:00
Makefile.qt.include Add libsqlite3 2020-10-14 11:18:12 -04:00
Makefile.qttest.include Add libsqlite3 2020-10-14 11:18:12 -04:00
Makefile.test_fuzz.include build: create test_fuzz library from src/test/fuzz/fuzz.cpp 2020-04-05 01:01:13 +02:00
Makefile.test_util.include test: Mock IBD in net_processing fuzzers 2020-11-07 07:50:59 +01:00
Makefile.test.include tests: Add fuzzing harness for CAddrMan 2020-11-12 14:23:17 +00:00
memusage.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
merkleblock.cpp Make Hash[160] consume range-like objects 2020-07-30 13:57:54 -07:00
merkleblock.h Convert merkleblock to new serialization 2020-03-30 16:09:51 -07:00
miner.cpp refactor: Remove unused BlockAssembler::pblock member var 2020-06-15 08:08:19 -04:00
miner.h Remove mapLinks in favor of entry inlined structs with iterator type erasure 2020-09-04 09:46:44 -07:00
net_permissions.cpp Reduce MAX_PEER_TX_ANNOUNCEMENTS for non-PF_RELAY peers 2020-10-12 12:14:53 -07:00
net_permissions.h Reduce MAX_PEER_TX_ANNOUNCEMENTS for non-PF_RELAY peers 2020-10-12 12:14:53 -07:00
net_processing.cpp Merge #20212: net: fix output of peer address in version message 2020-11-04 13:41:52 +01:00
net_processing.h Avoid calling CAddrMan::Connected() on block-relay-only peer addresses 2020-10-27 11:14:58 -04:00
net_types.h refactor: Remove addrdb.h dependency from node.h 2019-10-29 11:30:12 +02:00
net.cpp Make it easier to reason about node eviction by removing unused NodeEvictionCandidate::addr (CAddress) 2020-11-04 12:22:06 +00:00
net.h Refactor test for existing peer connection into own function 2020-10-27 11:15:21 -04:00
netaddress.cpp Merge #20140: Restore compatibility with old CSubNet serialization 2020-10-15 11:44:36 +02:00
netaddress.h Merge #20033: refactor: minor whitespace fixups, s/const/constexpr/ and remove template (followup to #19845) 2020-11-16 07:57:34 +01:00
netbase.cpp net: update GetNetworkName() with all enum Network cases 2020-10-15 19:21:38 +02:00
netbase.h net: Avoid using C-style NUL-terminated strings as arguments in the netbase interface 2020-01-08 12:35:59 +00:00
netmessagemaker.h refactor: s/command/msg_type/ in CNetMsgMaker and CSerializedNetMsg 2020-05-11 00:20:57 +02:00
noui.cpp scripted-diff: Move ui_interface to the node lib 2020-06-27 11:49:28 -04:00
noui.h Make ThreadSafe{MessageBox|Question} bilingual 2020-05-05 04:45:59 +03:00
optional.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
outputtype.cpp Enable Wswitch for OutputType 2020-07-01 18:03:12 -04:00
outputtype.h Remove confusing OutputType::CHANGE_AUTO 2020-07-01 18:02:38 -04:00
pow.cpp
pow.h
prevector.h prevector: Avoid unnamed struct, which is a GNU extension 2020-04-30 18:02:03 +08:00
protocol.cpp net: advertise support for ADDRv2 via new message 2020-10-09 16:42:50 +02:00
protocol.h net: advertise support for ADDRv2 via new message 2020-10-09 16:42:50 +02:00
psbt.cpp psbt: always put a non_witness_utxo and don't remove it 2020-06-24 16:32:19 -04:00
psbt.h psbt: always put a non_witness_utxo and don't remove it 2020-06-24 16:32:19 -04:00
pubkey.cpp Implement Taproot validation (BIP 341) 2020-10-12 17:17:56 -07:00
pubkey.h Implement Taproot validation (BIP 341) 2020-10-12 17:17:56 -07:00
random.cpp Merge #17563: lib: fix a compiler warning: unused GetDevURandom() 2020-08-10 21:30:42 +08:00
random.h Add templated GetRandomDuration<> 2020-04-30 09:19:14 -04:00
randomenv.cpp random: fixes read buffer resizing in RandAddSeedPerfmon 2020-10-07 20:46:49 -04:00
randomenv.h [MOVEONLY] Move perfmon data gathering to new randomenv module 2019-11-12 14:50:44 -08:00
rest.cpp Merge #19849: Assert that RPCArg names are equal to CRPCCommand ones (blockchain,rawtransaction) 2020-09-22 17:08:08 +02:00
reverse_iterator.h
scheduler.cpp clang-format scheduler 2020-06-21 06:02:59 -04:00
scheduler.h clang-format scheduler 2020-06-21 06:02:59 -04:00
serialize.h Support bypassing range check in ReadCompactSize 2020-10-09 10:32:19 +02:00
shutdown.cpp
shutdown.h
signet.cpp refactor: Remove SignetTxs::m_valid and use optional instead 2020-09-22 22:31:31 +02:00
signet.h refactor: Remove SignetTxs::m_valid and use optional instead 2020-09-22 22:31:31 +02:00
span.h Add MakeUCharSpan, to help constructing Span<[const] unsigned char> 2020-07-30 13:57:09 -07:00
streams.h net: CAddress & CAddrMan: (un)serialize as ADDRv2 2020-10-09 16:42:49 +02:00
sync.cpp sync.h: Make runtime lock checks require compile-time lock checks 2020-08-29 20:46:47 +03:00
sync.h Remove unused LockAssertion struct 2020-09-19 18:02:42 +03:00
threadinterrupt.cpp
threadinterrupt.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
threadsafety.h Drop deprecated and unused GUARDED_VAR and PT_GUARDED_VAR annotations 2020-08-18 10:46:53 +03:00
timedata.cpp Avoid the use of abs64 in timedata 2020-10-12 19:50:16 -07:00
timedata.h
tinyformat.h util: Update tinyformat to upstream 2019-12-06 10:02:08 +01:00
torcontrol.cpp Merge #19954: Complete the BIP155 implementation and upgrade to TORv3 2020-10-11 08:51:57 +08:00
torcontrol.h net: Pass onion service target to Tor controller 2020-10-01 19:00:07 +03:00
txdb.cpp Merge #18637: coins: allow cache resize after init 2020-07-29 07:53:19 +02:00
txdb.h txdb: add CCoinsViewDB::ChangeCacheSize 2020-07-01 14:44:24 -04:00
txmempool.cpp Add 'sequence' zmq publisher to track all block (dis)connects, mempool deltas 2020-09-22 11:34:30 -04:00
txmempool.h Add 'sequence' zmq publisher to track all block (dis)connects, mempool deltas 2020-09-22 11:34:30 -04:00
txrequest.cpp p2p: declare Announcement::m_state as uint8_t, add getter/setter 2020-10-16 23:33:44 +02:00
txrequest.h Report and verify expirations 2020-10-12 12:14:53 -07:00
uint256.cpp Add txrequest module 2020-10-12 11:01:16 -07:00
uint256.h Add txrequest module 2020-10-12 11:01:16 -07:00
undo.h scripted-diff: Bump copyright headers 2020-04-16 13:33:09 -04:00
validation.cpp Avoid signed integer overflow when loading a mempool.dat file with a malformed time field 2020-11-11 14:45:16 +00:00
validation.h test: Mock IBD in net_processing fuzzers 2020-11-07 07:50:59 +01:00
validationinterface.cpp Add 'sequence' zmq publisher to track all block (dis)connects, mempool deltas 2020-09-22 11:34:30 -04:00
validationinterface.h Add 'sequence' zmq publisher to track all block (dis)connects, mempool deltas 2020-09-22 11:34:30 -04:00
version.h net: CNetAddr: add support to (un)serialize as ADDRv2 2020-09-17 22:17:17 +02:00
versionbits.cpp scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
versionbits.h scripted-diff: Bump copyright of files changed in 2019 2019-12-30 10:42:20 +13:00
versionbitsinfo.cpp Activate Taproot/Tapscript on regtest (BIP 341, BIP 342) 2020-10-12 17:18:47 -07:00
versionbitsinfo.h
walletinitinterface.h refactor: add unused ArgsManager to replace gArgs 2020-07-29 16:36:44 +07:00
warnings.cpp Make SetMiscWarning() accept bilingual_str argument 2020-06-10 15:01:20 +03:00
warnings.h Make SetMiscWarning() accept bilingual_str argument 2020-06-10 15:01:20 +03:00