37#include <validation.h>
38#include <versionbits.h>
40#include <boost/test/unit_test.hpp>
81 opts.limits.cluster_size_vbytes = 1'200'000;
97constexpr static struct {
100}
BLOCKINFO[]{{0, 3552706918}, {500, 37506755}, {1000, 948987788}, {400, 524762339}, {800, 258510074}, {300, 102309278},
101 {1300, 54365202}, {600, 1107740426}, {1000, 203094491}, {900, 391178848}, {800, 381177271}, {600, 87188412},
102 {0, 66522866}, {800, 874942736}, {1000, 89200838}, {400, 312638088}, {400, 66263693}, {500, 924648304},
103 {400, 369913599}, {500, 47630099}, {500, 115045364}, {100, 277026602}, {1100, 809621409}, {700, 155345322},
104 {800, 943579953}, {400, 28200730}, {900, 77200495}, {0, 105935488}, {400, 698721821}, {500, 111098863},
105 {1300, 445389594}, {500, 621849894}, {1400, 56010046}, {1100, 370669776}, {1200, 380301940}, {1200, 110654905},
106 {400, 213771024}, {1500, 120014726}, {1200, 835019014}, {1500, 624817237}, {900, 1404297}, {400, 189414558},
107 {400, 293178348}, {1100, 15393789}, {600, 396764180}, {800, 1387046371}, {800, 199368303}, {700, 111496662},
108 {100, 129759616}, {200, 536577982}, {500, 125881300}, {500, 101053391}, {1200, 471590548}, {900, 86957729},
109 {1200, 179604104}, {600, 68658642}, {1000, 203295701}, {500, 139615361}, {900, 233693412}, {300, 153225163},
110 {0, 27616254}, {1200, 9856191}, {100, 220392722}, {200, 66257599}, {1100, 145489641}, {1300, 37859442},
111 {400, 5816075}, {1200, 215752117}, {1400, 32361482}, {1400, 6529223}, {500, 143332977}, {800, 878392},
112 {700, 159290408}, {400, 123197595}, {700, 43988693}, {300, 304224916}, {700, 214771621}, {1100, 274148273},
113 {400, 285632418}, {1100, 923451065}, {600, 12818092}, {1200, 736282054}, {1000, 246683167}, {600, 92950402},
114 {1400, 29223405}, {1000, 841327192}, {700, 174301283}, {1400, 214009854}, {1000, 6989517}, {1200, 278226956},
115 {700, 540219613}, {400, 93663104}, {1100, 152345635}, {1500, 464194499}, {1300, 333850111}, {600, 258311263},
116 {600, 90173162}, {1000, 33590797}, {1500, 332866027}, {100, 204704427}, {1000, 463153545}, {800, 303244785},
117 {600, 88096214}, {0, 137477892}, {1200, 195514506}, {300, 704114595}, {900, 292087369}, {1400, 758684870},
118 {1300, 163493028}, {1200, 53151293}};
122 auto index{std::make_unique<CBlockIndex>()};
124 index->pprev = active_chain_tip;
131void MinerTestingSetup::TestPackageSelection(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
143 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options,
false);
144 BOOST_REQUIRE(block_template);
145 CBlock block{block_template->getBlock()};
146 BOOST_REQUIRE_EQUAL(block.vtx.size(), 1U);
149 auto should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
150 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
153 block_template = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 0});
154 BOOST_REQUIRE(block_template);
164 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
165 tx.
vin[0].prevout.n = 0;
167 tx.
vout[0].nValue = 5000000000LL - 1000;
174 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
175 tx.
vout[0].nValue = 5000000000LL - 10000;
181 tx.
vin[0].prevout.hash = hashParentTx;
182 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
187 block_template = mining->createNewBlock(options,
false);
188 BOOST_REQUIRE(block_template);
189 block = block_template->getBlock();
190 BOOST_REQUIRE_EQUAL(block.vtx.size(), 4U);
191 BOOST_CHECK(block.vtx[1]->GetHash() == hashParentTx);
192 BOOST_CHECK(block.vtx[2]->GetHash() == hashHighFeeTx);
193 BOOST_CHECK(block.vtx[3]->GetHash() == hashMediumFeeTx);
201 }.CreateNewBlock()->m_package_feerates;
205 const auto combined_txs_fee = parent_tx.GetFee() + high_fee_tx.GetFee();
206 const auto combined_txs_size = parent_tx.GetTxSize() + high_fee_tx.GetTxSize();
207 FeeFrac package_feefrac{combined_txs_fee, combined_txs_size};
209 BOOST_CHECK(block_package_feerates[0] == package_feefrac);
212 FeeFrac medium_tx_feefrac{medium_fee_tx.GetFee(), medium_fee_tx.GetTxSize()};
213 BOOST_CHECK(block_package_feerates[1] == medium_tx_feefrac);
216 tx.
vin[0].prevout.hash = hashHighFeeTx;
217 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
226 tx.
vin[0].prevout.hash = hashFreeTx;
227 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000 - feeToUse;
232 should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
233 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
235 block = block_template->getBlock();
237 for (
size_t i=0; i<block.vtx.size(); ++i) {
238 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx);
239 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx);
246 tx.
vout[0].nValue -= 2;
251 block_template = block_template->waitNext({.fee_threshold = 1});
252 BOOST_REQUIRE(block_template);
253 block = block_template->getBlock();
254 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
255 BOOST_CHECK(block.vtx[4]->GetHash() == hashFreeTx);
256 BOOST_CHECK(block.vtx[5]->GetHash() == hashLowFeeTx);
261 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
263 tx.
vout[0].nValue = 5000000000LL - 100000000;
264 tx.
vout[1].nValue = 100000000;
273 tx.
vin[0].prevout.hash = hashFreeTx2;
276 tx.
vout[0].nValue = 5000000000LL - 100000000 - feeToUse;
279 block_template = mining->createNewBlock(options,
false);
280 BOOST_REQUIRE(block_template);
281 block = block_template->getBlock();
284 for (
size_t i=0; i<block.vtx.size(); ++i) {
285 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx2);
286 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx2);
291 tx.
vin[0].prevout.n = 1;
292 tx.
vout[0].nValue = 100000000 - 10000;
294 block_template = mining->createNewBlock(options,
false);
295 BOOST_REQUIRE(block_template);
296 block = block_template->getBlock();
297 BOOST_REQUIRE_EQUAL(block.vtx.size(), 9U);
298 BOOST_CHECK(block.vtx[8]->GetHash() == hashLowFeeTx2);
303 std::vector<CTransactionRef>
ret;
310 tx.
vin[0].prevout.hash = first_tx->GetHash();
311 tx.
vin[0].prevout.n = 0;
314 out.nValue = first_tx->vout[0].nValue / 50;
320 ret.push_back(parent_tx);
326 for (
unsigned int i = 0; i < 50; ++i) {
329 tx2.vin[0].prevout.hash = parent_tx->GetHash();
330 tx2.vin[0].prevout.n = i;
333 tx2.vout[0].nValue = parent_tx->vout[i].nValue -
CENT;
334 for (
auto &
out : tx2.vout) {
343void MinerTestingSetup::TestBasicMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst,
int baseheight)
359 BOOST_REQUIRE(mining);
370 auto block_template{mining->createNewBlock(options,
false)};
371 BOOST_REQUIRE(block_template);
372 CBlock block{block_template->getBlock()};
376 int64_t legacy_sigops = 0;
377 for (
auto& t : txs) {
382 BOOST_CHECK(tx_mempool.GetIter(
t->GetHash()).has_value());
384 assert(tx_mempool.mapTx.size() == 51);
385 assert(legacy_sigops == 20001);
386 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options,
false), std::runtime_error,
HasReason(
"bad-blk-sigops"));
394 assert(tx_mempool.mapTx.empty());
397 auto block_template{mining->createNewBlock(options,
false)};
398 BOOST_REQUIRE(block_template);
399 CBlock block{block_template->getBlock()};
403 int64_t legacy_sigops = 0;
404 for (
auto& t : txs) {
407 BOOST_CHECK(tx_mempool.GetIter(
t->GetHash()).has_value());
409 assert(tx_mempool.mapTx.size() == 51);
410 assert(legacy_sigops == 20001);
412 BOOST_REQUIRE(mining->createNewBlock(options,
false));
422 tx.
vout[0].nValue = BLOCKSUBSIDY;
424 std::vector<unsigned char> vchData(520);
425 for (
unsigned int i = 0; i < 18; ++i) {
431 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
432 tx.
vin[0].prevout.n = 0;
433 tx.
vout[0].nValue = BLOCKSUBSIDY;
434 for (
unsigned int i = 0; i < 63; ++i) {
435 tx.
vout[0].nValue -= LOWFEE;
440 tx.
vin[0].prevout.hash = hash;
442 BOOST_REQUIRE(mining->createNewBlock(options,
false));
452 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options,
false), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
461 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
462 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
465 tx.
vin[0].prevout.hash = hash;
468 tx.
vin[1].prevout.hash = txFirst[0]->GetHash();
469 tx.
vin[1].prevout.n = 0;
470 tx.
vout[0].nValue = tx.
vout[0].nValue + BLOCKSUBSIDY - HIGHERFEE;
473 BOOST_REQUIRE(mining->createNewBlock(options,
false));
482 tx.
vin[0].prevout.SetNull();
484 tx.
vout[0].nValue = 0;
489 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options,
false), std::runtime_error,
HasReason(
"bad-cb-multiple"));
497 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
499 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
506 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options,
false), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
526 BOOST_REQUIRE(mining->createNewBlock(options,
false));
538 BOOST_REQUIRE(mining->createNewBlock(options,
false));
541 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
542 tx.
vin[0].prevout.n = 0;
544 tx.
vout[0].nValue = BLOCKSUBSIDY - LOWFEE;
549 tx.
vin[0].prevout.hash = hash;
551 tx.
vout[0].nValue -= LOWFEE;
554 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options,
false), std::runtime_error,
HasReason(
"block-script-verify-flag-failed"));
570 clock.set(std::chrono::seconds{
m_node.
chainman->ActiveChain().Tip()->GetMedianTimePast() + 1});
573 std::vector<int> prevheights;
578 prevheights.resize(1);
579 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
580 tx.
vin[0].prevout.n = 0;
583 prevheights[0] = baseheight + 1;
585 tx.
vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
599 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
601 prevheights[0] = baseheight + 2;
607 const int SEQUENCE_LOCK_TIME = 512;
617 ancestor->nTime -= SEQUENCE_LOCK_TIME;
621 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
623 prevheights[0] = baseheight + 3;
636 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
638 prevheights.resize(1);
639 prevheights[0] = baseheight + 4;
647 tx.
vin[0].prevout.hash = hash;
648 prevheights[0] =
m_node.
chainman->ActiveChain().Tip()->nHeight + 1;
650 tx.
vin[0].nSequence = 0;
653 tx.
vin[0].nSequence = 1;
660 auto block_template = mining->createNewBlock(options,
false);
661 BOOST_REQUIRE(block_template);
667 CBlock block{block_template->getBlock()};
672 ancestor->nTime += SEQUENCE_LOCK_TIME;
675 clock.set(std::chrono::seconds{
m_node.
chainman->ActiveChain().Tip()->GetMedianTimePast() + 1});
677 block_template = mining->createNewBlock(options,
false);
678 BOOST_REQUIRE(block_template);
679 block = block_template->getBlock();
683void MinerTestingSetup::TestPrioritisedMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
686 BOOST_REQUIRE(mining);
700 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
701 tx.
vin[0].prevout.n = 0;
704 tx.
vout[0].nValue = 5000000000LL;
707 tx_mempool.PrioritiseTransaction(hashFreePrioritisedTx, 5 *
COIN);
709 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
710 tx.
vin[0].prevout.n = 0;
711 tx.
vout[0].nValue = 5000000000LL - 1000;
717 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
718 tx.
vout[0].nValue = 5000000000LL - 10000;
721 tx_mempool.PrioritiseTransaction(hashMediumFeeTx, -5 *
COIN);
724 tx.
vin[0].prevout.hash = hashParentTx;
725 tx.
vout[0].nValue = 5000000000LL - 1000 - 1000;
728 tx_mempool.PrioritiseTransaction(hashPrioritsedChild, 2 *
COIN);
736 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
737 tx.
vout[0].nValue = 5000000000LL;
740 tx_mempool.PrioritiseTransaction(hashFreeParent, 10 *
COIN);
742 tx.
vin[0].prevout.hash = hashFreeParent;
743 tx.
vout[0].nValue = 5000000000LL;
746 tx_mempool.PrioritiseTransaction(hashFreeChild, 1 *
COIN);
748 tx.
vin[0].prevout.hash = hashFreeChild;
749 tx.
vout[0].nValue = 5000000000LL;
753 auto block_template = mining->createNewBlock(options,
false);
754 BOOST_REQUIRE(block_template);
755 CBlock block{block_template->getBlock()};
756 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
757 BOOST_CHECK(block.vtx[1]->GetHash() == hashFreeParent);
758 BOOST_CHECK(block.vtx[2]->GetHash() == hashFreePrioritisedTx);
759 BOOST_CHECK(block.vtx[3]->GetHash() == hashParentTx);
760 BOOST_CHECK(block.vtx[4]->GetHash() == hashPrioritsedChild);
761 BOOST_CHECK(block.vtx[5]->GetHash() == hashFreeChild);
762 for (
size_t i=0; i<block.vtx.size(); ++i) {
764 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeGrandchild);
766 BOOST_CHECK(block.vtx[i]->GetHash() != hashMediumFeeTx);
774 BOOST_REQUIRE(mining);
777 CScript scriptPubKey =
CScript() <<
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex <<
OP_CHECKSIG;
783 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options,
false);
784 BOOST_REQUIRE(block_template);
788 BOOST_CHECK_EXCEPTION(mining->createNewBlock(invalid_options,
false),
790 HasReason(
"block_reserved_weight (8000) exceeds block_max_weight (7999)"));
793 CBlock block{block_template->getBlock()};
797 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = false}, reason, debug));
798 BOOST_REQUIRE_EQUAL(reason,
"bad-txnmrklroot");
799 BOOST_REQUIRE_EQUAL(debug,
"hashMerkleRoot mismatch");
807 BOOST_REQUIRE(mining->checkBlock(block, {.check_pow = false}, reason, debug));
808 BOOST_REQUIRE_EQUAL(reason,
"");
809 BOOST_REQUIRE_EQUAL(debug,
"");
821 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = true}, reason, debug));
822 BOOST_REQUIRE_EQUAL(reason,
"high-hash");
823 BOOST_REQUIRE_EQUAL(debug,
"proof of work failed");
829 static_assert(std::size(
BLOCKINFO) == 110,
"Should have 110 blocks to import");
831 std::vector<CTransactionRef> txFirst;
833 const int current_height{mining->getTip()->height};
840 if (current_height % 2 == 0) {
841 block_template = mining->createNewBlock(options,
false);
842 BOOST_REQUIRE(block_template);
845 CBlock block{block_template->getBlock()};
852 txCoinbase.
vin[0].scriptSig =
CScript{} << (current_height + 1) << bi.extranonce;
853 txCoinbase.
vout.resize(1);
856 if (txFirst.size() == 0)
857 baseheight = current_height;
858 if (txFirst.size() < 4)
859 txFirst.push_back(block.vtx[0]);
861 block.nNonce = bi.nonce;
865 if (current_height % 2 == 0) {
866 std::string reason{
"stale reason"};
867 std::string debug{
"stale debug"};
868 BOOST_REQUIRE(mining->submitBlock(block, reason, debug));
869 BOOST_REQUIRE_EQUAL(reason,
"");
870 BOOST_REQUIRE_EQUAL(debug,
"");
872 reason =
"stale reason";
873 debug =
"stale debug";
874 BOOST_REQUIRE(!mining->submitBlock(block, reason, debug));
875 BOOST_REQUIRE_EQUAL(reason,
"duplicate");
876 BOOST_REQUIRE_EQUAL(debug,
"");
878 BOOST_REQUIRE(block_template->submitSolution(block.nVersion, block.nTime, block.nNonce,
MakeTransactionRef(txCoinbase)));
885 BOOST_REQUIRE_EQUAL(maybe_new_tip->GetBlockHash(), block.GetHash());
887 if (current_height % 2 == 0) {
888 block_template = block_template->waitNext();
889 BOOST_REQUIRE(block_template);
892 mining->waitTipChanged(block.hashPrevBlock);
898 TestBasicMining(scriptPubKey, txFirst, baseheight);
902 TestPackageSelection(scriptPubKey, txFirst);
906 TestPrioritisedMining(scriptPubKey, txFirst);
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
int64_t CAmount
Amount in satoshis (Can be negative)
static 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.
Serialized script, used inside transaction inputs and outputs.
The basic transaction that is broadcasted on the network and contained in blocks.
static const uint32_t MAX_SEQUENCE_NONFINAL
This is the maximum sequence number that enables both nLockTime and OP_CHECKLOCKTIMEVERIFY (BIP 65).
static const 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 const int SEQUENCE_LOCKTIME_GRANULARITY
In order to use the same number of bits to encode roughly the same wall-clock duration,...
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.
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...
Generate a new block, without valid proof-of-work.
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
static constexpr unsigned int LOCKTIME_VERIFY_SEQUENCE
Flags for nSequence and nLockTime locks.
static const 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()
@ REPLACED
Removed for replacement.
std::vector< CTransactionRef > CreateBigSigOpsCluster(const CTransactionRef &first_tx)
BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
static constexpr struct @13 BLOCKINFO[]
static std::unique_ptr< CBlockIndex > CreateBlockIndex(int nHeight, CBlockIndex *active_chain_tip) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
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_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
static constexpr unsigned int DEFAULT_BLOCK_MIN_TX_FEE
Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by min...
static 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.
static constexpr TransactionSerParams TX_WITH_WITNESS
static CTransactionRef MakeTransactionRef(Tx &&txIn)
std::shared_ptr< const CTransaction > CTransactionRef
uint64_t GetSerializeSize(const T &t)
static constexpr CAmount CENT
A mutable version of CTransaction.
std::vector< CTxOut > vout
Txid GetHash() const
Compute the hash of this CMutableTransaction.
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(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.
std::optional< uint64_t > block_max_weight
Maximum block weight, defaults to -maxblockweight.
BlockCreateOptions mining_args
Mining options used to create block templates.
std::unique_ptr< CTxMemPool > mempool
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.
static const int32_t VERSIONBITS_TOP_BITS
What bits to set in version for versionbits blocks.