diff --git a/src/test/claimtriebranching_tests.cpp b/src/test/claimtriebranching_tests.cpp index de77f3d60..432c923a9 100644 --- a/src/test/claimtriebranching_tests.cpp +++ b/src/test/claimtriebranching_tests.cpp @@ -142,7 +142,6 @@ struct ClaimTrieChainFixture{ extendedExpiration(Params().GetConsensus().nExtendedClaimExpirationTime) { fRequireStandard = false; - ENTER_CRITICAL_SECTION(cs_main); BOOST_CHECK_EQUAL(pclaimTrie->nCurrentHeight, chainActive.Height() + 1); pclaimTrie->setExpirationTime(originalExpiration); // in case it was changed during the test num_txs_for_next_block = 0; @@ -156,24 +155,26 @@ struct ClaimTrieChainFixture{ ~ClaimTrieChainFixture() { DecrementBlocks(chainActive.Height()); - LEAVE_CRITICAL_SECTION(cs_main); } bool CreateBlock(const std::unique_ptr& pblocktemplate) { CBlock* pblock = &pblocktemplate->block; - pblock->nVersion = 5; - pblock->hashPrevBlock = chainActive.Tip()->GetBlockHash(); - pblock->nTime = chainActive.Tip()->GetBlockTime() + Params().GetConsensus().nPowTargetSpacing; - CMutableTransaction txCoinbase(*pblock->vtx[0]); - txCoinbase.vin[0].scriptSig = CScript() << int(chainActive.Height() + 1) << int(++unique_block_counter); - txCoinbase.vout[0].nValue = GetBlockSubsidy(chainActive.Height() + 1, Params().GetConsensus()); - pblock->vtx[0] = MakeTransactionRef(std::move(txCoinbase)); - pblock->hashMerkleRoot = BlockMerkleRoot(*pblock); - for (uint32_t i = 0;; ++i) { - pblock->nNonce = i; - if (CheckProofOfWork(pblock->GetPoWHash(), pblock->nBits, Params().GetConsensus())) { - break; + { + LOCK(cs_main); + pblock->nVersion = 5; + pblock->hashPrevBlock = chainActive.Tip()->GetBlockHash(); + pblock->nTime = chainActive.Tip()->GetBlockTime() + Params().GetConsensus().nPowTargetSpacing; + CMutableTransaction txCoinbase(*pblock->vtx[0]); + txCoinbase.vin[0].scriptSig = CScript() << int(chainActive.Height() + 1) << int(++unique_block_counter); + txCoinbase.vout[0].nValue = GetBlockSubsidy(chainActive.Height() + 1, Params().GetConsensus()); + pblock->vtx[0] = MakeTransactionRef(std::move(txCoinbase)); + pblock->hashMerkleRoot = BlockMerkleRoot(*pblock); + for (uint32_t i = 0;; ++i) { + pblock->nNonce = i; + if (CheckProofOfWork(pblock->GetPoWHash(), pblock->nBits, Params().GetConsensus())) { + break; + } } } return ProcessNewBlock(Params(), std::make_shared(*pblock), true, nullptr) && pblock->GetHash() == chainActive.Tip()->GetBlockHash(); @@ -202,6 +203,7 @@ struct ClaimTrieChainFixture{ assert(0); } + LOCK(cs_main); CValidationState state; CAmount txFeeRate = CAmount(0); BOOST_CHECK(AcceptToMemoryPool(mempool, state, MakeTransactionRef(tx), nullptr, nullptr, false, txFeeRate, false)); @@ -296,7 +298,10 @@ struct ClaimTrieChainFixture{ for (int i = 0; i < num_blocks; i++) { CValidationState state; CBlockIndex* pblockindex = chainActive.Tip(); - InvalidateBlock(state, Params(), pblockindex); + { + LOCK(cs_main); + InvalidateBlock(state, Params(), pblockindex); + } if (state.IsValid()) { ActivateBestChain(state, Params()); diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 0668386c7..dff5845e7 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -38,7 +38,7 @@ private: const std::string m_reason; }; -static CFeeRate blockMinFeeRate = CFeeRate(0); +static CFeeRate blockMinFeeRate = CFeeRate(DEFAULT_BLOCK_MIN_TX_FEE); static BlockAssembler AssemblerForTest(const CChainParams& params) { BlockAssembler::Options options; @@ -127,20 +127,20 @@ static void TestPackageSelection(const CChainParams& chainparams, const CScript& tx.vin[0].prevout.hash = txFirst[0]->GetHash(); tx.vin[0].prevout.n = 0; tx.vout.resize(1); - tx.vout[0].nValue = 5000000000LL - 1000; + tx.vout[0].nValue = 50000000LL - 1000; // This tx has a low fee: 1000 satoshis uint256 hashParentTx = tx.GetHash(); // save this txid for later use mempool.addUnchecked(hashParentTx, entry.Fee(1000).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); // This tx has a medium fee: 10000 satoshis tx.vin[0].prevout.hash = txFirst[1]->GetHash(); - tx.vout[0].nValue = 5000000000LL - 10000; + tx.vout[0].nValue = 50000000LL - 10000; uint256 hashMediumFeeTx = tx.GetHash(); mempool.addUnchecked(hashMediumFeeTx, entry.Fee(10000).Time(GetTime()).SpendsCoinbase(true).FromTx(tx)); // This tx has a high fee, but depends on the first transaction tx.vin[0].prevout.hash = hashParentTx; - tx.vout[0].nValue = 5000000000LL - 1000 - 50000; // 50k satoshi fee + tx.vout[0].nValue = 50000000LL - 1000 - 50000; // 50k satoshi fee uint256 hashHighFeeTx = tx.GetHash(); mempool.addUnchecked(hashHighFeeTx, entry.Fee(50000).Time(GetTime()).SpendsCoinbase(false).FromTx(tx)); @@ -151,7 +151,7 @@ static void TestPackageSelection(const CChainParams& chainparams, const CScript& // Test that a package below the block min tx fee doesn't get included tx.vin[0].prevout.hash = hashHighFeeTx; - tx.vout[0].nValue = 5000000000LL - 1000 - 50000; // 0 fee + tx.vout[0].nValue = 50000000LL - 1000 - 50000; // 0 fee uint256 hashFreeTx = tx.GetHash(); mempool.addUnchecked(hashFreeTx, entry.Fee(0).FromTx(tx)); size_t freeTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); @@ -161,7 +161,7 @@ static void TestPackageSelection(const CChainParams& chainparams, const CScript& CAmount feeToUse = blockMinFeeRate.GetFee(2*freeTxSize) - 1; tx.vin[0].prevout.hash = hashFreeTx; - tx.vout[0].nValue = 5000000000LL - 1000 - 50000 - feeToUse; + tx.vout[0].nValue = 50000000LL - 1000 - 50000 - feeToUse; uint256 hashLowFeeTx = tx.GetHash(); mempool.addUnchecked(hashLowFeeTx, entry.Fee(feeToUse).FromTx(tx)); pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey); @@ -187,8 +187,8 @@ static void TestPackageSelection(const CChainParams& chainparams, const CScript& // Add a 0-fee transaction that has 2 outputs. tx.vin[0].prevout.hash = txFirst[2]->GetHash(); tx.vout.resize(2); - tx.vout[0].nValue = 5000000000LL - 100000000; - tx.vout[1].nValue = 100000000; // 1BTC output + tx.vout[0].nValue = 50000000LL - 1000000LL; + tx.vout[1].nValue = 1000000LL; // 1BTC output uint256 hashFreeTx2 = tx.GetHash(); mempool.addUnchecked(hashFreeTx2, entry.Fee(0).SpendsCoinbase(true).FromTx(tx)); @@ -196,7 +196,7 @@ static void TestPackageSelection(const CChainParams& chainparams, const CScript& tx.vin[0].prevout.hash = hashFreeTx2; tx.vout.resize(1); feeToUse = blockMinFeeRate.GetFee(freeTxSize); - tx.vout[0].nValue = 5000000000LL - 100000000 - feeToUse; + tx.vout[0].nValue = 50000000LL - 1000000LL - feeToUse; uint256 hashLowFeeTx2 = tx.GetHash(); mempool.addUnchecked(hashLowFeeTx2, entry.Fee(feeToUse).SpendsCoinbase(false).FromTx(tx)); pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey); @@ -210,7 +210,7 @@ static void TestPackageSelection(const CChainParams& chainparams, const CScript& // This tx will be mineable, and should cause hashLowFeeTx2 to be selected // as well. tx.vin[0].prevout.n = 1; - tx.vout[0].nValue = 100000000 - 10000; // 10k satoshi fee + tx.vout[0].nValue = 1000000LL - 10000; // 10k satoshi fee mempool.addUnchecked(tx.GetHash(), entry.Fee(10000).FromTx(tx)); pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey); BOOST_CHECK(pblocktemplate->block.vtx[8]->GetHash() == hashLowFeeTx2); @@ -231,7 +231,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) entry.nFee = 11; entry.nHeight = 11; - LOCK(cs_main); fCheckpointsEnabled = false; // Simple block creation, nothing special yet: @@ -245,40 +244,43 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) { BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey)); CBlock *pblock = &pblocktemplate->block; // pointer for convenience - pblock->hashPrevBlock = chainActive.Tip()->GetBlockHash(); - pblock->nVersion = 5; - pblock->nTime = chainActive.Tip()->GetBlockTime() + chainparams.GetConsensus().nPowTargetSpacing; - CMutableTransaction txCoinbase(*pblock->vtx[0]); - txCoinbase.vin[0].scriptSig = CScript() << int(chainActive.Height() + 1) << i; - txCoinbase.vout.resize(1); // Ignore the (optional) segwit commitment added by CreateNewBlock (as the hardcoded nonces don't account for this) - txCoinbase.vout[0].nValue = GetBlockSubsidy(chainActive.Height() + 1, chainparams.GetConsensus()); - pblock->vtx[0] = MakeTransactionRef(std::move(txCoinbase)); - if (txFirst.size() == 0) - baseheight = chainActive.Height(); - if (txFirst.size() < 4) - txFirst.push_back(pblock->vtx[0]); - pblock->hashMerkleRoot = BlockMerkleRoot(*pblock); + { + LOCK(cs_main); + pblock->hashPrevBlock = chainActive.Tip()->GetBlockHash(); + pblock->nVersion = 5; + pblock->nTime = chainActive.Tip()->GetBlockTime() + chainparams.GetConsensus().nPowTargetSpacing; + CMutableTransaction txCoinbase(*pblock->vtx[0]); + txCoinbase.vin[0].scriptSig = CScript() << int(chainActive.Height() + 1) << i; + 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 = chainActive.Height(); + if (txFirst.size() < 4) + txFirst.push_back(pblock->vtx[0]); + pblock->hashMerkleRoot = BlockMerkleRoot(*pblock); - for (uint32_t i = 0;; ++i) { - pblock->nNonce = i; - if (CheckProofOfWork(pblock->GetPoWHash(), pblock->nBits, chainparams.GetConsensus())) { - break; + for (uint32_t i = 0;; ++i) { + pblock->nNonce = i; + if (CheckProofOfWork(pblock->GetPoWHash(), pblock->nBits, chainparams.GetConsensus())) { + break; + } } } - std::shared_ptr shared_pblock = std::make_shared(*pblock); BOOST_CHECK(ProcessNewBlock(chainparams, shared_pblock, true, nullptr)); } + LOCK(cs_main); LOCK(::mempool.cs); // Just to make sure we can still make simple blocks BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey)); - const CAmount BLOCKSUBSIDY = 50*COIN; - const CAmount LOWFEE = CENT; - const CAmount HIGHFEE = COIN; - const CAmount HIGHERFEE = 4*COIN; + const CAmount BLOCKSUBSIDY = 50000000LL; + const CAmount LOWFEE = 100000LL; + const CAmount HIGHFEE = 1000000LL; + const CAmount HIGHERFEE = 4*HIGHFEE; // block sigops > limit: 1000 CHECKMULTISIG + 1 tx.vin.resize(1); @@ -290,7 +292,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vout[0].nValue = BLOCKSUBSIDY; for (unsigned int i = 0; i < 1001; ++i) { - tx.vout[0].nValue -= LOWFEE; + tx.vout[0].nValue -= 101; hash = tx.GetHash(); bool spendsCoinbase = i == 0; // only first tx spends coinbase // If we don't set the # of sig ops in the CTxMemPoolEntry, template creation fails @@ -305,11 +307,11 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vout[0].nValue = BLOCKSUBSIDY; for (unsigned int i = 0; i < 1001; ++i) { - tx.vout[0].nValue -= LOWFEE; + tx.vout[0].nValue -= 101; hash = tx.GetHash(); bool spendsCoinbase = i == 0; // only first tx spends coinbase // If we do set the # of sig ops in the CTxMemPoolEntry, template creation passes - mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(spendsCoinbase).SigOpsCost(80).FromTx(tx)); + mempool.addUnchecked(hash, entry.Fee(LOWFEE / 2).Time(GetTime()).SpendsCoinbase(spendsCoinbase).SigOpsCost(80).FromTx(tx)); tx.vin[0].prevout.hash = hash; } BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey)); @@ -326,7 +328,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) tx.vout[0].nValue = BLOCKSUBSIDY; for (unsigned int i = 0; i < 128; ++i) { - tx.vout[0].nValue -= LOWFEE; + tx.vout[0].nValue -= 100; hash = tx.GetHash(); bool spendsCoinbase = i == 0; // only first tx spends coinbase mempool.addUnchecked(hash, entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(spendsCoinbase).FromTx(tx)); @@ -383,33 +385,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) BOOST_CHECK_EXCEPTION(AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error, HasReason("bad-txns-inputs-missingorspent")); mempool.clear(); - // subsidy changing - int nHeight = chainActive.Height(); - // Create an actual 209999-long block chain (without valid blocks). - while (chainActive.Tip()->nHeight < 209999) { - CBlockIndex* prev = chainActive.Tip(); - CBlockIndex* next = new CBlockIndex(); - next->phashBlock = new uint256(InsecureRand256()); - pcoinsTip->SetBestBlock(next->GetBlockHash()); - next->pprev = prev; - next->nHeight = prev->nHeight + 1; - next->BuildSkip(); - chainActive.SetTip(next); - } - BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey)); - // Extend to a 210000-long block chain. - while (chainActive.Tip()->nHeight < 210000) { - CBlockIndex* prev = chainActive.Tip(); - CBlockIndex* next = new CBlockIndex(); - next->phashBlock = new uint256(InsecureRand256()); - pcoinsTip->SetBestBlock(next->GetBlockHash()); - next->pprev = prev; - next->nHeight = prev->nHeight + 1; - next->BuildSkip(); - chainActive.SetTip(next); - } - BOOST_CHECK(pblocktemplate = AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey)); - // invalid p2sh txn in mempool, template creation fails tx.vin[0].prevout.hash = txFirst[0]->GetHash(); tx.vin[0].prevout.n = 0; @@ -428,15 +403,6 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) BOOST_CHECK_EXCEPTION(AssemblerForTest(chainparams).CreateNewBlock(scriptPubKey), std::runtime_error, HasReason("block-validation-failed")); mempool.clear(); - // Delete the dummy blocks again. - while (chainActive.Tip()->nHeight > nHeight) { - CBlockIndex* del = chainActive.Tip(); - chainActive.SetTip(del->pprev); - pcoinsTip->SetBestBlock(del->pprev->GetBlockHash()); - delete del->phashBlock; - delete del; - } - // non-final txs in mempool SetMockTime(chainActive.Tip()->GetMedianTimePast()+1); int flags = LOCKTIME_VERIFY_SEQUENCE|LOCKTIME_MEDIAN_TIME_PAST;