aboutsummaryrefslogtreecommitdiff
path: root/src/validation.cpp
diff options
context:
space:
mode:
authordergoegge <n.goeggi@gmail.com>2024-01-19 15:09:28 +0000
committerdergoegge <n.goeggi@gmail.com>2024-02-27 14:19:15 +0000
commit66abce1d98115e41f394bc4f4f52341960ddc839 (patch)
tree80611efddb649953aee260eadb441e7acbfe11a7 /src/validation.cpp
parente7669e1343aec4298fd30d539847963e6fa5619c (diff)
[validation] Introduce IsBlockMutated
Diffstat (limited to 'src/validation.cpp')
-rw-r--r--src/validation.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/validation.cpp b/src/validation.cpp
index e02ce2ad1d..e1133138df 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -3824,6 +3824,26 @@ bool HasValidProofOfWork(const std::vector<CBlockHeader>& headers, const Consens
[&](const auto& header) { return CheckProofOfWork(header.GetHash(), header.nBits, consensusParams);});
}
+bool IsBlockMutated(const CBlock& block, bool check_witness_root)
+{
+ BlockValidationState state;
+ if (!CheckMerkleRoot(block, state)) {
+ LogDebug(BCLog::VALIDATION, "Block mutated: %s\n", state.ToString());
+ return true;
+ }
+
+ if (block.vtx.empty() || !block.vtx[0]->IsCoinBase()) {
+ return false;
+ }
+
+ if (!CheckWitnessMalleation(block, check_witness_root, state)) {
+ LogDebug(BCLog::VALIDATION, "Block mutated: %s\n", state.ToString());
+ return true;
+ }
+
+ return false;
+}
+
arith_uint256 CalculateHeadersWork(const std::vector<CBlockHeader>& headers)
{
arith_uint256 total_work{0};