diff --git a/src/test/blockcheck_tests.cpp b/src/test/blockcheck_tests.cpp --- a/src/test/blockcheck_tests.cpp +++ b/src/test/blockcheck_tests.cpp @@ -15,10 +15,12 @@ BOOST_FIXTURE_TEST_SUITE(blockcheck_tests, BasicTestingSetup) static void RunCheckOnBlockImpl(const GlobalConfig &config, const CBlock &block, - CValidationState &state, bool expected) { + CValidationState &state, bool expected, + bool fCheckExcessive = true) { block.fChecked = false; const Consensus::Params ¶ms = config.GetChainParams().GetConsensus(); - bool fValid = CheckBlock(config, block, state, params, false, false); + bool fValid = + CheckBlock(config, block, state, params, false, false, fCheckExcessive); BOOST_CHECK_EQUAL(fValid, expected); BOOST_CHECK_EQUAL(fValid, state.IsValid()); @@ -59,6 +61,12 @@ BOOST_CHECK_EQUAL(state.IsExcessive(), true); } +static void RunNonExessiveCheckOnBlock(const GlobalConfig &config, + const CBlock &block) { + CValidationState state; + RunCheckOnBlockImpl(config, block, state, true, false); +} + BOOST_AUTO_TEST_CASE(blockfail) { SelectParams(CBaseChainParams::MAIN); @@ -116,6 +124,9 @@ tx.vin[0].prevout.hash = GetRandHash(); block.vtx.push_back(MakeTransactionRef(tx)); RunExessiveCheckOnBlock(config, block, "bad-blk-length"); + + // Check everything but the block size, there should be no error + RunNonExessiveCheckOnBlock(config, block); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/validation.h b/src/validation.h --- a/src/validation.h +++ b/src/validation.h @@ -555,7 +555,7 @@ bool CheckBlock(const Config &Config, const CBlock &block, CValidationState &state, const Consensus::Params &consensusParams, bool fCheckPOW = true, - bool fCheckMerkleRoot = true); + bool fCheckMerkleRoot = true, bool fCheckExcessive = true); /** * Context dependent validity checks for non coinbase transactions. This diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3131,7 +3131,7 @@ bool CheckBlock(const Config &config, const CBlock &block, CValidationState &state, const Consensus::Params &consensusParams, bool fCheckPOW, - bool fCheckMerkleRoot) { + bool fCheckMerkleRoot, bool fCheckExcessive) { // These are checks that are independent of context. if (block.fChecked) { return true; @@ -3173,18 +3173,21 @@ // Size limits. auto nMaxBlockSize = config.GetMaxBlockSize(); - - // Bail early if there is no way this block is of reasonable size. - if ((block.vtx.size() * MIN_TRANSACTION_SIZE) > nMaxBlockSize) { - return state.Excessive(10, false, REJECT_INVALID, "bad-blk-length", - false, "size limits failed"); + if (fCheckExcessive) { + // Bail early if there is no way this block is of reasonable size. + if ((block.vtx.size() * MIN_TRANSACTION_SIZE) > nMaxBlockSize) { + return state.Excessive(10, false, REJECT_INVALID, "bad-blk-length", + false, "size limits failed"); + } } auto currentBlockSize = ::GetSerializeSize(block, SER_NETWORK, PROTOCOL_VERSION); - if (currentBlockSize > nMaxBlockSize) { - return state.Excessive(10, false, REJECT_INVALID, "bad-blk-length", - false, "size limits failed"); + if (fCheckExcessive) { + if (currentBlockSize > nMaxBlockSize) { + return state.Excessive(10, false, REJECT_INVALID, "bad-blk-length", + false, "size limits failed"); + } } // And a valid coinbase.