mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-10 14:48:46 +02:00
Merge bitcoin/bitcoin#30141: kernel: De-globalize validation caches
606a7ab862kernel: De-globalize signature cache (TheCharlatan)66d74bfc45Expose CSignatureCache class in header (TheCharlatan)021d38822ckernel: De-globalize script execution cache hasher (TheCharlatan)13a3661abakernel: De-globalize script execution cache (TheCharlatan)ab14d1d6a4validation: Don't error if maxsigcachesize exceeds uint32::max (TheCharlatan) Pull request description: The validation caches are currently setup independently from where the rest of the validation code is initialized. This makes their ownership semantics unclear. There is also no clear enforcement on when and in what order they need to be initialized. The caches are always initialized in the `BasicTestingSetup` although a number of tests don't actually need them. Solve this by moving the caches from global scope into the `ChainstateManager` class. This simplifies the usage of the kernel library by no longer requiring manual setup of the caches prior to using the `ChainstateManager`. Tests that need to access the caches can instantiate them independently. --- This pull request is part of the [libbitcoinkernel project](https://github.com/bitcoin/bitcoin/issues/27587). ACKs for top commit: stickies-v: re-ACK606a7ab862glozow: reACK606a7abryanofsky: Code review ACK606a7ab862. Just small formatting, include, and static_assert changes since last review. Tree-SHA512: e7f3ee41406e3b233832bb67dc3a63c4203b5367e5daeed383df9cb590f227fcc62eae31311029c077d5e81b273a37a88a364db3dee2efe91bb3b9c9ddc8a42e
This commit is contained in:
@@ -10,9 +10,10 @@
|
||||
#include <attributes.h>
|
||||
#include <chain.h>
|
||||
#include <checkqueue.h>
|
||||
#include <kernel/chain.h>
|
||||
#include <consensus/amount.h>
|
||||
#include <cuckoocache.h>
|
||||
#include <deploymentstatus.h>
|
||||
#include <kernel/chain.h>
|
||||
#include <kernel/chainparams.h>
|
||||
#include <kernel/chainstatemanager_opts.h>
|
||||
#include <kernel/cs_main.h> // IWYU pragma: export
|
||||
@@ -21,6 +22,7 @@
|
||||
#include <policy/packages.h>
|
||||
#include <policy/policy.h>
|
||||
#include <script/script_error.h>
|
||||
#include <script/sigcache.h>
|
||||
#include <sync.h>
|
||||
#include <txdb.h>
|
||||
#include <txmempool.h> // For CTxMemPool::cs
|
||||
@@ -340,10 +342,11 @@ private:
|
||||
bool cacheStore;
|
||||
ScriptError error{SCRIPT_ERR_UNKNOWN_ERROR};
|
||||
PrecomputedTransactionData *txdata;
|
||||
SignatureCache* m_signature_cache;
|
||||
|
||||
public:
|
||||
CScriptCheck(const CTxOut& outIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* txdataIn) :
|
||||
m_tx_out(outIn), ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), txdata(txdataIn) { }
|
||||
CScriptCheck(const CTxOut& outIn, const CTransaction& txToIn, SignatureCache& signature_cache, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn, PrecomputedTransactionData* txdataIn) :
|
||||
m_tx_out(outIn), ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), txdata(txdataIn), m_signature_cache(&signature_cache) { }
|
||||
|
||||
CScriptCheck(const CScriptCheck&) = delete;
|
||||
CScriptCheck& operator=(const CScriptCheck&) = delete;
|
||||
@@ -360,8 +363,28 @@ static_assert(std::is_nothrow_move_assignable_v<CScriptCheck>);
|
||||
static_assert(std::is_nothrow_move_constructible_v<CScriptCheck>);
|
||||
static_assert(std::is_nothrow_destructible_v<CScriptCheck>);
|
||||
|
||||
/** Initializes the script-execution cache */
|
||||
[[nodiscard]] bool InitScriptExecutionCache(size_t max_size_bytes);
|
||||
/**
|
||||
* Convenience class for initializing and passing the script execution cache
|
||||
* and signature cache.
|
||||
*/
|
||||
class ValidationCache
|
||||
{
|
||||
private:
|
||||
//! Pre-initialized hasher to avoid having to recreate it for every hash calculation.
|
||||
CSHA256 m_script_execution_cache_hasher;
|
||||
|
||||
public:
|
||||
CuckooCache::cache<uint256, SignatureCacheHasher> m_script_execution_cache;
|
||||
SignatureCache m_signature_cache;
|
||||
|
||||
ValidationCache(size_t script_execution_cache_bytes, size_t signature_cache_bytes);
|
||||
|
||||
ValidationCache(const ValidationCache&) = delete;
|
||||
ValidationCache& operator=(const ValidationCache&) = delete;
|
||||
|
||||
//! Return a copy of the pre-initialized hasher.
|
||||
CSHA256 ScriptExecutionCacheHasher() const { return m_script_execution_cache_hasher; }
|
||||
};
|
||||
|
||||
/** Functions for validating blocks and updating the block tree */
|
||||
|
||||
@@ -796,7 +819,6 @@ private:
|
||||
friend ChainstateManager;
|
||||
};
|
||||
|
||||
|
||||
enum class SnapshotCompletionResult {
|
||||
SUCCESS,
|
||||
SKIPPED,
|
||||
@@ -970,6 +992,8 @@ public:
|
||||
//! chainstate to avoid duplicating block metadata.
|
||||
node::BlockManager m_blockman;
|
||||
|
||||
ValidationCache m_validation_cache;
|
||||
|
||||
/**
|
||||
* Whether initial block download has ended and IsInitialBlockDownload
|
||||
* should return false from now on.
|
||||
|
||||
Reference in New Issue
Block a user