24#include <validation.h>
34#include <boost/test/unit_test.hpp>
64 opts.limits.cluster_size_vbytes = 1'200'000;
83}
BLOCKINFO[]{{0, 3552706918}, {500, 37506755}, {1000, 948987788}, {400, 524762339}, {800, 258510074}, {300, 102309278},
84 {1300, 54365202}, {600, 1107740426}, {1000, 203094491}, {900, 391178848}, {800, 381177271}, {600, 87188412},
85 {0, 66522866}, {800, 874942736}, {1000, 89200838}, {400, 312638088}, {400, 66263693}, {500, 924648304},
86 {400, 369913599}, {500, 47630099}, {500, 115045364}, {100, 277026602}, {1100, 809621409}, {700, 155345322},
87 {800, 943579953}, {400, 28200730}, {900, 77200495}, {0, 105935488}, {400, 698721821}, {500, 111098863},
88 {1300, 445389594}, {500, 621849894}, {1400, 56010046}, {1100, 370669776}, {1200, 380301940}, {1200, 110654905},
89 {400, 213771024}, {1500, 120014726}, {1200, 835019014}, {1500, 624817237}, {900, 1404297}, {400, 189414558},
90 {400, 293178348}, {1100, 15393789}, {600, 396764180}, {800, 1387046371}, {800, 199368303}, {700, 111496662},
91 {100, 129759616}, {200, 536577982}, {500, 125881300}, {500, 101053391}, {1200, 471590548}, {900, 86957729},
92 {1200, 179604104}, {600, 68658642}, {1000, 203295701}, {500, 139615361}, {900, 233693412}, {300, 153225163},
93 {0, 27616254}, {1200, 9856191}, {100, 220392722}, {200, 66257599}, {1100, 145489641}, {1300, 37859442},
94 {400, 5816075}, {1200, 215752117}, {1400, 32361482}, {1400, 6529223}, {500, 143332977}, {800, 878392},
95 {700, 159290408}, {400, 123197595}, {700, 43988693}, {300, 304224916}, {700, 214771621}, {1100, 274148273},
96 {400, 285632418}, {1100, 923451065}, {600, 12818092}, {1200, 736282054}, {1000, 246683167}, {600, 92950402},
97 {1400, 29223405}, {1000, 841327192}, {700, 174301283}, {1400, 214009854}, {1000, 6989517}, {1200, 278226956},
98 {700, 540219613}, {400, 93663104}, {1100, 152345635}, {1500, 464194499}, {1300, 333850111}, {600, 258311263},
99 {600, 90173162}, {1000, 33590797}, {1500, 332866027}, {100, 204704427}, {1000, 463153545}, {800, 303244785},
100 {600, 88096214}, {0, 137477892}, {1200, 195514506}, {300, 704114595}, {900, 292087369}, {1400, 758684870},
101 {1300, 163493028}, {1200, 53151293}};
105 auto index{std::make_unique<CBlockIndex>()};
114void MinerTestingSetup::TestPackageSelection(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>&
txFirst)
118 BlockAssembler::Options options;
119 options.coinbase_output_script = scriptPubKey;
120 options.include_dummy_extranonce =
true;
126 std::unique_ptr<BlockTemplate>
block_template = mining->createNewBlock(options,
false);
147 tx.
vin[0].prevout.hash =
txFirst[0]->GetHash();
148 tx.
vin[0].prevout.n = 0;
150 tx.
vout[0].nValue = 5000000000LL - 1000;
157 tx.
vin[0].prevout.hash =
txFirst[1]->GetHash();
158 tx.
vout[0].nValue = 5000000000LL - 10000;
165 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
195 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000;
205 tx.
vout[0].nValue = 5000000000LL - 1000 - 50000 -
feeToUse;
215 for (
size_t i=0; i<block.vtx.size(); ++i) {
224 tx.
vout[0].nValue -= 2;
239 tx.
vin[0].prevout.hash =
txFirst[2]->GetHash();
241 tx.
vout[0].nValue = 5000000000LL - 100000000;
242 tx.
vout[1].nValue = 100000000;
254 tx.
vout[0].nValue = 5000000000LL - 100000000 -
feeToUse;
262 for (
size_t i=0; i<block.vtx.size(); ++i) {
269 tx.
vin[0].prevout.n = 1;
270 tx.
vout[0].nValue = 100000000 - 10000;
281 std::vector<CTransactionRef>
ret;
289 tx.
vin[0].prevout.n = 0;
291 for (
auto &out : tx.
vout) {
292 out.nValue =
first_tx->vout[0].nValue / 50;
304 for (
unsigned int i = 0; i < 50; ++i) {
308 tx2.vin[0].prevout.n = i;
312 for (
auto &out :
tx2.vout) {
321void MinerTestingSetup::TestBasicMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>&
txFirst,
int baseheight)
337 BlockAssembler::Options options;
338 options.coinbase_output_script = scriptPubKey;
339 options.include_dummy_extranonce =
true;
353 for (
auto&
t :
txs) {
380 for (
auto&
t :
txs) {
400 std::vector<unsigned char> vchData(520);
401 for (
unsigned int i = 0; i < 18; ++i) {
407 tx.
vin[0].prevout.hash =
txFirst[0]->GetHash();
408 tx.
vin[0].prevout.n = 0;
410 for (
unsigned int i = 0; i < 63; ++i) {
416 tx.
vin[0].prevout.hash = hash;
437 tx.
vin[0].prevout.hash =
txFirst[1]->GetHash();
441 tx.
vin[0].prevout.hash = hash;
444 tx.
vin[1].prevout.hash =
txFirst[0]->GetHash();
445 tx.
vin[1].prevout.n = 0;
458 tx.
vin[0].prevout.SetNull();
460 tx.
vout[0].nValue = 0;
473 tx.
vin[0].prevout.hash =
txFirst[0]->GetHash();
517 tx.
vin[0].prevout.hash =
txFirst[0]->GetHash();
518 tx.
vin[0].prevout.n = 0;
525 tx.
vin[0].prevout.hash = hash;
536 m_node.
chainman->ActiveChainstate().CoinsTip().SetBestBlock(
del->pprev->GetBlockHash());
537 delete del->phashBlock;
555 tx.
vin[0].prevout.hash =
txFirst[0]->GetHash();
556 tx.
vin[0].prevout.n = 0;
575 tx.
vin[0].prevout.hash =
txFirst[1]->GetHash();
597 tx.
vin[0].prevout.hash =
txFirst[2]->GetHash();
612 tx.
vin[0].prevout.hash =
txFirst[3]->GetHash();
623 tx.
vin[0].prevout.hash = hash;
626 tx.
vin[0].nSequence = 0;
629 tx.
vin[0].nSequence = 1;
659void MinerTestingSetup::TestPrioritisedMining(
const CScript& scriptPubKey,
const std::vector<CTransactionRef>&
txFirst)
664 BlockAssembler::Options options;
665 options.coinbase_output_script = scriptPubKey;
666 options.include_dummy_extranonce =
true;
676 tx.
vin[0].prevout.hash =
txFirst[0]->GetHash();
677 tx.
vin[0].prevout.n = 0;
680 tx.
vout[0].nValue = 5000000000LL;
685 tx.
vin[0].prevout.hash =
txFirst[1]->GetHash();
686 tx.
vin[0].prevout.n = 0;
687 tx.
vout[0].nValue = 5000000000LL - 1000;
693 tx.
vin[0].prevout.hash =
txFirst[2]->GetHash();
694 tx.
vout[0].nValue = 5000000000LL - 10000;
701 tx.
vout[0].nValue = 5000000000LL - 1000 - 1000;
712 tx.
vin[0].prevout.hash =
txFirst[3]->GetHash();
713 tx.
vout[0].nValue = 5000000000LL;
719 tx.
vout[0].nValue = 5000000000LL;
725 tx.
vout[0].nValue = 5000000000LL;
738 for (
size_t i=0; i<block.vtx.size(); ++i) {
749 auto mining{MakeMining()};
753 CScript scriptPubKey =
CScript() <<
"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex <<
OP_CHECKSIG;
754 BlockAssembler::Options options;
755 options.coinbase_output_script = scriptPubKey;
756 options.include_dummy_extranonce =
true;
759 std::unique_ptr<BlockTemplate>
block_template = mining->createNewBlock(options,
false);
798 static_assert(std::size(
BLOCKINFO) == 110,
"Should have 110 blocks to import");
800 std::vector<CTransactionRef>
txFirst;
828 txFirst.push_back(block.vtx[0]);
830 block.nNonce =
bi.nonce;
832 std::shared_ptr<const CBlock>
shared_pblock = std::make_shared<const CBlock>(block);
853 mining->waitTipChanged(block.hashPrevBlock);
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 ...
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.
void resize(size_type new_size)
void push_back(const T &value)
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, 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...
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(boo 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
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
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.