|
|
|
@ -120,7 +120,6 @@ RecursiveMutex cs_main;
|
|
|
|
|
GlobalMutex g_best_block_mutex;
|
|
|
|
|
std::condition_variable g_best_block_cv;
|
|
|
|
|
uint256 g_best_block;
|
|
|
|
|
bool g_parallel_script_checks{false};
|
|
|
|
|
|
|
|
|
|
const CBlockIndex* Chainstate::FindForkInGlobalIndex(const CBlockLocator& locator) const
|
|
|
|
|
{
|
|
|
|
@ -1991,6 +1990,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
|
|
|
|
|
|
|
|
|
|
uint256 block_hash{block.GetHash()};
|
|
|
|
|
assert(*pindex->phashBlock == block_hash);
|
|
|
|
|
const bool parallel_script_checks{scriptcheckqueue.HasThreads()};
|
|
|
|
|
|
|
|
|
|
const auto time_start{SteadyClock::now()};
|
|
|
|
|
|
|
|
|
@ -2179,7 +2179,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
|
|
|
|
|
// in multiple threads). Preallocate the vector size so a new allocation
|
|
|
|
|
// doesn't invalidate pointers into the vector, and keep txsdata in scope
|
|
|
|
|
// for as long as `control`.
|
|
|
|
|
CCheckQueueControl<CScriptCheck> control(fScriptChecks && g_parallel_script_checks ? &scriptcheckqueue : nullptr);
|
|
|
|
|
CCheckQueueControl<CScriptCheck> control(fScriptChecks && parallel_script_checks ? &scriptcheckqueue : nullptr);
|
|
|
|
|
std::vector<PrecomputedTransactionData> txsdata(block.vtx.size());
|
|
|
|
|
|
|
|
|
|
std::vector<int> prevheights;
|
|
|
|
@ -2238,7 +2238,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
|
|
|
|
|
std::vector<CScriptCheck> vChecks;
|
|
|
|
|
bool fCacheResults = fJustCheck; /* Don't cache results if we're actually connecting blocks (still consult the cache, though) */
|
|
|
|
|
TxValidationState tx_state;
|
|
|
|
|
if (fScriptChecks && !CheckInputScripts(tx, tx_state, view, flags, fCacheResults, fCacheResults, txsdata[i], g_parallel_script_checks ? &vChecks : nullptr)) {
|
|
|
|
|
if (fScriptChecks && !CheckInputScripts(tx, tx_state, view, flags, fCacheResults, fCacheResults, txsdata[i], parallel_script_checks ? &vChecks : nullptr)) {
|
|
|
|
|
// Any transaction validation failure in ConnectBlock is a block consensus failure
|
|
|
|
|
state.Invalid(BlockValidationResult::BLOCK_CONSENSUS,
|
|
|
|
|
tx_state.GetRejectReason(), tx_state.GetDebugMessage());
|
|
|
|
|