mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-20 14:05:23 +01:00
wallet: avoid rescans if under the snapshot
Refuse to load a wallet if it requires a rescan lower than the height of an unvalidated snapshot we're running -- in more general terms, if we don't have data for the blocks.
This commit is contained in:
parent
d0bf9bb6a5
commit
817326a828
3 changed files with 22 additions and 3 deletions
|
@ -286,6 +286,9 @@ public:
|
|||
//! to be prepared to handle this by ignoring notifications about unknown
|
||||
//! removed transactions and already added new transactions.
|
||||
virtual void requestMempoolTransactions(Notifications& notifications) = 0;
|
||||
|
||||
//! Return true if an assumed-valid chain is in use.
|
||||
virtual bool hasAssumedValidChain() = 0;
|
||||
};
|
||||
|
||||
//! Interface to let node manage chain clients (wallets, or maybe tools for
|
||||
|
|
|
@ -723,6 +723,11 @@ public:
|
|||
notifications.transactionAddedToMempool(entry.GetSharedTx(), 0 /* mempool_sequence */);
|
||||
}
|
||||
}
|
||||
bool hasAssumedValidChain() override
|
||||
{
|
||||
return Assert(m_node.chainman)->IsSnapshotActive();
|
||||
}
|
||||
|
||||
NodeContext& m_node;
|
||||
};
|
||||
} // namespace
|
||||
|
|
|
@ -2903,20 +2903,31 @@ bool CWallet::AttachChain(const std::shared_ptr<CWallet>& walletInstance, interf
|
|||
|
||||
if (tip_height && *tip_height != rescan_height)
|
||||
{
|
||||
if (chain.havePruned()) {
|
||||
// Technically we could execute the code below in any case, but performing the
|
||||
// `while` loop below can make startup very slow, so only check blocks on disk
|
||||
// if necessary.
|
||||
if (chain.havePruned() || chain.hasAssumedValidChain()) {
|
||||
int block_height = *tip_height;
|
||||
while (block_height > 0 && chain.haveBlockOnDisk(block_height - 1) && rescan_height != block_height) {
|
||||
--block_height;
|
||||
}
|
||||
|
||||
if (rescan_height != block_height) {
|
||||
// We can't rescan beyond non-pruned blocks, stop and throw an error.
|
||||
// We can't rescan beyond blocks we don't have data for, stop and throw an error.
|
||||
// This might happen if a user uses an old wallet within a pruned node
|
||||
// or if they ran -disablewallet for a longer time, then decided to re-enable
|
||||
// Exit early and print an error.
|
||||
// It also may happen if an assumed-valid chain is in use and therefore not
|
||||
// all block data is available.
|
||||
// If a block is pruned after this check, we will load the wallet,
|
||||
// but fail the rescan with a generic error.
|
||||
error = _("Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)");
|
||||
|
||||
error = chain.hasAssumedValidChain() ?
|
||||
_(
|
||||
"Assumed-valid: last wallet synchronisation goes beyond "
|
||||
"available block data. You need to wait for the background "
|
||||
"validation chain to download more blocks.") :
|
||||
_("Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue