diff --git a/src/main.cpp b/src/main.cpp index fec6f2309..a6ff80be3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4730,6 +4730,9 @@ bool CheckBlock(const CBlock& block, { // These are checks that are independent of context. + if (block.fChecked) + return true; + // Check that the header is valid (particularly PoW). This is mostly // redundant with the call in AcceptBlockHeader. if (!CheckBlockHeader(block, state, chainparams, fCheckPOW)) @@ -4788,6 +4791,9 @@ bool CheckBlock(const CBlock& block, return state.DoS(100, error("CheckBlock(): out-of-bounds SigOpCount"), REJECT_INVALID, "bad-blk-sigops", true); + if (fCheckPOW && fCheckMerkleRoot) + block.fChecked = true; + return true; } diff --git a/src/primitives/block.h b/src/primitives/block.h index 0527d0cd6..bef76ba04 100644 --- a/src/primitives/block.h +++ b/src/primitives/block.h @@ -89,6 +89,9 @@ public: // network and disk std::vector vtx; + // memory only + mutable bool fChecked; + CBlock() { SetNull(); @@ -112,6 +115,7 @@ public: { CBlockHeader::SetNull(); vtx.clear(); + fChecked = false; } CBlockHeader GetBlockHeader() const