Bitcoin Core 32.99.0
P2P Digital Currency
Loading...
Searching...
No Matches
versionbits_tests.cpp
Go to the documentation of this file.
1// Copyright (c) 2014-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <chain.h>
6#include <chainparams.h>
7#include <consensus/params.h>
8#include <test/util/random.h>
9#include <test/util/common.h>
12#include <util/chaintype.h>
13#include <validation.h>
14#include <versionbits.h>
15#include <versionbits_impl.h>
16
17#include <boost/test/unit_test.hpp>
18
19/* Define a virtual block time, one block per 10 minutes after Nov 14 2014, 0:55:36am */
20static int32_t TestTime(int nHeight) { return 1415926536 + 600 * nHeight; }
21
23{
24private:
26
27public:
28 // constructor is implicit to allow for easier initialization of vector<TestConditionChecker>
30 ~TestConditionChecker() override = default;
31
34 void clear() { cache.clear(); }
35};
36
37namespace {
38struct Deployments
39{
40 const Consensus::BIP9Deployment normal{
41 .bit = 8,
42 .nStartTime = TestTime(10000),
43 .nTimeout = TestTime(20000),
44 .min_activation_height = 0,
45 .period = 1000,
46 .threshold = 900,
47 };
48 Consensus::BIP9Deployment always, never, delayed;
49 Deployments()
50 {
51 delayed = normal; delayed.min_activation_height = 15000;
54 }
55};
56}
57
58#define CHECKERS 6
59
61{
63 // A fake blockchain
64 std::vector<CBlockIndex*> vpblock;
65
66 // Used to automatically set the top bits for manual calls to Mine()
68
69 // Setup BIP9Deployment structs for the checkers
70 const Deployments test_deployments;
71
72 // 6 independent checkers for the same bit.
73 // The first one performs all checks, the second only 50%, the third only 25%, etc...
74 // This is to test whether lack of cached information leads to the same results.
75 std::vector<TestConditionChecker> checker{CHECKERS, {test_deployments.normal}};
76 // Another 6 that assume delayed activation
77 std::vector<TestConditionChecker> checker_delayed{CHECKERS, {test_deployments.delayed}};
78 // Another 6 that assume always active activation
79 std::vector<TestConditionChecker> checker_always{CHECKERS, {test_deployments.always}};
80 // Another 6 that assume never active activation
81 std::vector<TestConditionChecker> checker_never{CHECKERS, {test_deployments.never}};
82
83 // Test counter (to identify failures)
84 int num{1000};
85
86public:
88
90 // Have each group of tests be counted by the 1000s part, starting at 1000
91 num = num - (num % 1000) + 1000;
92
93 for (unsigned int i = 0; i < vpblock.size(); i++) {
94 delete vpblock[i];
95 }
96 for (unsigned int i = 0; i < CHECKERS; i++) {
97 checker[i].clear();
98 checker_delayed[i].clear();
99 checker_always[i].clear();
100 checker_never[i].clear();
101 }
102 vpblock.clear();
103 return *this;
104 }
105
107 Reset();
108 }
109
110 VersionBitsTester& Mine(unsigned int height, int32_t nTime, int32_t nVersion) {
111 while (vpblock.size() < height) {
112 CBlockIndex* pindex = new CBlockIndex();
113 pindex->nHeight = vpblock.size();
114 pindex->pprev = Tip();
115 pindex->nTime = nTime;
116 pindex->nVersion = (nVersionBase | nVersion);
117 pindex->BuildSkip();
118 vpblock.push_back(pindex);
119 }
120 return *this;
121 }
122
124 {
125 return TestStateSinceHeight(height, height);
126 }
127
129 {
130 const CBlockIndex* tip = Tip();
131 for (int i = 0; i < CHECKERS; i++) {
132 if (m_rng.randbits(i) == 0) {
133 BOOST_CHECK_MESSAGE(checker[i].StateSinceHeightFor(tip) == height, strprintf("Test %i for StateSinceHeight", num));
134 BOOST_CHECK_MESSAGE(checker_delayed[i].StateSinceHeightFor(tip) == height_delayed, strprintf("Test %i for StateSinceHeight (delayed)", num));
135 BOOST_CHECK_MESSAGE(checker_always[i].StateSinceHeightFor(tip) == 0, strprintf("Test %i for StateSinceHeight (always active)", num));
136 BOOST_CHECK_MESSAGE(checker_never[i].StateSinceHeightFor(tip) == 0, strprintf("Test %i for StateSinceHeight (never active)", num));
137 }
138 }
139 num++;
140 return *this;
141 }
142
147
149 {
150 if (exp != exp_delayed) {
151 // only expected differences are that delayed stays in locked_in longer
154 }
155
156 const CBlockIndex* pindex = Tip();
157 for (int i = 0; i < CHECKERS; i++) {
158 if (m_rng.randbits(i) == 0) {
159 ThresholdState got = checker[i].StateFor(pindex);
160 ThresholdState got_delayed = checker_delayed[i].StateFor(pindex);
161 ThresholdState got_always = checker_always[i].StateFor(pindex);
162 ThresholdState got_never = checker_never[i].StateFor(pindex);
163 // nHeight of the next block. If vpblock is empty, the next (ie first)
164 // block should be the genesis block with nHeight == 0.
165 int height = pindex == nullptr ? 0 : pindex->nHeight + 1;
166 BOOST_CHECK_MESSAGE(got == exp, strprintf("Test %i for %s height %d (got %s)", num, StateName(exp), height, StateName(got)));
167 BOOST_CHECK_MESSAGE(got_delayed == exp_delayed, strprintf("Test %i for %s height %d (got %s; delayed case)", num, StateName(exp_delayed), height, StateName(got_delayed)));
168 BOOST_CHECK_MESSAGE(got_always == ThresholdState::ACTIVE, strprintf("Test %i for ACTIVE height %d (got %s; always active case)", num, height, StateName(got_always)));
169 BOOST_CHECK_MESSAGE(got_never == ThresholdState::FAILED, strprintf("Test %i for FAILED height %d (got %s; never active case)", num, height, StateName(got_never)));
170 }
171 }
172 num++;
173 return *this;
174 }
175
181
182 // non-delayed should be active; delayed should still be locked in
184
185 CBlockIndex* Tip() { return vpblock.empty() ? nullptr : vpblock.back(); }
186};
187
189
191{
192 for (int i = 0; i < 64; i++) {
193 // DEFINED -> STARTED after timeout reached -> FAILED
196 .Mine(11, TestTime(11), 0x100).TestDefined().TestStateSinceHeight(0)
197 .Mine(989, TestTime(989), 0x100).TestDefined().TestStateSinceHeight(0)
198 .Mine(999, TestTime(20000), 0x100).TestDefined().TestStateSinceHeight(0) // Timeout and start time reached simultaneously
199 .Mine(1000, TestTime(20000), 0).TestStarted().TestStateSinceHeight(1000) // Hit started, stop signalling
200 .Mine(1999, TestTime(30001), 0).TestStarted().TestStateSinceHeight(1000)
201 .Mine(2000, TestTime(30002), 0x100).TestFailed().TestStateSinceHeight(2000) // Hit failed, start signalling again
202 .Mine(2001, TestTime(30003), 0x100).TestFailed().TestStateSinceHeight(2000)
203 .Mine(2999, TestTime(30004), 0x100).TestFailed().TestStateSinceHeight(2000)
204 .Mine(3000, TestTime(30005), 0x100).TestFailed().TestStateSinceHeight(2000)
205 .Mine(4000, TestTime(30006), 0x100).TestFailed().TestStateSinceHeight(2000)
206
207 // DEFINED -> STARTED -> FAILED
210 .Mine(1000, TestTime(10000) - 1, 0x100).TestDefined().TestStateSinceHeight(0) // One second more and it would be defined
211 .Mine(2000, TestTime(10000), 0x100).TestStarted().TestStateSinceHeight(2000) // So that's what happens the next period
212 .Mine(2051, TestTime(10010), 0).TestStarted().TestStateSinceHeight(2000) // 51 old blocks
213 .Mine(2950, TestTime(10020), 0x100).TestStarted().TestStateSinceHeight(2000) // 899 new blocks
214 .Mine(3000, TestTime(20000), 0).TestFailed().TestStateSinceHeight(3000) // 50 old blocks (so 899 out of the past 1000)
215 .Mine(4000, TestTime(20010), 0x100).TestFailed().TestStateSinceHeight(3000)
216
217 // DEFINED -> STARTED -> LOCKEDIN after timeout reached -> ACTIVE
220 .Mine(1000, TestTime(10000) - 1, 0x101).TestDefined().TestStateSinceHeight(0) // One second more and it would be defined
221 .Mine(2000, TestTime(10000), 0x101).TestStarted().TestStateSinceHeight(2000) // So that's what happens the next period
222 .Mine(2999, TestTime(30000), 0x100).TestStarted().TestStateSinceHeight(2000) // 999 new blocks
223 .Mine(3000, TestTime(30000), 0x100).TestLockedIn().TestStateSinceHeight(3000) // 1 new block (so 1000 out of the past 1000 are new)
224 .Mine(3999, TestTime(30001), 0).TestLockedIn().TestStateSinceHeight(3000)
225 .Mine(4000, TestTime(30002), 0).TestActiveDelayed().TestStateSinceHeight(4000, 3000)
226 .Mine(14333, TestTime(30003), 0).TestActiveDelayed().TestStateSinceHeight(4000, 3000)
227 .Mine(24000, TestTime(40000), 0).TestActive().TestStateSinceHeight(4000, 15000)
228
229 // DEFINED -> STARTED -> LOCKEDIN before timeout -> ACTIVE
230 .Reset().TestDefined()
232 .Mine(1000, TestTime(10000) - 1, 0x101).TestDefined().TestStateSinceHeight(0) // One second more and it would be defined
233 .Mine(2000, TestTime(10000), 0x101).TestStarted().TestStateSinceHeight(2000) // So that's what happens the next period
234 .Mine(2050, TestTime(10010), 0x200).TestStarted().TestStateSinceHeight(2000) // 50 old blocks
235 .Mine(2950, TestTime(10020), 0x100).TestStarted().TestStateSinceHeight(2000) // 900 new blocks
236 .Mine(2999, TestTime(19999), 0x200).TestStarted().TestStateSinceHeight(2000) // 49 old blocks
237 .Mine(3000, TestTime(29999), 0x200).TestLockedIn().TestStateSinceHeight(3000) // 1 old block (so 900 out of the past 1000)
238 .Mine(3999, TestTime(30001), 0).TestLockedIn().TestStateSinceHeight(3000)
239 .Mine(4000, TestTime(30002), 0).TestActiveDelayed().TestStateSinceHeight(4000, 3000) // delayed will not become active until height=15000
240 .Mine(14333, TestTime(30003), 0).TestActiveDelayed().TestStateSinceHeight(4000, 3000)
241 .Mine(15000, TestTime(40000), 0).TestActive().TestStateSinceHeight(4000, 15000)
242 .Mine(24000, TestTime(40000), 0).TestActive().TestStateSinceHeight(4000, 15000)
243
244 // DEFINED multiple periods -> STARTED multiple periods -> FAILED
247 .Mine(1000, TestTime(1000), 0).TestDefined().TestStateSinceHeight(0)
248 .Mine(2000, TestTime(2000), 0).TestDefined().TestStateSinceHeight(0)
249 .Mine(3000, TestTime(10000), 0).TestStarted().TestStateSinceHeight(3000)
250 .Mine(4000, TestTime(10000), 0).TestStarted().TestStateSinceHeight(3000)
251 .Mine(5000, TestTime(10000), 0).TestStarted().TestStateSinceHeight(3000)
252 .Mine(5999, TestTime(20000), 0).TestStarted().TestStateSinceHeight(3000)
253 .Mine(6000, TestTime(20000), 0).TestFailed().TestStateSinceHeight(6000)
254 .Mine(7000, TestTime(20000), 0x100).TestFailed().TestStateSinceHeight(6000)
255 .Mine(24000, TestTime(20000), 0x100).TestFailed().TestStateSinceHeight(6000) // stay in FAILED no matter how much we signal
256 ;
257 }
258}
259
264{
265 // Clear the cache every time
266 versionbitscache.Clear();
267
268 int64_t bit = params.vDeployments[dep].bit;
269 int64_t nStartTime = params.vDeployments[dep].nStartTime;
270 int64_t nTimeout = params.vDeployments[dep].nTimeout;
271 int min_activation_height = params.vDeployments[dep].min_activation_height;
272 uint32_t period = params.vDeployments[dep].period;
273 uint32_t threshold = params.vDeployments[dep].threshold;
274
275 BOOST_REQUIRE(period > 0); // no division by zero, thankyou
276 BOOST_REQUIRE(0 < threshold); // must be able to have a window that doesn't activate
277 BOOST_REQUIRE(threshold < period); // must be able to have a window that does activate
278
279 // should not be any signalling for first block
280 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(nullptr, params), VERSIONBITS_TOP_BITS);
281
282 // always/never active deployments shouldn't need to be tested further
285 {
287 BOOST_CHECK(versionbitscache.IsActiveAfter(nullptr, params, dep));
288 } else {
289 BOOST_CHECK(!versionbitscache.IsActiveAfter(nullptr, params, dep));
290 }
291 BOOST_CHECK_EQUAL(min_activation_height, 0);
293 return;
294 }
295
296 BOOST_REQUIRE(nStartTime < nTimeout);
297 BOOST_REQUIRE(nStartTime >= 0);
298 BOOST_REQUIRE(nTimeout <= std::numeric_limits<uint32_t>::max() || nTimeout == Consensus::BIP9Deployment::NO_TIMEOUT);
299 BOOST_REQUIRE(0 <= bit);
300 BOOST_REQUIRE(bit < 32);
301 // Make sure that no deployment tries to set an invalid bit.
302 BOOST_REQUIRE(((1 << bit) & VERSIONBITS_TOP_MASK) == 0);
303 BOOST_REQUIRE(min_activation_height >= 0);
304 // Check min_activation_height is on a retarget boundary
305 BOOST_REQUIRE_EQUAL(min_activation_height % period, 0U);
306
307 // In the first chain, test that the bit is set by CBV until it has failed.
308 // In the second chain, test the bit is set by CBV while STARTED and
309 // LOCKED-IN, and then no longer set while ACTIVE.
311
312 int64_t nTime = nStartTime;
313
314 const CBlockIndex *lastBlock = nullptr;
315
316 // Before MedianTimePast of the chain has crossed nStartTime, the bit
317 // should not be set.
318 if (nTime == 0) {
319 // since CBlockIndex::nTime is uint32_t we can't represent any
320 // earlier time, so will transition from DEFINED to STARTED at the
321 // end of the first period by mining blocks at nTime == 0
322 lastBlock = firstChain.Mine(period - 1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
323 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
324 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
325 lastBlock = firstChain.Mine(period, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
326 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
327 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
328 // then we'll keep mining at nStartTime...
329 } else {
330 // use a time 1s earlier than start time to check we stay DEFINED
331 --nTime;
332
333 // Start generating blocks before nStartTime
334 lastBlock = firstChain.Mine(period, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
335 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
336 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
337
338 // Mine more blocks (4 less than the adjustment period) at the old time, and check that CBV isn't setting the bit yet.
339 for (uint32_t i = 1; i < period - 4; i++) {
340 lastBlock = firstChain.Mine(period + i, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
341 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
342 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
343 }
344 // Now mine 5 more blocks at the start time -- MTP should not have passed yet, so
345 // CBV should still not yet set the bit.
346 nTime = nStartTime;
347 for (uint32_t i = period - 4; i <= period; i++) {
348 lastBlock = firstChain.Mine(period + i, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
349 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
350 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
351 }
352 // Next we will advance to the next period and transition to STARTED,
353 }
354
355 lastBlock = firstChain.Mine(period * 3, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
356 // so ComputeBlockVersion should now set the bit,
357 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
358 // and should also be using the VERSIONBITS_TOP_BITS.
360 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
361
362 // Check that ComputeBlockVersion will set the bit until nTimeout
363 nTime += 600;
364 uint32_t blocksToMine = period * 2; // test blocks for up to 2 time periods
365 uint32_t nHeight = period * 3;
366 // These blocks are all before nTimeout is reached.
369 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
371 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
372 blocksToMine--;
373 nTime += 600;
374 nHeight += 1;
375 }
376
378 // can reach any nTimeout other than NO_TIMEOUT due to earlier BOOST_REQUIRE
379
380 nTime = nTimeout;
381
382 // finish the last period before we start timing out
383 while (nHeight % period != 0) {
385 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
386 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
387 nHeight += 1;
388 }
389
390 // FAILED is only triggered at the end of a period, so CBV should be setting
391 // the bit until the period transition.
392 for (uint32_t i = 0; i < period - 1; i++) {
394 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
395 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
396 nHeight += 1;
397 }
398 // The next block should trigger no longer setting the bit.
400 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
401 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
402 }
403
404 // On a new chain:
405 // verify that the bit will be set after lock-in, and then stop being set
406 // after activation.
407 nTime = nStartTime;
408
409 // Mine one period worth of blocks, and check that the bit will be on for the
410 // next period.
411 lastBlock = secondChain.Mine(period, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
412 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
413 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
414
415 // Mine another period worth of blocks, signaling the new bit.
416 lastBlock = secondChain.Mine(period * 2, nTime, VERSIONBITS_TOP_BITS | (1<<bit)).Tip();
417 // After one period of setting the bit on each block, it should have locked in.
418 // We keep setting the bit for one more period though, until activation.
419 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
420 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
421
422 // Now check that we keep mining the block until the end of this period, and
423 // then stop at the beginning of the next period.
424 lastBlock = secondChain.Mine((period * 3) - 1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
425 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
426 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
427 lastBlock = secondChain.Mine(period * 3, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
428
429 if (lastBlock->nHeight + 1 < min_activation_height) {
430 // check signalling continues while min_activation_height is not reached
431 lastBlock = secondChain.Mine(min_activation_height - 1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
432 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
433 BOOST_CHECK(!versionbitscache.IsActiveAfter(lastBlock, params, dep));
434 // then reach min_activation_height, which was already REQUIRE'd to start a new period
435 lastBlock = secondChain.Mine(min_activation_height, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
436 }
437
438 // Check that we don't signal after activation
439 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
440 BOOST_CHECK(versionbitscache.IsActiveAfter(lastBlock, params, dep));
441}
442}; // struct BlockVersionTest
443
445{
446 // RegTest should have all possible flags enabled by default
447 // If this check fails, then either remove the flag from
448 // CONSENSUS_SCRIPT_VERIFY_FLAGS, so that it's never a consensus
449 // flag for any chain, or ensure the deployment is enabled by
450 // default for RegTest.
453
454 // Check stored value is consistent
455 ChainstateManager& chainman = *m_node.chainman;
457
458 // Every other chain should have a subset (though this should already have been checked at compile-time)
460 auto params{CreateChainParams(*m_node.args, chain_type)};
463 }
464}
465
467{
469
470 // check that any deployment on any chain can conceivably reach both
471 // ACTIVE and FAILED states in roughly the way we expect
475 for (int i = 0; i < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++i) {
476 const auto dep = static_cast<Consensus::DeploymentPos>(i);
477 // Check that no bits are reused (within the same chain). This is
478 // disallowed because the transition to FAILED (on timeout) does
479 // not take precedence over STARTED/LOCKED_IN. So all softforks on
480 // the same bit might overlap, even when non-overlapping start-end
481 // times are picked.
482 const auto& dep_info = chainParams->GetConsensus().vDeployments[dep];
483 const uint32_t dep_mask{uint32_t{1} << dep_info.bit};
486 BOOST_CHECK(0 <= dep_info.bit);
492 } else {
494 }
495 }
496 check_computeblockversion(vbcache, chainParams->GetConsensus(), dep);
497 }
498 }
499
500 {
501 // Use regtest/testdummy to ensure we always exercise some
502 // deployment that's not always/never active
504 args.ForceSetArg("-vbparams", "testdummy:1199145601:1230767999"); // January 1, 2008 - December 31, 2008
506 check_computeblockversion(vbcache, chainParams->GetConsensus(), Consensus::DEPLOYMENT_TESTDUMMY);
507 }
508
509 {
510 // Use regtest/testdummy to ensure we always exercise the
511 // min_activation_height test, even if we're not using that in a
512 // live deployment
514 args.ForceSetArg("-vbparams", "testdummy:1199145601:1230767999:403200"); // January 1, 2008 - December 31, 2008, min act height 403200
516 check_computeblockversion(vbcache, chainParams->GetConsensus(), Consensus::DEPLOYMENT_TESTDUMMY);
517 }
518}
519
node::NodeContext m_node
ArgsManager & args
Definition bitcoind.cpp:280
std::unique_ptr< const CChainParams > CreateChainParams(const ArgsManager &args, const ChainType chain)
Creates and returns a std::unique_ptr<CChainParams> of the chosen chain.
ThresholdState GetStateFor(const CBlockIndex *pindexPrev, ThresholdConditionCache &cache) const
Returns the state for pindex A based on parent pindexPrev B.
int GetStateSinceHeightFor(const CBlockIndex *pindexPrev, ThresholdConditionCache &cache) const
Returns the height since when the ThresholdState has started for pindex A based on parent pindexPrev ...
void ForceSetArg(const std::string &strArg, const std::string &strValue) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Definition args.cpp:611
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition chain.h:94
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition chain.h:100
void BuildSkip()
Build the skiplist pointer for this entry.
Definition chain.cpp:114
uint32_t nTime
Definition chain.h:142
int32_t nVersion
block header
Definition chain.h:140
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition chain.h:106
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
Definition validation.h:950
const script_verify_flags m_all_consensus_script_flags
Store the potential consensus script flags for this manager's selected params.
static script_verify_flags GetAllConsensusScriptFlags(const Consensus::Params &params)
Determine the potential consensus script flags for blocks in a chain.
Fast randomness source.
Definition random.h:386
uint64_t randbits(int bits) noexcept
Generate a random (bits)-bit integer.
Definition random.h:204
ThresholdConditionCache cache
~TestConditionChecker() override=default
int StateSinceHeightFor(const CBlockIndex *pindexPrev) const
ThresholdState StateFor(const CBlockIndex *pindexPrev) const
BIP 9 allows multiple softforks to be deployed in parallel.
Definition versionbits.h:78
Class to implement versionbits logic.
VersionBitsTester & TestState(ThresholdState exp, ThresholdState exp_delayed)
VersionBitsTester & TestStateSinceHeight(int height)
VersionBitsTester & TestActive()
VersionBitsTester & TestFailed()
const Deployments test_deployments
std::vector< TestConditionChecker > checker_delayed
VersionBitsTester(FastRandomContext &rng, int32_t nVersionBase=0)
VersionBitsTester & TestLockedIn()
VersionBitsTester & TestState(ThresholdState exp)
FastRandomContext & m_rng
VersionBitsTester & TestDefined()
VersionBitsTester & Mine(unsigned int height, int32_t nTime, int32_t nVersion)
VersionBitsTester & Reset()
std::vector< TestConditionChecker > checker
VersionBitsTester & TestActiveDelayed()
std::vector< TestConditionChecker > checker_never
std::vector< CBlockIndex * > vpblock
std::vector< TestConditionChecker > checker_always
VersionBitsTester & TestStarted()
const int32_t nVersionBase
VersionBitsTester & TestStateSinceHeight(int height, int height_delayed)
constexpr value_type as_int() const
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
unsigned int nHeight
DeploymentPos
Definition params.h:38
@ DEPLOYMENT_TESTDUMMY
Definition params.h:39
@ MAX_VERSION_BITS_DEPLOYMENTS
Definition params.h:42
#define BOOST_CHECK_EQUAL(v1, v2)
Definition object.cpp:17
#define BOOST_CHECK(expr)
Definition object.cpp:16
Basic testing setup.
FastRandomContext m_rng
void check_computeblockversion(VersionBitsCache &versionbitscache, const Consensus::Params &params, Consensus::DeploymentPos dep)
Check that ComputeBlockVersion will set the appropriate bit correctly Also checks IsActiveAfter() beh...
Struct for each individual consensus rule change using BIP9.
Definition params.h:49
int min_activation_height
If lock in occurs, delay activation until at least this block height.
Definition params.h:60
int bit
Bit position to select the particular bit in nVersion.
Definition params.h:51
static constexpr int64_t ALWAYS_ACTIVE
Special value for nStartTime indicating that the deployment is always active.
Definition params.h:77
static constexpr int64_t NEVER_ACTIVE
Special value for nStartTime indicating that the deployment is never active.
Definition params.h:82
static constexpr int64_t NO_TIMEOUT
Constant for nTimeout very far in the future.
Definition params.h:71
int64_t nStartTime
Start MedianTime for version bits miner confirmation.
Definition params.h:53
Parameters that influence chain consensus.
Definition params.h:88
std::array< BIP9Deployment, MAX_VERSION_BITS_DEPLOYMENTS > vDeployments
Definition params.h:114
Identical to TestingSetup, but chain set to regtest.
std::unique_ptr< ChainstateManager > chainman
Definition context.h:74
ArgsManager * args
Definition context.h:76
FastRandomContext rng
constexpr int VERSIONBITS_MAX_NUM_BITS
Total possible bits available for versionbits per original BIP 9 specification.
Definition versionbits.h:11
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
Definition time.h:82
constexpr script_verify_flags CONSENSUS_SCRIPT_VERIFY_FLAGS
Set of script verify flags that may be enforced at the consensus level (for some combination of chain...
std::string StateName(ThresholdState state)
Get a string with the state name.
std::map< const CBlockIndex *, ThresholdState > ThresholdConditionCache
Definition versionbits.h:33
constexpr int32_t VERSIONBITS_TOP_BITS
What bits to set in version for versionbits blocks.
Definition versionbits.h:21
constexpr int32_t VERSIONBITS_TOP_MASK
What bitmask determines whether versionbits is in use.
Definition versionbits.h:23
constexpr int32_t VERSIONBITS_LAST_OLD_BLOCK_VERSION
What block version to use for new blocks (pre versionbits)
Definition versionbits.h:19
constexpr int32_t VERSIONBITS_NUM_BITS
Total bits available for versionbits (BIP 323)
Definition versionbits.h:25
ThresholdState
BIP 9 defines a finite-state-machine to deploy a softfork in multiple stages.
#define CHECKERS
BOOST_FIXTURE_TEST_CASE(blockscriptflags, RegTestingSetup)
static int32_t TestTime(int nHeight)
BOOST_AUTO_TEST_CASE(versionbits_test)