24#include <validation.h>
33#include <boost/test/unit_test.hpp>
63 opts.limits.cluster_size_vbytes = 1'200'000;
79constexpr static struct {
82}
BLOCKINFO[]{{0, 3552706918}, {500, 37506755}, {1000, 948987788}, {400, 524762339}, {800, 258510074}, {300, 102309278},
83 {1300, 54365202}, {600, 1107740426}, {1000, 203094491}, {900, 391178848}, {800, 381177271}, {600, 87188412},
84 {0, 66522866}, {800, 874942736}, {1000, 89200838}, {400, 312638088}, {400, 66263693}, {500, 924648304},
85 {400, 369913599}, {500, 47630099}, {500, 115045364}, {100, 277026602}, {1100, 809621409}, {700, 155345322},
86 {800, 943579953}, {400, 28200730}, {900, 77200495}, {0, 105935488}, {400, 698721821}, {500, 111098863},
87 {1300, 445389594}, {500, 621849894}, {1400, 56010046}, {1100, 370669776}, {1200, 380301940}, {1200, 110654905},
88 {400, 213771024}, {1500, 120014726}, {1200, 835019014}, {1500, 624817237}, {900, 1404297}, {400, 189414558},
89 {400, 293178348}, {1100, 15393789}, {600, 396764180}, {800, 1387046371}, {800, 199368303}, {700, 111496662},
90 {100, 129759616}, {200, 536577982}, {500, 125881300}, {500, 101053391}, {1200, 471590548}, {900, 86957729},
91 {1200, 179604104}, {600, 68658642}, {1000, 203295701}, {500, 139615361}, {900, 233693412}, {300, 153225163},
92 {0, 27616254}, {1200, 9856191}, {100, 220392722}, {200, 66257599}, {1100, 145489641}, {1300, 37859442},
93 {400, 5816075}, {1200, 215752117}, {1400, 32361482}, {1400, 6529223}, {500, 143332977}, {800, 878392},
94 {700, 159290408}, {400, 123197595}, {700, 43988693}, {300, 304224916}, {700, 214771621}, {1100, 274148273},
95 {400, 285632418}, {1100, 923451065}, {600, 12818092}, {1200, 736282054}, {1000, 246683167}, {600, 92950402},
96 {1400, 29223405}, {1000, 841327192}, {700, 174301283}, {1400, 214009854}, {1000, 6989517}, {1200, 278226956},
97 {700, 540219613}, {400, 93663104}, {1100, 152345635}, {1500, 464194499}, {1300, 333850111}, {600, 258311263},
98 {600, 90173162}, {1000, 33590797}, {1500, 332866027}, {100, 204704427}, {1000, 463153545}, {800, 303244785},
99 {600, 88096214}, {0, 137477892}, {1200, 195514506}, {300, 704114595}, {900, 292087369}, {1400, 758684870},
100 {1300, 163493028}, {1200, 53151293}};
104 auto index{std::make_unique<CBlockIndex>()};
106 index->pprev = active_chain_tip;
113void MinerTestingSetup::TestPackageSelection(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
117 BlockAssembler::Options options;
118 options.coinbase_output_script = scriptPubKey;
124 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options);
125 BOOST_REQUIRE(block_template);
126 CBlock block{block_template->getBlock()};
127 BOOST_REQUIRE_EQUAL(block.vtx.size(), 1U);
130 auto should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
131 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
134 block_template = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 0});
135 BOOST_REQUIRE(block_template);
145 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
146 tx.
vin[0].prevout.n = 0;
148 tx.
vout[0].nValue = 5000000000LL - 1000;
155 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
156 tx.
vout[0].nValue = 5000000000LL - 10000;
162 tx.
vin[0].prevout.hash = hashParentTx;
163 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
168 block_template = mining->createNewBlock(options);
169 BOOST_REQUIRE(block_template);
170 block = block_template->getBlock();
171 BOOST_REQUIRE_EQUAL(block.vtx.size(), 4U);
172 BOOST_CHECK(block.vtx[1]->GetHash() == hashParentTx);
173 BOOST_CHECK(block.vtx[2]->GetHash() == hashHighFeeTx);
174 BOOST_CHECK(block.vtx[3]->GetHash() == hashMediumFeeTx);
177 const auto block_package_feerates =
BlockAssembler{
m_node.
chainman->ActiveChainstate(), &tx_mempool, options}.CreateNewBlock()->m_package_feerates;
181 const auto combined_txs_fee = parent_tx.GetFee() + high_fee_tx.GetFee();
182 const auto combined_txs_size = parent_tx.GetTxSize() + high_fee_tx.GetTxSize();
183 FeeFrac package_feefrac{combined_txs_fee, combined_txs_size};
185 BOOST_CHECK(block_package_feerates[0] == package_feefrac);
188 FeeFrac medium_tx_feefrac{medium_fee_tx.GetFee(), medium_fee_tx.GetTxSize()};
189 BOOST_CHECK(block_package_feerates[1] == medium_tx_feefrac);
192 tx.
vin[0].prevout.hash = hashHighFeeTx;
193 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
202 tx.
vin[0].prevout.hash = hashFreeTx;
203 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000 - feeToUse;
208 should_be_nullptr = block_template->waitNext({.timeout =
MillisecondsDouble{0}, .fee_threshold = 1});
209 BOOST_REQUIRE(should_be_nullptr ==
nullptr);
211 block = block_template->getBlock();
213 for (
size_t i=0; i<block.vtx.size(); ++i) {
214 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx);
215 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx);
222 tx.
vout[0].nValue -= 2;
227 block_template = block_template->waitNext({.fee_threshold = 1});
228 BOOST_REQUIRE(block_template);
229 block = block_template->getBlock();
230 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
231 BOOST_CHECK(block.vtx[4]->GetHash() == hashFreeTx);
232 BOOST_CHECK(block.vtx[5]->GetHash() == hashLowFeeTx);
237 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
239 tx.
vout[0].nValue = 5000000000LL - 100000000;
240 tx.
vout[1].nValue = 100000000;
249 tx.
vin[0].prevout.hash = hashFreeTx2;
252 tx.
vout[0].nValue = 5000000000LL - 100000000 - feeToUse;
255 block_template = mining->createNewBlock(options);
256 BOOST_REQUIRE(block_template);
257 block = block_template->getBlock();
260 for (
size_t i=0; i<block.vtx.size(); ++i) {
261 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeTx2);
262 BOOST_CHECK(block.vtx[i]->GetHash() != hashLowFeeTx2);
267 tx.
vin[0].prevout.n = 1;
268 tx.
vout[0].nValue = 100000000 - 10000;
270 block_template = mining->createNewBlock(options);
271 BOOST_REQUIRE(block_template);
272 block = block_template->getBlock();
273 BOOST_REQUIRE_EQUAL(block.vtx.size(), 9U);
274 BOOST_CHECK(block.vtx[8]->GetHash() == hashLowFeeTx2);
279 std::vector<CTransactionRef>
ret;
286 tx.
vin[0].prevout.hash = first_tx->GetHash();
287 tx.
vin[0].prevout.n = 0;
290 out.nValue = first_tx->vout[0].nValue / 50;
296 ret.push_back(parent_tx);
302 for (
unsigned int i = 0; i < 50; ++i) {
305 tx2.vin[0].prevout.hash = parent_tx->GetHash();
306 tx2.vin[0].prevout.n = i;
309 tx2.vout[0].nValue = parent_tx->vout[i].nValue -
CENT;
310 for (
auto &
out : tx2.vout) {
319void MinerTestingSetup::TestBasicMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst,
int baseheight)
333 BOOST_REQUIRE(mining);
335 BlockAssembler::Options options;
336 options.coinbase_output_script = scriptPubKey;
343 auto block_template{mining->createNewBlock(options)};
344 BOOST_REQUIRE(block_template);
345 CBlock block{block_template->getBlock()};
349 int64_t legacy_sigops = 0;
350 for (
auto& t : txs) {
355 BOOST_CHECK(tx_mempool.GetIter(
t->GetHash()).has_value());
357 assert(tx_mempool.mapTx.size() == 51);
358 assert(legacy_sigops == 20001);
359 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-blk-sigops"));
367 assert(tx_mempool.mapTx.empty());
370 auto block_template{mining->createNewBlock(options)};
371 BOOST_REQUIRE(block_template);
372 CBlock block{block_template->getBlock()};
376 int64_t legacy_sigops = 0;
377 for (
auto& t : txs) {
380 BOOST_CHECK(tx_mempool.GetIter(
t->GetHash()).has_value());
382 assert(tx_mempool.mapTx.size() == 51);
383 assert(legacy_sigops == 20001);
385 BOOST_REQUIRE(mining->createNewBlock(options));
395 tx.
vout[0].nValue = BLOCKSUBSIDY;
397 std::vector<unsigned char> vchData(520);
398 for (
unsigned int i = 0; i < 18; ++i) {
404 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
405 tx.
vin[0].prevout.n = 0;
406 tx.
vout[0].nValue = BLOCKSUBSIDY;
407 for (
unsigned int i = 0; i < 63; ++i) {
408 tx.
vout[0].nValue -= LOWFEE;
413 tx.
vin[0].prevout.hash = hash;
415 BOOST_REQUIRE(mining->createNewBlock(options));
425 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
434 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
435 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
438 tx.
vin[0].prevout.hash = hash;
441 tx.
vin[1].prevout.hash = txFirst[0]->GetHash();
442 tx.
vin[1].prevout.n = 0;
443 tx.
vout[0].nValue = tx.
vout[0].nValue + BLOCKSUBSIDY - HIGHERFEE;
446 BOOST_REQUIRE(mining->createNewBlock(options));
455 tx.
vin[0].prevout.SetNull();
457 tx.
vout[0].nValue = 0;
462 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-cb-multiple"));
470 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
472 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
479 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
499 BOOST_REQUIRE(mining->createNewBlock(options));
511 BOOST_REQUIRE(mining->createNewBlock(options));
514 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
515 tx.
vin[0].prevout.n = 0;
517 tx.
vout[0].nValue = BLOCKSUBSIDY - LOWFEE;
522 tx.
vin[0].prevout.hash = hash;
524 tx.
vout[0].nValue -= LOWFEE;
527 BOOST_CHECK_EXCEPTION(mining->createNewBlock(options), std::runtime_error,
HasReason(
"block-script-verify-flag-failed"));
546 std::vector<int> prevheights;
551 prevheights.resize(1);
552 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
553 tx.
vin[0].prevout.n = 0;
556 prevheights[0] = baseheight + 1;
558 tx.
vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
572 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
574 prevheights[0] = baseheight + 2;
580 const int SEQUENCE_LOCK_TIME = 512;
590 ancestor->nTime -= SEQUENCE_LOCK_TIME;
594 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
596 prevheights[0] = baseheight + 3;
609 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
611 prevheights.resize(1);
612 prevheights[0] = baseheight + 4;
620 tx.
vin[0].prevout.hash = hash;
621 prevheights[0] =
m_node.
chainman->ActiveChain().Tip()->nHeight + 1;
623 tx.
vin[0].nSequence = 0;
626 tx.
vin[0].nSequence = 1;
633 auto block_template = mining->createNewBlock(options);
634 BOOST_REQUIRE(block_template);
640 CBlock block{block_template->getBlock()};
645 ancestor->nTime += SEQUENCE_LOCK_TIME;
650 block_template = mining->createNewBlock(options);
651 BOOST_REQUIRE(block_template);
652 block = block_template->getBlock();
656void MinerTestingSetup::TestPrioritisedMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
659 BOOST_REQUIRE(mining);
661 BlockAssembler::Options options;
662 options.coinbase_output_script = scriptPubKey;
672 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
673 tx.
vin[0].prevout.n = 0;
676 tx.
vout[0].nValue = 5000000000LL;
679 tx_mempool.PrioritiseTransaction(hashFreePrioritisedTx, 5 *
COIN);
681 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
682 tx.
vin[0].prevout.n = 0;
683 tx.
vout[0].nValue = 5000000000LL - 1000;
689 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
690 tx.
vout[0].nValue = 5000000000LL - 10000;
693 tx_mempool.PrioritiseTransaction(hashMediumFeeTx, -5 *
COIN);
696 tx.
vin[0].prevout.hash = hashParentTx;
697 tx.
vout[0].nValue = 5000000000LL - 1000 - 1000;
700 tx_mempool.PrioritiseTransaction(hashPrioritsedChild, 2 *
COIN);
708 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
709 tx.
vout[0].nValue = 5000000000LL;
712 tx_mempool.PrioritiseTransaction(hashFreeParent, 10 *
COIN);
714 tx.
vin[0].prevout.hash = hashFreeParent;
715 tx.
vout[0].nValue = 5000000000LL;
718 tx_mempool.PrioritiseTransaction(hashFreeChild, 1 *
COIN);
720 tx.
vin[0].prevout.hash = hashFreeChild;
721 tx.
vout[0].nValue = 5000000000LL;
725 auto block_template = mining->createNewBlock(options);
726 BOOST_REQUIRE(block_template);
727 CBlock block{block_template->getBlock()};
728 BOOST_REQUIRE_EQUAL(block.vtx.size(), 6U);
729 BOOST_CHECK(block.vtx[1]->GetHash() == hashFreeParent);
730 BOOST_CHECK(block.vtx[2]->GetHash() == hashFreePrioritisedTx);
731 BOOST_CHECK(block.vtx[3]->GetHash() == hashParentTx);
732 BOOST_CHECK(block.vtx[4]->GetHash() == hashPrioritsedChild);
733 BOOST_CHECK(block.vtx[5]->GetHash() == hashFreeChild);
734 for (
size_t i=0; i<block.vtx.size(); ++i) {
736 BOOST_CHECK(block.vtx[i]->GetHash() != hashFreeGrandchild);
738 BOOST_CHECK(block.vtx[i]->GetHash() != hashMediumFeeTx);
746 BOOST_REQUIRE(mining);
749 CScript scriptPubKey =
CScript() <<
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex <<
OP_CHECKSIG;
750 BlockAssembler::Options options;
751 options.coinbase_output_script = scriptPubKey;
754 std::unique_ptr<BlockTemplate> block_template = mining->createNewBlock(options);
755 BOOST_REQUIRE(block_template);
757 CBlock block{block_template->getBlock()};
761 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = false}, reason, debug));
762 BOOST_REQUIRE_EQUAL(reason,
"bad-txnmrklroot");
763 BOOST_REQUIRE_EQUAL(debug,
"hashMerkleRoot mismatch");
771 BOOST_REQUIRE(mining->checkBlock(block, {.check_pow = false}, reason, debug));
772 BOOST_REQUIRE_EQUAL(reason,
"");
773 BOOST_REQUIRE_EQUAL(debug,
"");
785 BOOST_REQUIRE(!mining->checkBlock(block, {.check_pow = true}, reason, debug));
786 BOOST_REQUIRE_EQUAL(reason,
"high-hash");
787 BOOST_REQUIRE_EQUAL(debug,
"proof of work failed");
793 static_assert(std::size(
BLOCKINFO) == 110,
"Should have 110 blocks to import");
795 std::vector<CTransactionRef> txFirst;
797 const int current_height{mining->getTip()->height};
804 if (current_height % 2 == 0) {
805 block_template = mining->createNewBlock(options);
806 BOOST_REQUIRE(block_template);
809 CBlock block{block_template->getBlock()};
816 txCoinbase.
vin[0].scriptSig =
CScript{} << (current_height + 1) << bi.extranonce;
817 txCoinbase.
vout.resize(1);
820 if (txFirst.size() == 0)
821 baseheight = current_height;
822 if (txFirst.size() < 4)
823 txFirst.push_back(block.vtx[0]);
825 block.nNonce = bi.nonce;
827 std::shared_ptr<const CBlock> shared_pblock = std::make_shared<const CBlock>(block);
831 if (current_height % 2 == 0) {
834 BOOST_REQUIRE(block_template->submitSolution(block.nVersion, block.nTime, block.nNonce,
MakeTransactionRef(txCoinbase)));
841 BOOST_REQUIRE_EQUAL(maybe_new_tip->GetBlockHash(), block.GetHash());
843 if (current_height % 2 == 0) {
844 block_template = block_template->waitNext();
845 BOOST_REQUIRE(block_template);
848 mining->waitTipChanged(block.hashPrevBlock);
854 TestBasicMining(scriptPubKey, txFirst, baseheight);
859 TestPackageSelection(scriptPubKey, txFirst);
864 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.
AddToMempool(pool, CTxMemPoolEntry(TxGraph::Ref(), 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 ...
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
std::unique_ptr< Mining > MakeMining(node::NodeContext &node)
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...
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, ordered by increasing fee/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(
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.
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
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.