|
|
|
@ -18,6 +18,8 @@
@@ -18,6 +18,8 @@
|
|
|
|
|
|
|
|
|
|
#include "test/test_bitcoin.h" |
|
|
|
|
|
|
|
|
|
#include <memory> |
|
|
|
|
|
|
|
|
|
#include <boost/test/unit_test.hpp> |
|
|
|
|
|
|
|
|
|
BOOST_FIXTURE_TEST_SUITE(miner_tests, TestingSetup) |
|
|
|
@ -105,7 +107,7 @@ void TestPackageSelection(const CChainParams& chainparams, CScript scriptPubKey,
@@ -105,7 +107,7 @@ void TestPackageSelection(const CChainParams& chainparams, CScript scriptPubKey,
|
|
|
|
|
uint256 hashHighFeeTx = tx.GetHash(); |
|
|
|
|
mempool.addUnchecked(hashHighFeeTx, entry.Fee(50000).Time(GetTime()).SpendsCoinbase(false).FromTx(tx)); |
|
|
|
|
|
|
|
|
|
CBlockTemplate *pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey); |
|
|
|
|
std::unique_ptr<CBlockTemplate> pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey); |
|
|
|
|
BOOST_CHECK(pblocktemplate->block.vtx[1].GetHash() == hashParentTx); |
|
|
|
|
BOOST_CHECK(pblocktemplate->block.vtx[2].GetHash() == hashHighFeeTx); |
|
|
|
|
BOOST_CHECK(pblocktemplate->block.vtx[3].GetHash() == hashMediumFeeTx); |
|
|
|
@ -184,7 +186,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
@@ -184,7 +186,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
|
|
|
// Note that by default, these tests run with size accounting enabled.
|
|
|
|
|
const CChainParams& chainparams = Params(CBaseChainParams::MAIN); |
|
|
|
|
CScript scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; |
|
|
|
|
CBlockTemplate *pblocktemplate; |
|
|
|
|
std::unique_ptr<CBlockTemplate> pblocktemplate; |
|
|
|
|
CMutableTransaction tx,tx2; |
|
|
|
|
CScript script; |
|
|
|
|
uint256 hash; |
|
|
|
@ -226,11 +228,9 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
@@ -226,11 +228,9 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
|
|
|
BOOST_CHECK(state.IsValid()); |
|
|
|
|
pblock->hashPrevBlock = pblock->GetHash(); |
|
|
|
|
} |
|
|
|
|
delete pblocktemplate; |
|
|
|
|
|
|
|
|
|
// Just to make sure we can still make simple blocks
|
|
|
|
|
BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey)); |
|
|
|
|
delete pblocktemplate; |
|
|
|
|
|
|
|
|
|
const CAmount BLOCKSUBSIDY = 50*COIN; |
|
|
|
|
const CAmount LOWFEE = CENT; |
|
|
|
@ -269,7 +269,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
@@ -269,7 +269,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
|
|
|
tx.vin[0].prevout.hash = hash; |
|
|
|
|
} |
|
|
|
|
BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey)); |
|
|
|
|
delete pblocktemplate; |
|
|
|
|
mempool.clear(); |
|
|
|
|
|
|
|
|
|
// block size > limit
|
|
|
|
@ -290,7 +289,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
@@ -290,7 +289,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
|
|
|
tx.vin[0].prevout.hash = hash; |
|
|
|
|
} |
|
|
|
|
BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey)); |
|
|
|
|
delete pblocktemplate; |
|
|
|
|
mempool.clear(); |
|
|
|
|
|
|
|
|
|
// orphan in mempool, template creation fails
|
|
|
|
@ -314,7 +312,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
@@ -314,7 +312,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
|
|
|
hash = tx.GetHash(); |
|
|
|
|
mempool.addUnchecked(hash, entry.Fee(HIGHERFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); |
|
|
|
|
BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey)); |
|
|
|
|
delete pblocktemplate; |
|
|
|
|
mempool.clear(); |
|
|
|
|
|
|
|
|
|
// coinbase in mempool, template creation fails
|
|
|
|
@ -372,7 +369,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
@@ -372,7 +369,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
|
|
|
chainActive.SetTip(next); |
|
|
|
|
} |
|
|
|
|
BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey)); |
|
|
|
|
delete pblocktemplate; |
|
|
|
|
// Extend to a 210000-long block chain.
|
|
|
|
|
while (chainActive.Tip()->nHeight < 210000) { |
|
|
|
|
CBlockIndex* prev = chainActive.Tip(); |
|
|
|
@ -385,7 +381,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
@@ -385,7 +381,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
|
|
|
chainActive.SetTip(next); |
|
|
|
|
} |
|
|
|
|
BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey)); |
|
|
|
|
delete pblocktemplate; |
|
|
|
|
// Delete the dummy blocks again.
|
|
|
|
|
while (chainActive.Tip()->nHeight > nHeight) { |
|
|
|
|
CBlockIndex* del = chainActive.Tip(); |
|
|
|
@ -478,7 +473,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
@@ -478,7 +473,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
|
|
|
// but relative locked txs will if inconsistently added to mempool.
|
|
|
|
|
// For now these will still generate a valid template until BIP68 soft fork
|
|
|
|
|
BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 3); |
|
|
|
|
delete pblocktemplate; |
|
|
|
|
// However if we advance height by 1 and time by 512, all of them should be mined
|
|
|
|
|
for (int i = 0; i < CBlockIndex::nMedianTimeSpan; i++) |
|
|
|
|
chainActive.Tip()->GetAncestor(chainActive.Tip()->nHeight - i)->nTime += 512; //Trick the MedianTimePast
|
|
|
|
@ -487,7 +481,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
@@ -487,7 +481,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(pblocktemplate = BlockAssembler(chainparams).CreateNewBlock(scriptPubKey)); |
|
|
|
|
BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 5); |
|
|
|
|
delete pblocktemplate; |
|
|
|
|
|
|
|
|
|
chainActive.Tip()->nHeight--; |
|
|
|
|
SetMockTime(0); |
|
|
|
|