|
@ -29,3 +29,46 @@ TEST(CheckBlock, VersionTooLow) { |
|
|
EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "version-too-low", false)).Times(1); |
|
|
EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "version-too-low", false)).Times(1); |
|
|
EXPECT_FALSE(CheckBlock(block, state, false, false)); |
|
|
EXPECT_FALSE(CheckBlock(block, state, false, false)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST(ContextualCheckBlock, BadCoinbaseHeight) { |
|
|
|
|
|
SelectParams(CBaseChainParams::MAIN); |
|
|
|
|
|
|
|
|
|
|
|
// Create a block with no height in scriptSig
|
|
|
|
|
|
CMutableTransaction mtx; |
|
|
|
|
|
mtx.vin.resize(1); |
|
|
|
|
|
mtx.vin[0].prevout.SetNull(); |
|
|
|
|
|
mtx.vin[0].scriptSig = CScript() << OP_0; |
|
|
|
|
|
mtx.vout.resize(1); |
|
|
|
|
|
mtx.vout[0].scriptPubKey = CScript() << OP_TRUE; |
|
|
|
|
|
mtx.vout[0].nValue = 0; |
|
|
|
|
|
CTransaction tx {mtx}; |
|
|
|
|
|
CBlock block; |
|
|
|
|
|
block.vtx.push_back(tx); |
|
|
|
|
|
|
|
|
|
|
|
// Treating block as genesis should pass
|
|
|
|
|
|
MockCValidationState state; |
|
|
|
|
|
EXPECT_TRUE(ContextualCheckBlock(block, state, NULL)); |
|
|
|
|
|
|
|
|
|
|
|
// Treating block as non-genesis should fail
|
|
|
|
|
|
mtx.vout.push_back(CTxOut(GetBlockSubsidy(1, Params().GetConsensus())/5, Params().GetFoundersRewardScriptAtHeight(1))); |
|
|
|
|
|
CTransaction tx2 {mtx}; |
|
|
|
|
|
block.vtx[0] = tx2; |
|
|
|
|
|
CBlock prev; |
|
|
|
|
|
CBlockIndex indexPrev {prev}; |
|
|
|
|
|
indexPrev.nHeight = 0; |
|
|
|
|
|
EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-cb-height", false)).Times(1); |
|
|
|
|
|
EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev)); |
|
|
|
|
|
|
|
|
|
|
|
// Setting to an incorrect height should fail
|
|
|
|
|
|
mtx.vin[0].scriptSig = CScript() << 2 << OP_0; |
|
|
|
|
|
CTransaction tx3 {mtx}; |
|
|
|
|
|
block.vtx[0] = tx3; |
|
|
|
|
|
EXPECT_CALL(state, DoS(100, false, REJECT_INVALID, "bad-cb-height", false)).Times(1); |
|
|
|
|
|
EXPECT_FALSE(ContextualCheckBlock(block, state, &indexPrev)); |
|
|
|
|
|
|
|
|
|
|
|
// After correcting the scriptSig, should pass
|
|
|
|
|
|
mtx.vin[0].scriptSig = CScript() << 1 << OP_0; |
|
|
|
|
|
CTransaction tx4 {mtx}; |
|
|
|
|
|
block.vtx[0] = tx4; |
|
|
|
|
|
EXPECT_TRUE(ContextualCheckBlock(block, state, &indexPrev)); |
|
|
|
|
|
} |
|
|