diff options
author | Seibart Nedor <rodentrabies@protonmail.com> | 2020-04-06 23:24:16 +0300 |
---|---|---|
committer | Seibart Nedor <rodentrabies@protonmail.com> | 2022-02-16 15:02:26 +0200 |
commit | 968765973b5bfde1ee4ad2fb5c19e24bce63ad0e (patch) | |
tree | 985f9bcca8179014b0ed0e75749e6dc4e2c29368 /src/wallet/wallet.cpp | |
parent | 7164e00e1bc4e30e69b38a7ba9c557d4fc5d5f87 (diff) |
wallet: ensure wallet files are not reused across chains
Diffstat (limited to 'src/wallet/wallet.cpp')
-rw-r--r-- | src/wallet/wallet.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 7e694d1987..ec67c235d9 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2918,6 +2918,20 @@ bool CWallet::AttachChain(const std::shared_ptr<CWallet>& walletInstance, interf assert(!walletInstance->m_chain || walletInstance->m_chain == &chain); walletInstance->m_chain = &chain; + // Unless allowed, ensure wallet files are not reused across chains: + if (!gArgs.GetBoolArg("-walletcrosschain", DEFAULT_WALLETCROSSCHAIN)) { + WalletBatch batch(walletInstance->GetDatabase()); + CBlockLocator locator; + if (batch.ReadBestBlock(locator) && locator.vHave.size() > 0 && chain.getHeight()) { + // Wallet is assumed to be from another chain, if genesis block in the active + // chain differs from the genesis block known to the wallet. + if (chain.getBlockHash(0) != locator.vHave.back()) { + error = Untranslated("Wallet files should not be reused across chains. Restart bitcoind with -walletcrosschain to override."); + return false; + } + } + } + // Register wallet with validationinterface. It's done before rescan to avoid // missing block connections between end of rescan and validation subscribing. // Because of wallet lock being hold, block connection notifications are going to |