mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-26 08:51:55 +02:00
MOVEONLY: group miner tests into MinerTestingSetup functions
No behavior changes. Recommend using --color-moved=dimmed_zebra.
This commit is contained in:
parent
28bdaa3f76
commit
0f9a44461c
@ -30,6 +30,7 @@ using node::CBlockTemplate;
|
|||||||
namespace miner_tests {
|
namespace miner_tests {
|
||||||
struct MinerTestingSetup : public TestingSetup {
|
struct MinerTestingSetup : public TestingSetup {
|
||||||
void TestPackageSelection(const CChainParams& chainparams, const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_node.mempool->cs);
|
void TestPackageSelection(const CChainParams& chainparams, const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_node.mempool->cs);
|
||||||
|
void TestBasicMining(const CChainParams& chainparams, const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst, int baseheight) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_node.mempool->cs);
|
||||||
bool TestSequenceLocks(const CTransaction& tx) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_node.mempool->cs)
|
bool TestSequenceLocks(const CTransaction& tx) EXCLUSIVE_LOCKS_REQUIRED(::cs_main, m_node.mempool->cs)
|
||||||
{
|
{
|
||||||
CCoinsViewMemPool view_mempool(&m_node.chainman->ActiveChainstate().CoinsTip(), *m_node.mempool);
|
CCoinsViewMemPool view_mempool(&m_node.chainman->ActiveChainstate().CoinsTip(), *m_node.mempool);
|
||||||
@ -191,60 +192,17 @@ void MinerTestingSetup::TestPackageSelection(const CChainParams& chainparams, co
|
|||||||
BOOST_CHECK(pblocktemplate->block.vtx[8]->GetHash() == hashLowFeeTx2);
|
BOOST_CHECK(pblocktemplate->block.vtx[8]->GetHash() == hashLowFeeTx2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: These tests rely on CreateNewBlock doing its own self-validation!
|
void MinerTestingSetup::TestBasicMining(const CChainParams& chainparams, const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst, int baseheight)
|
||||||
BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|
||||||
{
|
{
|
||||||
// Note that by default, these tests run with size accounting enabled.
|
|
||||||
const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
|
|
||||||
const CChainParams& chainparams = *chainParams;
|
|
||||||
CScript scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
|
|
||||||
std::unique_ptr<CBlockTemplate> pblocktemplate;
|
|
||||||
CMutableTransaction tx;
|
|
||||||
CScript script;
|
|
||||||
uint256 hash;
|
uint256 hash;
|
||||||
|
CMutableTransaction tx;
|
||||||
TestMemPoolEntryHelper entry;
|
TestMemPoolEntryHelper entry;
|
||||||
entry.nFee = 11;
|
entry.nFee = 11;
|
||||||
entry.nHeight = 11;
|
entry.nHeight = 11;
|
||||||
|
|
||||||
fCheckpointsEnabled = false;
|
|
||||||
|
|
||||||
// Simple block creation, nothing special yet:
|
|
||||||
BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey));
|
|
||||||
|
|
||||||
// We can't make transactions until we have inputs
|
|
||||||
// Therefore, load 110 blocks :)
|
|
||||||
static_assert(std::size(BLOCKINFO) == 110, "Should have 110 blocks to import");
|
|
||||||
int baseheight = 0;
|
|
||||||
std::vector<CTransactionRef> txFirst;
|
|
||||||
for (const auto& bi : BLOCKINFO) {
|
|
||||||
CBlock *pblock = &pblocktemplate->block; // pointer for convenience
|
|
||||||
{
|
|
||||||
LOCK(cs_main);
|
|
||||||
pblock->nVersion = VERSIONBITS_TOP_BITS;
|
|
||||||
pblock->nTime = m_node.chainman->ActiveChain().Tip()->GetMedianTimePast()+1;
|
|
||||||
CMutableTransaction txCoinbase(*pblock->vtx[0]);
|
|
||||||
txCoinbase.nVersion = 1;
|
|
||||||
txCoinbase.vin[0].scriptSig = CScript{} << (m_node.chainman->ActiveChain().Height() + 1) << bi.extranonce;
|
|
||||||
txCoinbase.vout.resize(1); // Ignore the (optional) segwit commitment added by CreateNewBlock (as the hardcoded nonces don't account for this)
|
|
||||||
txCoinbase.vout[0].scriptPubKey = CScript();
|
|
||||||
pblock->vtx[0] = MakeTransactionRef(std::move(txCoinbase));
|
|
||||||
if (txFirst.size() == 0)
|
|
||||||
baseheight = m_node.chainman->ActiveChain().Height();
|
|
||||||
if (txFirst.size() < 4)
|
|
||||||
txFirst.push_back(pblock->vtx[0]);
|
|
||||||
pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
|
|
||||||
pblock->nNonce = bi.nonce;
|
|
||||||
}
|
|
||||||
std::shared_ptr<const CBlock> shared_pblock = std::make_shared<const CBlock>(*pblock);
|
|
||||||
BOOST_CHECK(Assert(m_node.chainman)->ProcessNewBlock(chainparams, shared_pblock, true, nullptr));
|
|
||||||
pblock->hashPrevBlock = pblock->GetHash();
|
|
||||||
}
|
|
||||||
|
|
||||||
LOCK(cs_main);
|
|
||||||
LOCK(m_node.mempool->cs);
|
|
||||||
|
|
||||||
// Just to make sure we can still make simple blocks
|
// Just to make sure we can still make simple blocks
|
||||||
BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey));
|
auto pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey);
|
||||||
|
BOOST_CHECK(pblocktemplate);
|
||||||
|
|
||||||
const CAmount BLOCKSUBSIDY = 50*COIN;
|
const CAmount BLOCKSUBSIDY = 50*COIN;
|
||||||
const CAmount LOWFEE = CENT;
|
const CAmount LOWFEE = CENT;
|
||||||
@ -386,7 +344,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|||||||
tx.vin[0].prevout.n = 0;
|
tx.vin[0].prevout.n = 0;
|
||||||
tx.vin[0].scriptSig = CScript() << OP_1;
|
tx.vin[0].scriptSig = CScript() << OP_1;
|
||||||
tx.vout[0].nValue = BLOCKSUBSIDY-LOWFEE;
|
tx.vout[0].nValue = BLOCKSUBSIDY-LOWFEE;
|
||||||
script = CScript() << OP_0;
|
CScript script = CScript() << OP_0;
|
||||||
tx.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(script));
|
tx.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(script));
|
||||||
hash = tx.GetHash();
|
hash = tx.GetHash();
|
||||||
m_node.mempool->addUnchecked(entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
|
m_node.mempool->addUnchecked(entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
|
||||||
@ -508,6 +466,55 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
|||||||
|
|
||||||
BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey));
|
BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey));
|
||||||
BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 5U);
|
BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 5U);
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: These tests rely on CreateNewBlock doing its own self-validation!
|
||||||
|
BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
||||||
|
{
|
||||||
|
// Note that by default, these tests run with size accounting enabled.
|
||||||
|
const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
|
||||||
|
const CChainParams& chainparams = *chainParams;
|
||||||
|
CScript scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;
|
||||||
|
std::unique_ptr<CBlockTemplate> pblocktemplate;
|
||||||
|
|
||||||
|
fCheckpointsEnabled = false;
|
||||||
|
|
||||||
|
// Simple block creation, nothing special yet:
|
||||||
|
BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey));
|
||||||
|
|
||||||
|
// We can't make transactions until we have inputs
|
||||||
|
// Therefore, load 110 blocks :)
|
||||||
|
static_assert(std::size(BLOCKINFO) == 110, "Should have 110 blocks to import");
|
||||||
|
int baseheight = 0;
|
||||||
|
std::vector<CTransactionRef> txFirst;
|
||||||
|
for (const auto& bi : BLOCKINFO) {
|
||||||
|
CBlock *pblock = &pblocktemplate->block; // pointer for convenience
|
||||||
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
|
pblock->nVersion = VERSIONBITS_TOP_BITS;
|
||||||
|
pblock->nTime = m_node.chainman->ActiveChain().Tip()->GetMedianTimePast()+1;
|
||||||
|
CMutableTransaction txCoinbase(*pblock->vtx[0]);
|
||||||
|
txCoinbase.nVersion = 1;
|
||||||
|
txCoinbase.vin[0].scriptSig = CScript{} << (m_node.chainman->ActiveChain().Height() + 1) << bi.extranonce;
|
||||||
|
txCoinbase.vout.resize(1); // Ignore the (optional) segwit commitment added by CreateNewBlock (as the hardcoded nonces don't account for this)
|
||||||
|
txCoinbase.vout[0].scriptPubKey = CScript();
|
||||||
|
pblock->vtx[0] = MakeTransactionRef(std::move(txCoinbase));
|
||||||
|
if (txFirst.size() == 0)
|
||||||
|
baseheight = m_node.chainman->ActiveChain().Height();
|
||||||
|
if (txFirst.size() < 4)
|
||||||
|
txFirst.push_back(pblock->vtx[0]);
|
||||||
|
pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
|
||||||
|
pblock->nNonce = bi.nonce;
|
||||||
|
}
|
||||||
|
std::shared_ptr<const CBlock> shared_pblock = std::make_shared<const CBlock>(*pblock);
|
||||||
|
BOOST_CHECK(Assert(m_node.chainman)->ProcessNewBlock(chainparams, shared_pblock, true, nullptr));
|
||||||
|
pblock->hashPrevBlock = pblock->GetHash();
|
||||||
|
}
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
LOCK(m_node.mempool->cs);
|
||||||
|
|
||||||
|
TestBasicMining(chainparams, scriptPubKey, txFirst, baseheight);
|
||||||
|
|
||||||
m_node.chainman->ActiveChain().Tip()->nHeight--;
|
m_node.chainman->ActiveChain().Tip()->nHeight--;
|
||||||
SetMockTime(0);
|
SetMockTime(0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user