mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-03-16 18:39:59 +01:00
[validation] Cache merkle root and witness commitment checks
Slight performance improvement by avoiding duplicate work.
This commit is contained in:
@@ -3641,6 +3641,8 @@ static bool CheckBlockHeader(const CBlockHeader& block, BlockValidationState& st
|
||||
|
||||
static bool CheckMerkleRoot(const CBlock& block, BlockValidationState& state)
|
||||
{
|
||||
if (block.m_checked_merkle_root) return true;
|
||||
|
||||
bool mutated;
|
||||
uint256 merkle_root = BlockMerkleRoot(block, &mutated);
|
||||
if (block.hashMerkleRoot != merkle_root) {
|
||||
@@ -3660,6 +3662,7 @@ static bool CheckMerkleRoot(const CBlock& block, BlockValidationState& state)
|
||||
/*debug_message=*/"duplicate transaction");
|
||||
}
|
||||
|
||||
block.m_checked_merkle_root = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3672,6 +3675,8 @@ static bool CheckMerkleRoot(const CBlock& block, BlockValidationState& state)
|
||||
static bool CheckWitnessMalleation(const CBlock& block, bool expect_witness_commitment, BlockValidationState& state)
|
||||
{
|
||||
if (expect_witness_commitment) {
|
||||
if (block.m_checked_witness_commitment) return true;
|
||||
|
||||
int commitpos = GetWitnessCommitmentIndex(block);
|
||||
if (commitpos != NO_WITNESS_COMMITMENT) {
|
||||
assert(!block.vtx.empty() && !block.vtx[0]->vin.empty());
|
||||
@@ -3697,6 +3702,7 @@ static bool CheckWitnessMalleation(const CBlock& block, bool expect_witness_comm
|
||||
/*debug_message=*/strprintf("%s : witness merkle commitment mismatch", __func__));
|
||||
}
|
||||
|
||||
block.m_checked_witness_commitment = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user