Skip to content
Bitcoin Roots

v29.4-roots.4 · Commit 31: [PATCH 31/37] fix(mining): account for priority-selected ancestors

src/test/miner_tests.cpp

Before: src/test/miner_tests.cpp · After: src/test/miner_tests.cpp

File metadata
index 8a8b9344957722e887c034f8c53952ad51651581..d84cb97e2465dc55ac32a5929bae5b76ee4f7b6b 100644

Download original patch · Release notes

Diff rows 1–61 of 61. Line numbers refer to the original before/after files.

+ Added− RemovedUnmarked lines are context.

Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.

src/test/miner_tests.cpp CHANGED
@@ -39,6 +39,7 @@ using node::BlockAssembler;
39
  namespace miner_tests {
40
  struct MinerTestingSetup : public TestingSetup {
41
  void TestPackageSelection(const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
 
42
  void TestBasicMining(const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst, int baseheight) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
43
  void TestPrioritisedMining(const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
44
  bool TestSequenceLocks(const CTransaction& tx, CTxMemPool& tx_mempool) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
@@ -665,6 +666,47 @@ void MinerTestingSetup::TestPrioritisedMining(const CScript& scriptPubKey, const
665
  }
666
  }
667
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
668
  // NOTE: These tests rely on CreateNewBlock doing its own self-validation!
669
  BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
670
  {
@@ -737,6 +779,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
737
  SetMockTime(0);
738
 
739
  TestPackageSelection(scriptPubKey, txFirst);
 
740
 
741
  m_node.chainman->ActiveChain().Tip()->nHeight--;
742
  SetMockTime(0);
 
39
  namespace miner_tests {
40
  struct MinerTestingSetup : public TestingSetup {
41
  void TestPackageSelection(const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
42
+ void TestPriorityPhaseStaleAncestors(const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
43
  void TestBasicMining(const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst, int baseheight) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
44
  void TestPrioritisedMining(const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
45
  bool TestSequenceLocks(const CTransaction& tx, CTxMemPool& tx_mempool) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
 
666
  }
667
  }
668
 
669
+ // A transaction added by the coin-age priority phase must not keep subsidising
670
+ // its descendants in the ancestor-feerate phase.
671
+ //
672
+ // Test entries have no coin-age priority, so the priority phase ranks them by
673
+ // fee score, adds the fee-paying parent (the child still depends on it), and
674
+ // then stops at MINIMUM_TX_PRIORITY. The child pays no fee and must not be
675
+ // selected on the strength of its already-included parent's fee.
676
+ void MinerTestingSetup::TestPriorityPhaseStaleAncestors(const CScript& scriptPubKey, const std::vector<CTransactionRef>& txFirst)
677
+ {
678
+ CTxMemPool& tx_mempool{MakeMempool()};
679
+ BlockAssembler::Options options;
680
+ options.coinbase_output_script = scriptPubKey;
681
+ gArgs.ForceSetArg("-blockprioritysize", "100000");
682
+
683
+ LOCK(tx_mempool.cs);
684
+ TestMemPoolEntryHelper entry;
685
+
686
+ CMutableTransaction tx;
687
+ tx.vin.resize(1);
688
+ tx.vin[0].scriptSig = CScript() << OP_1;
689
+ tx.vin[0].prevout.hash = txFirst[0]->GetHash();
690
+ tx.vin[0].prevout.n = 0;
691
+ tx.vout.resize(1);
692
+ tx.vout[0].nValue = 5000000000LL - 100000;
693
+ const Txid parent_txid = tx.GetHash();
694
+ AddToMempool(tx_mempool, entry.Fee(100000).Time(Now<NodeSeconds>()).SpendsCoinbase(true).FromTx(tx));
695
+
696
+ tx.vin[0].prevout.hash = parent_txid;
697
+ const Txid child_txid = tx.GetHash();
698
+ AddToMempool(tx_mempool, entry.Fee(0).SpendsCoinbase(false).FromTx(tx));
699
+
700
+ const auto block_template = BlockAssembler{m_node.chainman->ActiveChainstate(), &tx_mempool, options}.CreateNewBlock();
701
+ BOOST_REQUIRE(block_template);
702
+ const CBlock& block{block_template->block};
703
+ BOOST_CHECK_EQUAL(block.vtx.size(), 2U);
704
+ BOOST_CHECK(block.vtx[1]->GetHash() == parent_txid);
705
+ for (const auto& btx : block.vtx) BOOST_CHECK(btx->GetHash() != child_txid);
706
+
707
+ gArgs.ForceSetArg("-blockprioritysize", "0");
708
+ }
709
+
710
  // NOTE: These tests rely on CreateNewBlock doing its own self-validation!
711
  BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
712
  {
 
779
  SetMockTime(0);
780
 
781
  TestPackageSelection(scriptPubKey, txFirst);
782
+ TestPriorityPhaseStaleAncestors(scriptPubKey, txFirst);
783
 
784
  m_node.chainman->ActiveChain().Tip()->nHeight--;
785
  SetMockTime(0);