From 24ed820d4f0d8f7fa2f69e1909c2d98f809d2f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Thu, 6 Nov 2025 11:26:17 +0100 Subject: [PATCH] merkle: remove unused `mutated` arg from `BlockWitnessMerkleRoot` The `mutated` parameter is never used at any call site - all callers pass `nullptr`. The explicit comment in `validation.cpp` explains the reason: // The malleation check is ignored; as the transaction tree itself // already does not permit it, it is impossible to trigger in the // witness tree. --- src/consensus/merkle.cpp | 4 ++-- src/consensus/merkle.h | 3 +-- src/test/fuzz/merkle.cpp | 4 ++-- src/validation.cpp | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/consensus/merkle.cpp b/src/consensus/merkle.cpp index d7f1435f15e..703a824e16f 100644 --- a/src/consensus/merkle.cpp +++ b/src/consensus/merkle.cpp @@ -73,7 +73,7 @@ uint256 BlockMerkleRoot(const CBlock& block, bool* mutated) return ComputeMerkleRoot(std::move(leaves), mutated); } -uint256 BlockWitnessMerkleRoot(const CBlock& block, bool* mutated) +uint256 BlockWitnessMerkleRoot(const CBlock& block) { std::vector leaves; leaves.resize(block.vtx.size()); @@ -81,7 +81,7 @@ uint256 BlockWitnessMerkleRoot(const CBlock& block, bool* mutated) for (size_t s = 1; s < block.vtx.size(); s++) { leaves[s] = block.vtx[s]->GetWitnessHash().ToUint256(); } - return ComputeMerkleRoot(std::move(leaves), mutated); + return ComputeMerkleRoot(std::move(leaves)); } /* This implements a constant-space merkle path calculator, limited to 2^32 leaves. */ diff --git a/src/consensus/merkle.h b/src/consensus/merkle.h index c722cbe446f..29282d217d2 100644 --- a/src/consensus/merkle.h +++ b/src/consensus/merkle.h @@ -20,9 +20,8 @@ uint256 BlockMerkleRoot(const CBlock& block, bool* mutated = nullptr); /* * Compute the Merkle root of the witness transactions in a block. - * *mutated is set to true if a duplicated subtree was found. */ -uint256 BlockWitnessMerkleRoot(const CBlock& block, bool* mutated = nullptr); +uint256 BlockWitnessMerkleRoot(const CBlock& block); /** * Compute merkle path to the specified transaction diff --git a/src/test/fuzz/merkle.cpp b/src/test/fuzz/merkle.cpp index 4bb91faf0b8..9ba461bbd6b 100644 --- a/src/test/fuzz/merkle.cpp +++ b/src/test/fuzz/merkle.cpp @@ -51,7 +51,7 @@ FUZZ_TARGET(merkle) } // Test ComputeMerkleRoot - bool mutated = fuzzed_data_provider.ConsumeBool(); + bool mutated = fuzzed_data_provider.ConsumeBool(); // output param, initial value shouldn't matter const uint256 merkle_root = ComputeMerkleRoot(tx_hashes, &mutated); // Basic sanity checks for ComputeMerkleRoot @@ -66,7 +66,7 @@ FUZZ_TARGET(merkle) } if (!block->vtx.empty()){ - const uint256 block_witness_merkle_root = BlockWitnessMerkleRoot(*block, &mutated); + const uint256 block_witness_merkle_root = BlockWitnessMerkleRoot(*block); if (tx_hashes.size() == 1) { assert(block_witness_merkle_root == uint256()); } diff --git a/src/validation.cpp b/src/validation.cpp index af523b06d74..aaf80b33928 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3996,7 +3996,7 @@ static bool CheckWitnessMalleation(const CBlock& block, bool expect_witness_comm // The malleation check is ignored; as the transaction tree itself // already does not permit it, it is impossible to trigger in the // witness tree. - uint256 hash_witness = BlockWitnessMerkleRoot(block, /*mutated=*/nullptr); + uint256 hash_witness = BlockWitnessMerkleRoot(block); CHash256().Write(hash_witness).Write(witness_stack[0]).Finalize(hash_witness); if (memcmp(hash_witness.begin(), &block.vtx[0]->vout[commitpos].scriptPubKey[6], 32)) { @@ -4109,7 +4109,7 @@ std::vector ChainstateManager::GenerateCoinbaseCommitment(CBlock& int commitpos = GetWitnessCommitmentIndex(block); std::vector ret(32, 0x00); if (commitpos == NO_WITNESS_COMMITMENT) { - uint256 witnessroot = BlockWitnessMerkleRoot(block, nullptr); + uint256 witnessroot = BlockWitnessMerkleRoot(block); CHash256().Write(witnessroot).Write(ret).Finalize(witnessroot); CTxOut out; out.nValue = 0;