From fa2ac63c8e8af5c85bb38877fed9a532b9152703 Mon Sep 17 00:00:00 2001 From: Ava Chow <github@achow101.com> Date: Mon, 29 Apr 2024 15:54:38 -0400 Subject: [PATCH] wallet: Remove chainStateFlushed chainStateFlushed is no longer needed since the best block is updated after a block is scanned. Since the chainstate being flushed does not necessarily coincide with the wallet having processed said block, it does not entirely make sense for the wallet to be recording that block as its best block, and this can cause race conditions where some blocks are not processed. Thus, remove this notification. --- src/wallet/wallet.cpp | 16 ---------------- src/wallet/wallet.h | 2 -- 2 files changed, 18 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 69a0862de4ac7..54fa2d9855a90 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -648,15 +648,6 @@ bool CWallet::ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, return false; } -void CWallet::chainStateFlushed(ChainstateRole role, const CBlockLocator& loc) -{ - // Don't update the best block until the chain is attached so that in case of a shutdown, - // the rescan will be restarted at next startup. - if (m_attaching_chain || role == ChainstateRole::BACKGROUND) { - return; - } -} - void CWallet::SetBestBlock(int block_height, uint256 block_hash) { AssertLockHeld(cs_wallet); @@ -3285,11 +3276,6 @@ bool CWallet::AttachChain(const std::shared_ptr<CWallet>& walletInstance, interf // be pending on the validation-side until lock release. It's likely to have // block processing duplicata (if rescan block range overlaps with notification one) // but we guarantee at least than wallet state is correct after notifications delivery. - // However, chainStateFlushed notifications are ignored until the rescan is finished - // so that in case of a shutdown event, the rescan will be repeated at the next start. - // This is temporary until rescan and notifications delivery are unified under same - // interface. - walletInstance->m_attaching_chain = true; //ignores chainStateFlushed notifications walletInstance->m_chain_notifications_handler = walletInstance->chain().handleNotifications(walletInstance); const std::optional<int> tip_height = chain.getHeight(); @@ -3377,13 +3363,11 @@ bool CWallet::AttachChain(const std::shared_ptr<CWallet>& walletInstance, interf error = _("Failed to rescan the wallet during initialization"); return false; } - walletInstance->m_attaching_chain = false; // Set and update the best block record walletInstance->SetBestBlock(*scan_res.last_scanned_height, scan_res.last_scanned_block); } walletInstance->GetDatabase().IncrementUpdateCounter(); } - walletInstance->m_attaching_chain = false; return true; } diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index f36399d924793..b227871b12511 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -338,7 +338,6 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati std::atomic<bool> fAbortRescan{false}; std::atomic<bool> fScanningWallet{false}; // controlled by WalletRescanReserver - std::atomic<bool> m_attaching_chain{false}; std::atomic<bool> m_scanning_with_passphrase{false}; std::atomic<SteadyClock::time_point> m_scanning_start{SteadyClock::time_point{}}; std::atomic<double> m_scanning_progress{0}; @@ -812,7 +811,6 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati /** should probably be renamed to IsRelevantToMe */ bool IsFromMe(const CTransaction& tx) const; CAmount GetDebit(const CTransaction& tx, const isminefilter& filter) const; - void chainStateFlushed(ChainstateRole role, const CBlockLocator& loc) override; DBErrors LoadWallet();