mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 06:28:31 +01:00
Merge bitcoin/bitcoin#21526: validation: UpdateTip/CheckBlockIndex assumeutxo support
673a5bd337test: validation: add unittest for UpdateTip behavior (James O'Beirne)2705570109test: refactor: separate CreateBlock in TestChain100Setup (James O'Beirne)298bf5d563test: refactor: declare NoMalleation const auto (James O'Beirne)071200993fmove-only: unittest: add test/util/chainstate.h (James O'Beirne)8f5710fd0avalidation: fix CheckBlockIndex for multiple chainstates (James O'Beirne)5a807736davalidation: insert assumed-valid block index entries into candidates (James O'Beirne)01a9b8fe71validation: set BLOCK_ASSUMED_VALID during snapshot load (James O'Beirne)42b2520db9chain: add BLOCK_ASSUMED_VALID for use with assumeutxo (James O'Beirne)b217020df7validation: change UpdateTip for multiple chainstates (James O'Beirne)665072a36ddoc: add comment for g_best_block (James O'Beirne)ac4051d891refactor: remove unused assumeutxo methods (James O'Beirne)9f6bb53935validation: add chainman ref to CChainState (James O'Beirne) Pull request description: This is part of the [assumeutxo project](https://github.com/bitcoin/bitcoin/projects/11) (parent PR: #15606) --- Modify UpdateTip and CheckBlockIndex for use with multiple chainstates. Includes a new unittest verifying `g_best_block` behavior (previously untested at the unit level) and various changes necessary for running and testing `ProcessNewBlock()`-like behavior on the background validation chainstate. This changeset introduces a new block index `nStatus` flag called `BLOCK_ASSUMED_VALID`, and it is applied to block index entries that are beneath the UTXO snapshot base block upon snapshot load. Once each block is validated (during async background validation), the flag is removed. This allows us to avoid (ab)using `BLOCK_VALID_*` flags for snapshot chain block entries, and preserves the original meaning of those flags. Note: this PR previously incorporated changes to `LoadBlockIndex()` and `RewindBlockIndex()` as noted in Russ' comments below, but once I generated the changes necessary to test the UpdateTip change, I decided to split this changes out into another PR due to the size of this one. ACKs for top commit: achow101: ACK673a5bd337jonatack: Code-review re-ACK673a5bd337reviewed diff, rebased to master/debug build/ran unit+functional tests naumenkogs: ACK673a5bd337fjahr: Code review ACK673a5bd337ariard: utACK673a5bd3ryanofsky: Code review ACK673a5bd337. Just linker fix and split commit changes mentioned https://github.com/bitcoin/bitcoin/pull/21526#issuecomment-921064563 since last review benthecarman: ACK673a5bd337Tree-SHA512: 0a6dc23d041b27ed9fd0ee1f3e5971b92fb1d2df2fc9b655d5dc48594235321ab1798d06de2ec55482ac3966a9ed56de8d56e9e29cae75bbe8690bafc2dda383
This commit is contained in:
@@ -100,6 +100,7 @@ extern RecursiveMutex cs_main;
|
||||
typedef std::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
|
||||
extern Mutex g_best_block_mutex;
|
||||
extern std::condition_variable g_best_block_cv;
|
||||
/** Used to notify getblocktemplate RPC of new tips. */
|
||||
extern uint256 g_best_block;
|
||||
/** Whether there are dedicated script-checking threads running.
|
||||
* False indicates all script checking is done on the main threadMessageHandler thread.
|
||||
@@ -584,9 +585,15 @@ public:
|
||||
//! CChainState instances.
|
||||
BlockManager& m_blockman;
|
||||
|
||||
//! The chainstate manager that owns this chainstate. The reference is
|
||||
//! necessary so that this instance can check whether it is the active
|
||||
//! chainstate within deeply nested method calls.
|
||||
ChainstateManager& m_chainman;
|
||||
|
||||
explicit CChainState(
|
||||
CTxMemPool* mempool,
|
||||
BlockManager& blockman,
|
||||
ChainstateManager& chainman,
|
||||
std::optional<uint256> from_snapshot_blockhash = std::nullopt);
|
||||
|
||||
/**
|
||||
@@ -623,9 +630,10 @@ public:
|
||||
const std::optional<uint256> m_from_snapshot_blockhash;
|
||||
|
||||
/**
|
||||
* The set of all CBlockIndex entries with BLOCK_VALID_TRANSACTIONS (for itself and all ancestors) and
|
||||
* as good as our current tip or better. Entries may be failed, though, and pruning nodes may be
|
||||
* missing the data for the block.
|
||||
* The set of all CBlockIndex entries with either BLOCK_VALID_TRANSACTIONS (for
|
||||
* itself and all ancestors) *or* BLOCK_ASSUMED_VALID (if using background
|
||||
* chainstates) and as good as our current tip or better. Entries may be failed,
|
||||
* though, and pruning nodes may be missing the data for the block.
|
||||
*/
|
||||
std::set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexCandidates;
|
||||
|
||||
@@ -837,12 +845,6 @@ private:
|
||||
* *Background IBD chainstate*: an IBD chainstate for which the
|
||||
* IBD process is happening in the background while use of the
|
||||
* active (snapshot) chainstate allows the rest of the system to function.
|
||||
*
|
||||
* *Validated chainstate*: the most-work chainstate which has been validated
|
||||
* locally via initial block download. This will be the snapshot chainstate
|
||||
* if a snapshot was loaded and all blocks up to the snapshot starting point
|
||||
* have been downloaded and validated (via background validation), otherwise
|
||||
* it will be the IBD chainstate.
|
||||
*/
|
||||
class ChainstateManager
|
||||
{
|
||||
@@ -961,19 +963,6 @@ public:
|
||||
//! Is there a snapshot in use and has it been fully validated?
|
||||
bool IsSnapshotValidated() const { return m_snapshot_validated; }
|
||||
|
||||
//! @returns true if this chainstate is being used to validate an active
|
||||
//! snapshot in the background.
|
||||
bool IsBackgroundIBD(CChainState* chainstate) const;
|
||||
|
||||
//! Return the most-work chainstate that has been fully validated.
|
||||
//!
|
||||
//! During background validation of a snapshot, this is the IBD chain. After
|
||||
//! background validation has completed, this is the snapshot chain.
|
||||
CChainState& ValidatedChainstate() const;
|
||||
|
||||
CChain& ValidatedChain() const { return ValidatedChainstate().m_chain; }
|
||||
CBlockIndex* ValidatedTip() const { return ValidatedChain().Tip(); }
|
||||
|
||||
/**
|
||||
* Process an incoming block. This only returns after the best known valid
|
||||
* block is made active. Note that it does not, however, guarantee that the
|
||||
|
||||
Reference in New Issue
Block a user