39#include <validation.h>
40#include <versionbits.h>
42#include <boost/test/unit_test.hpp>
84 opts.limits.cluster_size_vbytes = 1'200'000;
101constexpr static struct {
104}
BLOCKINFO[]{{0, 3552706918}, {500, 37506755}, {1000, 948987788}, {400, 524762339}, {800, 258510074}, {300, 102309278},
105 {1300, 54365202}, {600, 1107740426}, {1000, 203094491}, {900, 391178848}, {800, 381177271}, {600, 87188412},
106 {0, 66522866}, {800, 874942736}, {1000, 89200838}, {400, 312638088}, {400, 66263693}, {500, 924648304},
107 {400, 369913599}, {500, 47630099}, {500, 115045364}, {100, 277026602}, {1100, 809621409}, {700, 155345322},
108 {800, 943579953}, {400, 28200730}, {900, 77200495}, {0, 105935488}, {400, 698721821}, {500, 111098863},
109 {1300, 445389594}, {500, 621849894}, {1400, 56010046}, {1100, 370669776}, {1200, 380301940}, {1200, 110654905},
110 {400, 213771024}, {1500, 120014726}, {1200, 835019014}, {1500, 624817237}, {900, 1404297}, {400, 189414558},
111 {400, 293178348}, {1100, 15393789}, {600, 396764180}, {800, 1387046371}, {800, 199368303}, {700, 111496662},
112 {100, 129759616}, {200, 536577982}, {500, 125881300}, {500, 101053391}, {1200, 471590548}, {900, 86957729},
113 {1200, 179604104}, {600, 68658642}, {1000, 203295701}, {500, 139615361}, {900, 233693412}, {300, 153225163},
114 {0, 27616254}, {1200, 9856191}, {100, 220392722}, {200, 66257599}, {1100, 145489641}, {1300, 37859442},
115 {400, 5816075}, {1200, 215752117}, {1400, 32361482}, {1400, 6529223}, {500, 143332977}, {800, 878392},
116 {700, 159290408}, {400, 123197595}, {700, 43988693}, {300, 304224916}, {700, 214771621}, {1100, 274148273},
117 {400, 285632418}, {1100, 923451065}, {600, 12818092}, {1200, 736282054}, {1000, 246683167}, {600, 92950402},
118 {1400, 29223405}, {1000, 841327192}, {700, 174301283}, {1400, 214009854}, {1000, 6989517}, {1200, 278226956},
119 {700, 540219613}, {400, 93663104}, {1100, 152345635}, {1500, 464194499}, {1300, 333850111}, {600, 258311263},
120 {600, 90173162}, {1000, 33590797}, {1500, 332866027}, {100, 204704427}, {1000, 463153545}, {800, 303244785},
121 {600, 88096214}, {0, 137477892}, {1200, 195514506}, {300, 704114595}, {900, 292087369}, {1400, 758684870},
122 {1300, 163493028}, {1200, 53151293}};
126 auto index{std::make_unique<CBlockIndex>()};
128 index->pprev = active_chain_tip;
135void MinerTestingSetup::TestPackageSelection(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
147 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options,
false);
148 BOOST_REQUIRE(block_template);
149 CBlock block{block_template->getBlock()};
150 BOOST_REQUIRE_EQUAL(block.vtx.size(), 1U);
153 auto should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
154 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
157 block_template = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 0});
158 BOOST_REQUIRE(block_template);
168 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
169 tx.
vin[0].prevout.n = 0;
171 tx.
vout[0].nValue = 5000000000LL - 1000;
178 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
179 tx.
vout[0].nValue = 5000000000LL - 10000;
185 tx.
vin[0].prevout.hash = hashParentTx;
186 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
192 const std::vector<Txid> tx_id_list{
196 auto raw_txs = mining->getTransactionsByTxID(tx_id_list);
197 BOOST_REQUIRE_EQUAL(raw_txs.size(), tx_id_list.size());
199 BOOST_CHECK(raw_txs[0]->GetHash() == hashParentTx);
203 const std::vector<Wtxid> wtx_id_list{
207 raw_txs = mining->getTransactionsByWitnessID(wtx_id_list);
208 BOOST_REQUIRE_EQUAL(raw_txs.size(), tx_id_list.size());
210 BOOST_CHECK(raw_txs[0]->GetHash() == hashParentTx);
212 block_template = mining->createNewBlock(options,
false);
213 BOOST_REQUIRE(block_template);
214 block = block_template->getBlock();
215 BOOST_REQUIRE_EQUAL(block.vtx.size(), 4U);
216 BOOST_CHECK(block.vtx[1]->GetHash() == hashParentTx);
217 BOOST_CHECK(block.vtx[2]->GetHash() == hashHighFeeTx);
218 BOOST_CHECK(block.vtx[3]->GetHash() == hashMediumFeeTx);
226 const auto combined_txs_fee = parent_tx.GetFee() + high_fee_tx.GetFee();
227 const auto combined_txs_size = parent_tx.GetTxSize() + high_fee_tx.GetTxSize();
228 FeeFrac package_feefrac{combined_txs_fee, combined_txs_size};
230 BOOST_CHECK(block_package_feerates[0] == package_feefrac);
233 FeeFrac medium_tx_feefrac{medium_fee_tx.GetFee(), medium_fee_tx.GetTxSize()};
234 BOOST_CHECK(block_package_feerates[1] == medium_tx_feefrac);
237 tx.
vin[0].prevout.hash = hashHighFeeTx;
238 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
247 tx.
vin[0].prevout.hash = hashFreeTx;
248 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000 - feeToUse;
253 should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
254 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
256 block = block_template->getBlock();
258 for (
size_t i=0; i<block.vtx.size(); ++i) {
259 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx);
260 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx);
267 tx.
vout[0].nValue -= 2;
272 block_template = block_template->waitNext({.fee_threshold = 1});
273 BOOST_REQUIRE(block_template);
274 block = block_template->getBlock();
275 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
276 BOOST_CHECK(block.vtx[4]->GetHash() == hashFreeTx);
277 BOOST_CHECK(block.vtx[5]->GetHash() == hashLowFeeTx);
282 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
284 tx.
vout[0].nValue = 5000000000LL - 100000000;
285 tx.
vout[1].nValue = 100000000;
294 tx.
vin[0].prevout.hash = hashFreeTx2;
297 tx.
vout[0].nValue = 5000000000LL - 100000000 - feeToUse;
300 block_template = mining->createNewBlock(options,
false);
301 BOOST_REQUIRE(block_template);
302 block = block_template->getBlock();
305 for (
size_t i=0; i<block.vtx.size(); ++i) {
306 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx2);
307 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx2);
312 tx.
vin[0].prevout.n = 1;
313 tx.
vout[0].nValue = 100000000 - 10000;
315 block_template = mining->createNewBlock(options,
false);
316 BOOST_REQUIRE(block_template);
317 block = block_template->getBlock();
318 BOOST_REQUIRE_EQUAL(block.vtx.size(), 9U);
319 BOOST_CHECK(block.vtx[8]->GetHash() == hashLowFeeTx2);
328 tx.
vin[0].prevout = input;
330 tx.
vout.resize(num_outputs);
340 std::vector<CTransactionRef>
ret;
347 tx.
vin[0].prevout.hash = first_tx->GetHash();
348 tx.
vin[0].prevout.n = 0;
351 out.nValue = first_tx->vout[0].nValue / 50;
357 ret.push_back(parent_tx);
363 for (
unsigned int i = 0; i < 50; ++i) {
369void MinerTestingSetup::TestSigOpsAdjustedWeightChunkLimit(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
372 BOOST_REQUIRE(mining);
380 BOOST_REQUIRE(sigop_entry.GetAdjustedWeight() > sigop_entry.GetTxWeight());
387 .coinbase_output_script = scriptPubKey,
389 const CBlock block{mining->createNewBlock(options,
false)->getBlock()};
394void MinerTestingSetup::TestBasicMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst,
int baseheight)
410 BOOST_REQUIRE(mining);
421 auto block_template{mining->createNewBlock(options,
false)};
422 BOOST_REQUIRE(block_template);
423 CBlock block{block_template->getBlock()};
427 int64_t legacy_sigops = 0;
428 for (
auto& t : txs) {
433 BOOST_CHECK(tx_mempool.GetIter(
t->GetHash()).has_value());
435 assert(tx_mempool.mapTx.size() == 51);
436 assert(legacy_sigops == 20001);
445 assert(tx_mempool.mapTx.empty());
448 auto block_template{mining->createNewBlock(options,
false)};
449 BOOST_REQUIRE(block_template);
450 CBlock block{block_template->getBlock()};
454 int64_t legacy_sigops = 0;
455 for (
auto& t : txs) {
458 BOOST_CHECK(tx_mempool.GetIter(
t->GetHash()).has_value());
460 assert(tx_mempool.mapTx.size() == 51);
461 assert(legacy_sigops == 20001);
463 BOOST_REQUIRE(mining->createNewBlock(options,
false));
473 tx.
vout[0].nValue = BLOCKSUBSIDY;
475 std::vector<unsigned char> vchData(520);
476 for (
unsigned int i = 0; i < 18; ++i) {
482 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
483 tx.
vin[0].prevout.n = 0;
484 tx.
vout[0].nValue = BLOCKSUBSIDY;
485 for (
unsigned int i = 0; i < 63; ++i) {
486 tx.
vout[0].nValue -= LOWFEE;
491 tx.
vin[0].prevout.hash = hash;
493 BOOST_REQUIRE(mining->createNewBlock(options,
false));
512 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
513 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
516 tx.
vin[0].prevout.hash = hash;
519 tx.
vin[1].prevout.hash = txFirst[0]->GetHash();
520 tx.
vin[1].prevout.n = 0;
521 tx.
vout[0].nValue = tx.
vout[0].nValue + BLOCKSUBSIDY - HIGHERFEE;
524 BOOST_REQUIRE(mining->createNewBlock(options,
false));
533 tx.
vin[0].prevout.SetNull();
535 tx.
vout[0].nValue = 0;
548 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
550 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
577 BOOST_REQUIRE(mining->createNewBlock(options,
false));
589 BOOST_REQUIRE(mining->createNewBlock(options,
false));
592 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
593 tx.
vin[0].prevout.n = 0;
595 tx.
vout[0].nValue = BLOCKSUBSIDY - LOWFEE;
600 tx.
vin[0].prevout.hash = hash;
602 tx.
vout[0].nValue -= LOWFEE;
624 std::vector<int> prevheights;
629 prevheights.resize(1);
630 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
631 tx.
vin[0].prevout.n = 0;
634 prevheights[0] = baseheight + 1;
636 tx.
vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
650 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
652 prevheights[0] = baseheight + 2;
658 const int SEQUENCE_LOCK_TIME = 512;
668 ancestor->nTime -= SEQUENCE_LOCK_TIME;
672 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
674 prevheights[0] = baseheight + 3;
687 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
689 prevheights.resize(1);
690 prevheights[0] = baseheight + 4;
698 tx.
vin[0].prevout.hash = hash;
699 prevheights[0] =
m_node.
chainman->ActiveChain().Tip()->nHeight + 1;
701 tx.
vin[0].nSequence = 0;
704 tx.
vin[0].nSequence = 1;
711 auto block_template = mining->createNewBlock(options,
false);
712 BOOST_REQUIRE(block_template);
718 CBlock block{block_template->getBlock()};
723 ancestor->nTime += SEQUENCE_LOCK_TIME;
728 block_template = mining->createNewBlock(options,
false);
729 BOOST_REQUIRE(block_template);
730 block = block_template->getBlock();
734void MinerTestingSetup::TestPrioritisedMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
737 BOOST_REQUIRE(mining);
751 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
752 tx.
vin[0].prevout.n = 0;
755 tx.
vout[0].nValue = 5000000000LL;
758 tx_mempool.PrioritiseTransaction(hashFreePrioritisedTx, 5 *
COIN);
760 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
761 tx.
vin[0].prevout.n = 0;
762 tx.
vout[0].nValue = 5000000000LL - 1000;
768 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
769 tx.
vout[0].nValue = 5000000000LL - 10000;
772 tx_mempool.PrioritiseTransaction(hashMediumFeeTx, -5 *
COIN);
775 tx.
vin[0].prevout.hash = hashParentTx;
776 tx.
vout[0].nValue = 5000000000LL - 1000 - 1000;
779 tx_mempool.PrioritiseTransaction(hashPrioritsedChild, 2 *
COIN);
787 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
788 tx.
vout[0].nValue = 5000000000LL;
791 tx_mempool.PrioritiseTransaction(hashFreeParent, 10 *
COIN);
793 tx.
vin[0].prevout.hash = hashFreeParent;
794 tx.
vout[0].nValue = 5000000000LL;
797 tx_mempool.PrioritiseTransaction(hashFreeChild, 1 *
COIN);
799 tx.
vin[0].prevout.hash = hashFreeChild;
800 tx.
vout[0].nValue = 5000000000LL;
804 auto block_template = mining->createNewBlock(options,
false);
805 BOOST_REQUIRE(block_template);
806 CBlock block{block_template->getBlock()};
807 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
808 BOOST_CHECK(block.vtx[1]->GetHash() == hashFreeParent);
809 BOOST_CHECK(block.vtx[2]->GetHash() == hashFreePrioritisedTx);
810 BOOST_CHECK(block.vtx[3]->GetHash() == hashParentTx);
811 BOOST_CHECK(block.vtx[4]->GetHash() == hashPrioritsedChild);
812 BOOST_CHECK(block.vtx[5]->GetHash() == hashFreeChild);
813 for (
size_t i=0; i<block.vtx.size(); ++i) {
815 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeGrandchild);
817 BOOST_CHECK(block.vtx[i]->GetHash() != hashMediumFeeTx);
825 BOOST_REQUIRE(mining);
828 CScript scriptPubKey =
CScript() <<
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex <<
OP_CHECKSIG;
834 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options,
false);
835 BOOST_REQUIRE(block_template);
841 HasReason(
"block_reserved_weight (8000) exceeds block_max_weight (7999)"));
844 CBlock block{block_template->getBlock()};
848 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = false}, reason, debug));
849 BOOST_REQUIRE_EQUAL(reason,
"bad-txnmrklroot");
850 BOOST_REQUIRE_EQUAL(debug,
"hashMerkleRoot mismatch");
858 BOOST_REQUIRE(mining->checkBlock(block, {.check_pow = false}, reason, debug));
859 BOOST_REQUIRE_EQUAL(reason,
"");
860 BOOST_REQUIRE_EQUAL(debug,
"");
872 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = true}, reason, debug));
873 BOOST_REQUIRE_EQUAL(reason,
"high-hash");
874 BOOST_REQUIRE_EQUAL(debug,
"proof of work failed");
880 static_assert(std::size(
BLOCKINFO) == 110,
"Should have 110 blocks to import");
882 std::vector<CTransactionRef> txFirst;
892 block_template = mining->createNewBlock(options,
false);
893 BOOST_REQUIRE(block_template);
896 CBlock block{block_template->getBlock()};
904 txCoinbase.
vout.resize(1);
907 if (txFirst.size() == 0)
909 if (txFirst.size() < 4)
910 txFirst.push_back(block.vtx[0]);
912 block.nNonce = bi.nonce;
916 std::string reason{
"stale reason"};
917 std::string debug{
"stale debug"};
919 BOOST_REQUIRE(mining->submitBlock(block, reason, debug));
920 BOOST_REQUIRE_EQUAL(reason,
"");
921 BOOST_REQUIRE_EQUAL(debug,
"");
923 reason =
"stale reason";
924 debug =
"stale debug";
925 BOOST_REQUIRE(!mining->submitBlock(block, reason, debug));
926 BOOST_REQUIRE_EQUAL(reason,
"duplicate");
927 BOOST_REQUIRE_EQUAL(debug,
"");
929 reason =
"stale reason";
930 debug =
"stale debug";
931 BOOST_REQUIRE(block_template->submitSolution(block.nVersion, block.nTime, block.nNonce,
MakeTransactionRef(txCoinbase), reason, debug));
932 BOOST_REQUIRE_EQUAL(reason,
"");
933 BOOST_REQUIRE_EQUAL(debug,
"");
934 BOOST_CHECK_THROW(block_template->submitSolutionOld7(block.nVersion, block.nTime, block.nNonce,
943 BOOST_REQUIRE_EQUAL(maybe_new_tip->GetBlockHash(), block.GetHash());
946 block_template = block_template->waitNext();
947 BOOST_REQUIRE(block_template);
950 mining->waitTipChanged(block.hashPrevBlock);
956 TestBasicMining(scriptPubKey, txFirst, baseheight);
960 TestPackageSelection(scriptPubKey, txFirst);
964 TestPrioritisedMining(scriptPubKey, txFirst);
966 TestSigOpsAdjustedWeightChunkLimit(scriptPubKey, txFirst);
974 auto block_template = block_template_manager.CreateNewTemplate(options);
975 BOOST_REQUIRE(block_template);
976 const CBlock& block{block_template->block};
982 BOOST_CHECK(block_template->vTxSigOpsCost.empty());
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
int64_t CAmount
Amount in satoshis (Can be negative)
constexpr CAmount COIN
The amount of satoshis in one BTC.
TryAddToMempool(pool, CTxMemPoolEntry(tx, fee, 0, 1, 0, false, 4, lp))
#define Assert(val)
Identity function.
The block chain is a tree shaped structure starting with the genesis block at the root,...
CBlockIndex * pprev
pointer to the index of the predecessor of this block
void BuildSkip()
Build the skiplist pointer for this entry.
uint256 GetBlockHash() const
int nHeight
height of the entry in the chain. The genesis block has height 0
static constexpr int nMedianTimeSpan
const uint256 * phashBlock
pointer to the hash of the block, if any. Memory is owned by this CBlockIndex
CCoinsView that brings transactions from a mempool into view.
Fee rate in satoshis per virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac.
CAmount GetFee(int32_t virtual_bytes) const
Return the fee in satoshis for the given vsize in vbytes.
An outpoint - a combination of a transaction hash and an index n into its vout.
Serialized script, used inside transaction inputs and outputs.
The basic transaction that is broadcasted on the network and contained in blocks.
static constexpr int SEQUENCE_LOCKTIME_GRANULARITY
In order to use the same number of bits to encode roughly the same wall-clock duration,...
static constexpr uint32_t SEQUENCE_LOCKTIME_TYPE_FLAG
If CTxIn::nSequence encodes a relative lock-time and this flag is set, the relative lock-time has uni...
static constexpr uint32_t MAX_SEQUENCE_NONFINAL
This is the maximum sequence number that enables both nLockTime and OP_CHECKLOCKTIMEVERIFY (BIP 65).
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Helper to initialize the global NodeClock, let a duration elapse, and reset it after use in a test.
void set(NodeSeconds t)
Set mocktime.
BOOST_CHECK_EXCEPTION predicates to check the specific validation error.
Block template interface.
Interface giving clients (RPC, Stratum v2 Template Provider in the future) ability to create block te...
const uint256 & ToUint256() const LIFETIMEBOUND
static transaction_identifier FromUint256(const uint256 &id)
static const uint256 ZERO
uint32_t current_height
Current height in the simulation.
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
constexpr unsigned int LOCKTIME_VERIFY_SEQUENCE
Flags for nSequence and nLockTime locks.
constexpr int64_t MAX_BLOCK_SIGOPS_COST
The maximum allowed number of signature check operations in a block (network rule)
constexpr int WITNESS_SCALE_FACTOR
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
BOOST_CHECK_EQUAL(headers.FindFirst("key"), "value")
BOOST_CHECK_EXCEPTION(HTTPHeaders{}.Read(reader), std::runtime_error, HasReason{"Empty HTTP header name"})
@ REPLACED
Removed for replacement.
std::vector< CTransactionRef > CreateBigSigOpsCluster(const CTransactionRef &first_tx)
BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
static CMutableTransaction CreateBigSigOpsTx(const COutPoint &input, unsigned int num_outputs)
static std::unique_ptr< CBlockIndex > CreateBlockIndex(int nHeight, CBlockIndex *active_chain_tip) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
static constexpr struct @14 BLOCKINFO[]
static CFeeRate blockMinFeeRate
is used externally by mining IPC clients, so it should only declare simple data definitions.
std::unique_ptr< Mining > MakeMining(const node::NodeContext &node, bool wait_loaded=true)
Return implementation of Mining interface.
""_hex is a compile-time user-defined literal returning a std::array<std::byte>, equivalent to ParseH...
#define BOOST_CHECK_THROW(stmt, excMatch)
#define BOOST_CHECK(expr)
constexpr unsigned int DEFAULT_BLOCK_MIN_TX_FEE
Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by min...
constexpr unsigned int DEFAULT_BLOCK_RESERVED_WEIGHT
Default for -blockreservedweight.
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params ¶ms)
Check whether a block hash satisfies the proof-of-work requirement specified by nBits.
constexpr TransactionSerParams TX_WITH_WITNESS
static CTransactionRef MakeTransactionRef(Tx &&txIn)
std::shared_ptr< const CTransaction > CTransactionRef
uint64_t GetSerializeSize(const T &t)
A mutable version of CTransaction.
std::vector< CTxOut > vout
Txid GetHash() const
Compute the hash of this CMutableTransaction.
void CreateBlockTemplateManager()
Create the block template manager.
Data structure storing a fee and size.
TestMemPoolEntryHelper & SigOpsCost(unsigned int _sigopsCost)
TestMemPoolEntryHelper & Time(NodeSeconds tp)
CTxMemPoolEntry FromTx(const CMutableTransaction &tx) const
TestMemPoolEntryHelper & SpendsCoinbase(bool _flag)
TestMemPoolEntryHelper & Fee(CAmount _fee)
Testing setup that configures a complete environment.
std::unique_ptr< Mining > MakeMining()
CTxMemPool & MakeMempool()
void TestPackageSelection(const CScript &scriptPubKey, const std::vector< CTransactionRef > &txFirst) EXCLUSIVE_LOCKS_REQUIRED(void TestBasicMining(const CScript &scriptPubKey, const std::vector< CTransactionRef > &txFirst, int baseheight) EXCLUSIVE_LOCKS_REQUIRED(void TestPrioritisedMining(const CScript &scriptPubKey, const std::vector< CTransactionRef > &txFirst) EXCLUSIVE_LOCKS_REQUIRED(void TestSigOpsAdjustedWeightChunkLimit(const CScript &scriptPubKey, const std::vector< CTransactionRef > &txFirst) EXCLUSIVE_LOCKS_REQUIRED(bool TestSequenceLocks(const CTransaction &tx, CTxMemPool &tx_mempool) EXCLUSIVE_LOCKS_REQUIRED(
Block template creation options.
CScript coinbase_output_script
Script to put in the coinbase transaction.
bool use_mempool
Set false to omit mempool transactions.
std::optional< uint64_t > block_max_weight
Maximum block weight, defaults to -maxblockweight.
std::unique_ptr< CTxMemPool > mempool
std::unique_ptr< BlockTemplateManager > block_template_manager
Must be destroyed before its dependencies (holds references to them).
std::unique_ptr< ChainstateManager > chainman
CTxMemPool::Options MemPoolOptionsForTest(const NodeContext &node)
#define EXCLUSIVE_LOCKS_REQUIRED(...)
void BulkTransaction(CMutableTransaction &tx, int32_t target_weight)
unsigned int GetLegacySigOpCount(const CTransaction &tx)
Auxiliary functions for transaction validation (ideally should not be exposed)
bool SequenceLocks(const CTransaction &tx, int flags, std::vector< int > &prevHeights, const CBlockIndex &block)
Check if transaction is final per BIP 68 sequence numbers and can be included in a block.
bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
Check if transaction is final and can be included in a block with the specified height and time.
std::chrono::duration< double, std::chrono::milliseconds::period > MillisecondsDouble
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx)
bool CheckSequenceLocksAtTip(CBlockIndex *tip, const LockPoints &lock_points)
Check if transaction will be BIP68 final in the next block to be created on top of tip.
bool CheckFinalTxAtTip(const CBlockIndex &active_chain_tip, const CTransaction &tx) EXCLUSIVE_LOCKS_REQUIRED(std::optional< LockPoints > CalculateLockPointsAtTip(CBlockIndex *tip, const CCoinsView &coins_view, const CTransaction &tx)
Check if transaction will be final in the next block to be created.
constexpr int32_t VERSIONBITS_TOP_BITS
What bits to set in version for versionbits blocks.