21#include <validation.h>
28#include <boost/test/unit_test.hpp>
72constexpr static struct {
75}
BLOCKINFO[]{{8, 582909131}, {0, 971462344}, {2, 1169481553}, {6, 66147495}, {7, 427785981}, {8, 80538907},
76 {8, 207348013}, {2, 1951240923}, {4, 215054351}, {1, 491520534}, {8, 1282281282}, {4, 639565734},
77 {3, 248274685}, {8, 1160085976}, {6, 396349768}, {5, 393780549}, {5, 1096899528}, {4, 965381630},
78 {0, 728758712}, {5, 318638310}, {3, 164591898}, {2, 274234550}, {2, 254411237}, {7, 561761812},
79 {2, 268342573}, {0, 402816691}, {1, 221006382}, {6, 538872455}, {7, 393315655}, {4, 814555937},
80 {7, 504879194}, {6, 467769648}, {3, 925972193}, {2, 200581872}, {3, 168915404}, {8, 430446262},
81 {5, 773507406}, {3, 1195366164}, {0, 433361157}, {3, 297051771}, {0, 558856551}, {2, 501614039},
82 {3, 528488272}, {2, 473587734}, {8, 230125274}, {2, 494084400}, {4, 357314010}, {8, 60361686},
83 {7, 640624687}, {3, 480441695}, {8, 1424447925}, {4, 752745419}, {1, 288532283}, {6, 669170574},
84 {5, 1900907591}, {3, 555326037}, {3, 1121014051}, {0, 545835650}, {8, 189196651}, {5, 252371575},
85 {0, 199163095}, {6, 558895874}, {6, 1656839784}, {6, 815175452}, {6, 718677851}, {5, 544000334},
86 {0, 340113484}, {6, 850744437}, {4, 496721063}, {8, 524715182}, {6, 574361898}, {6, 1642305743},
87 {6, 355110149}, {5, 1647379658}, {8, 1103005356}, {7, 556460625}, {3, 1139533992}, {5, 304736030},
88 {2, 361539446}, {2, 143720360}, {6, 201939025}, {7, 423141476}, {4, 574633709}, {3, 1412254823},
89 {4, 873254135}, {0, 341817335}, {6, 53501687}, {3, 179755410}, {5, 172209688}, {8, 516810279},
90 {4, 1228391489}, {8, 325372589}, {6, 550367589}, {0, 876291812}, {7, 412454120}, {7, 717202854},
91 {2, 222677843}, {6, 251778867}, {7, 842004420}, {7, 194762829}, {4, 96668841}, {1, 925485796},
92 {0, 792342903}, {6, 678455063}, {6, 773251385}, {5, 186617471}, {6, 883189502}, {7, 396077336},
93 {8, 254702874}, {0, 455592851}};
97 auto index{std::make_unique<CBlockIndex>()};
99 index->pprev = active_chain_tip;
106void MinerTestingSetup::TestPackageSelection(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
118 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
119 tx.
vin[0].prevout.n = 0;
121 tx.
vout[0].nValue = 5000000000LL - 1000;
127 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
128 tx.
vout[0].nValue = 5000000000LL - 10000;
133 tx.
vin[0].prevout.hash = hashParentTx;
134 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
138 BlockAssembler::Options options;
139 options.coinbase_output_script = scriptPubKey;
140 std::unique_ptr<CBlockTemplate> pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock();
141 BOOST_REQUIRE_EQUAL(pblocktemplate->block.vtx.size(), 4U);
142 BOOST_CHECK(pblocktemplate->block.vtx[1]->GetHash() == hashParentTx);
143 BOOST_CHECK(pblocktemplate->block.vtx[2]->GetHash() == hashHighFeeTx);
144 BOOST_CHECK(pblocktemplate->block.vtx[3]->GetHash() == hashMediumFeeTx);
147 tx.
vin[0].prevout.hash = hashHighFeeTx;
148 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
157 tx.
vin[0].prevout.hash = hashFreeTx;
158 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000 - feeToUse;
161 pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock();
163 for (
size_t i=0; i<pblocktemplate->block.vtx.size(); ++i) {
164 BOOST_CHECK(pblocktemplate->block.vtx[i]->GetHash() != hashFreeTx);
165 BOOST_CHECK(pblocktemplate->block.vtx[i]->GetHash() != hashLowFeeTx);
172 tx.
vout[0].nValue -= 2;
175 pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock();
176 BOOST_REQUIRE_EQUAL(pblocktemplate->block.vtx.size(), 6U);
177 BOOST_CHECK(pblocktemplate->block.vtx[4]->GetHash() == hashFreeTx);
178 BOOST_CHECK(pblocktemplate->block.vtx[5]->GetHash() == hashLowFeeTx);
183 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
185 tx.
vout[0].nValue = 5000000000LL - 100000000;
186 tx.
vout[1].nValue = 100000000;
191 tx.
vin[0].prevout.hash = hashFreeTx2;
194 tx.
vout[0].nValue = 5000000000LL - 100000000 - feeToUse;
197 pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock();
200 for (
size_t i=0; i<pblocktemplate->block.vtx.size(); ++i) {
201 BOOST_CHECK(pblocktemplate->block.vtx[i]->GetHash() != hashFreeTx2);
202 BOOST_CHECK(pblocktemplate->block.vtx[i]->GetHash() != hashLowFeeTx2);
207 tx.
vin[0].prevout.n = 1;
208 tx.
vout[0].nValue = 100000000 - 10000;
210 pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock();
211 BOOST_REQUIRE_EQUAL(pblocktemplate->block.vtx.size(), 9U);
212 BOOST_CHECK(pblocktemplate->block.vtx[8]->GetHash() == hashLowFeeTx2);
215void MinerTestingSetup::TestBasicMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst,
int baseheight)
228 BlockAssembler::Options options;
229 options.coinbase_output_script = scriptPubKey;
236 auto pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock();
243 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
244 tx.
vin[0].prevout.n = 0;
246 tx.
vout[0].nValue = BLOCKSUBSIDY;
247 for (
unsigned int i = 0; i < 1001; ++i) {
248 tx.
vout[0].nValue -= LOWFEE;
253 tx.
vin[0].prevout.hash = hash;
256 BOOST_CHECK_EXCEPTION(AssemblerForTest(tx_mempool, options).CreateNewBlock(), std::runtime_error,
HasReason(
"bad-blk-sigops"));
263 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
264 tx.
vout[0].nValue = BLOCKSUBSIDY;
265 for (
unsigned int i = 0; i < 1001; ++i) {
266 tx.
vout[0].nValue -= LOWFEE;
271 tx.
vin[0].prevout.hash = hash;
273 BOOST_CHECK(AssemblerForTest(tx_mempool, options).CreateNewBlock());
283 std::vector<unsigned char> vchData(520);
284 for (
unsigned int i = 0; i < 18; ++i) {
288 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
289 tx.
vout[0].nValue = BLOCKSUBSIDY;
290 for (
unsigned int i = 0; i < 128; ++i) {
291 tx.
vout[0].nValue -= LOWFEE;
295 tx.
vin[0].prevout.hash = hash;
297 BOOST_CHECK(AssemblerForTest(tx_mempool, options).CreateNewBlock());
307 BOOST_CHECK_EXCEPTION(AssemblerForTest(tx_mempool, options).CreateNewBlock(), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
316 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
317 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
320 tx.
vin[0].prevout.hash = hash;
323 tx.
vin[1].prevout.hash = txFirst[0]->GetHash();
324 tx.
vin[1].prevout.n = 0;
325 tx.
vout[0].nValue = tx.
vout[0].nValue + BLOCKSUBSIDY - HIGHERFEE;
328 BOOST_CHECK(AssemblerForTest(tx_mempool, options).CreateNewBlock());
337 tx.
vin[0].prevout.SetNull();
339 tx.
vout[0].nValue = 0;
344 BOOST_CHECK_EXCEPTION(AssemblerForTest(tx_mempool, options).CreateNewBlock(), std::runtime_error,
HasReason(
"bad-cb-multiple"));
352 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
354 tx.
vout[0].nValue = BLOCKSUBSIDY - HIGHFEE;
361 BOOST_CHECK_EXCEPTION(AssemblerForTest(tx_mempool, options).CreateNewBlock(), std::runtime_error,
HasReason(
"bad-txns-inputs-missingorspent"));
381 BOOST_CHECK(AssemblerForTest(tx_mempool, options).CreateNewBlock());
393 BOOST_CHECK(AssemblerForTest(tx_mempool, options).CreateNewBlock());
396 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
397 tx.
vin[0].prevout.n = 0;
399 tx.
vout[0].nValue = BLOCKSUBSIDY - LOWFEE;
404 tx.
vin[0].prevout.hash = hash;
406 tx.
vout[0].nValue -= LOWFEE;
409 BOOST_CHECK_EXCEPTION(AssemblerForTest(tx_mempool, options).CreateNewBlock(), std::runtime_error,
HasReason(
"mandatory-script-verify-flag-failed"));
428 std::vector<int> prevheights;
433 prevheights.resize(1);
434 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
435 tx.
vin[0].prevout.n = 0;
438 prevheights[0] = baseheight + 1;
440 tx.
vout[0].nValue = BLOCKSUBSIDY-HIGHFEE;
454 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
456 prevheights[0] = baseheight + 2;
462 const int SEQUENCE_LOCK_TIME = 512;
472 ancestor->nTime -= SEQUENCE_LOCK_TIME;
476 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
478 prevheights[0] = baseheight + 3;
487 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
489 prevheights.resize(1);
490 prevheights[0] = baseheight + 4;
498 tx.
vin[0].prevout.hash = hash;
499 prevheights[0] =
m_node.
chainman->ActiveChain().Tip()->nHeight + 1;
501 tx.
vin[0].nSequence = 0;
504 tx.
vin[0].nSequence = 1;
511 auto pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock();
522 ancestor->nTime += SEQUENCE_LOCK_TIME;
527 BOOST_CHECK(pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock());
531void MinerTestingSetup::TestPrioritisedMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>& txFirst)
533 BlockAssembler::Options options;
534 options.coinbase_output_script = scriptPubKey;
544 tx.
vin[0].prevout.hash = txFirst[0]->GetHash();
545 tx.
vin[0].prevout.n = 0;
548 tx.
vout[0].nValue = 5000000000LL;
551 tx_mempool.PrioritiseTransaction(hashFreePrioritisedTx, 5 *
COIN);
553 tx.
vin[0].prevout.hash = txFirst[1]->GetHash();
554 tx.
vin[0].prevout.n = 0;
555 tx.
vout[0].nValue = 5000000000LL - 1000;
561 tx.
vin[0].prevout.hash = txFirst[2]->GetHash();
562 tx.
vout[0].nValue = 5000000000LL - 10000;
565 tx_mempool.PrioritiseTransaction(hashMediumFeeTx, -5 *
COIN);
568 tx.
vin[0].prevout.hash = hashParentTx;
569 tx.
vout[0].nValue = 5000000000LL - 1000 - 1000;
572 tx_mempool.PrioritiseTransaction(hashPrioritsedChild, 2 *
COIN);
580 tx.
vin[0].prevout.hash = txFirst[3]->GetHash();
581 tx.
vout[0].nValue = 5000000000LL;
584 tx_mempool.PrioritiseTransaction(hashFreeParent, 10 *
COIN);
586 tx.
vin[0].prevout.hash = hashFreeParent;
587 tx.
vout[0].nValue = 5000000000LL;
590 tx_mempool.PrioritiseTransaction(hashFreeChild, 1 *
COIN);
592 tx.
vin[0].prevout.hash = hashFreeChild;
593 tx.
vout[0].nValue = 5000000000LL;
597 auto pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock();
598 BOOST_REQUIRE_EQUAL(pblocktemplate->block.vtx.size(), 6U);
599 BOOST_CHECK(pblocktemplate->block.vtx[1]->GetHash() == hashFreeParent);
600 BOOST_CHECK(pblocktemplate->block.vtx[2]->GetHash() == hashFreePrioritisedTx);
601 BOOST_CHECK(pblocktemplate->block.vtx[3]->GetHash() == hashParentTx);
602 BOOST_CHECK(pblocktemplate->block.vtx[4]->GetHash() == hashPrioritsedChild);
603 BOOST_CHECK(pblocktemplate->block.vtx[5]->GetHash() == hashFreeChild);
604 for (
size_t i=0; i<pblocktemplate->block.vtx.size(); ++i) {
606 BOOST_CHECK(pblocktemplate->block.vtx[i]->GetHash() != hashFreeGrandchild);
608 BOOST_CHECK(pblocktemplate->block.vtx[i]->GetHash() != hashMediumFeeTx);
616 CScript scriptPubKey =
CScript() <<
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex <<
OP_CHECKSIG;
617 std::unique_ptr<CBlockTemplate> pblocktemplate;
619 BlockAssembler::Options options;
620 options.coinbase_output_script = scriptPubKey;
624 BOOST_CHECK(pblocktemplate = AssemblerForTest(tx_mempool, options).CreateNewBlock());
628 static_assert(std::size(
BLOCKINFO) == 110,
"Should have 110 blocks to import");
630 std::vector<CTransactionRef> txFirst;
632 CBlock *pblock = &pblocktemplate->block;
640 txCoinbase.
vout.resize(1);
643 if (txFirst.size() == 0)
645 if (txFirst.size() < 4)
646 txFirst.push_back(pblock->
vtx[0]);
648 pblock->
nNonce = bi.nonce;
650 std::shared_ptr<const CBlock> shared_pblock = std::make_shared<const CBlock>(*pblock);
657 TestBasicMining(scriptPubKey, txFirst, baseheight);
662 TestPackageSelection(scriptPubKey, txFirst);
667 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.
#define Assert(val)
Identity function.
std::vector< CTransactionRef > vtx
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 kilovirtualbyte: CAmount / kvB.
CAmount GetFee(uint32_t num_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.
Generate a new block, without valid proof-of-work.
static constexpr unsigned int LOCKTIME_VERIFY_SEQUENCE
Flags for nSequence and nLockTime locks.
static const unsigned int MAX_BLOCK_WEIGHT
The maximum allowed weight for a block, see BIP 141 (network rule)
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()
AddToMempool(pool, CTxMemPoolEntry(tx, fee, nTime, nHeight, sequence, spendsCoinbase, sigOpCost, lp))
@ REPLACED
Removed for replacement.
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
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
""_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 TransactionSerParams TX_WITH_WITNESS
static CTransactionRef MakeTransactionRef(Tx &&txIn)
size_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.
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.
BlockAssembler AssemblerForTest(CTxMemPool &tx_mempool, BlockAssembler::Options options)
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 SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
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.
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.