Bitcoin Core 28.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
versionbits_tests.cpp
Go to the documentation of this file.
1// Copyright (c) 2014-2022 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>
10#include <util/chaintype.h>
11#include <versionbits.h>
12
13#include <boost/test/unit_test.hpp>
14
15/* Define a virtual block time, one block per 10 minutes after Nov 14 2014, 0:55:36am */
16static int32_t TestTime(int nHeight) { return 1415926536 + 600 * nHeight; }
17
18static std::string StateName(ThresholdState state)
19{
20 switch (state) {
21 case ThresholdState::DEFINED: return "DEFINED";
22 case ThresholdState::STARTED: return "STARTED";
23 case ThresholdState::LOCKED_IN: return "LOCKED_IN";
24 case ThresholdState::ACTIVE: return "ACTIVE";
25 case ThresholdState::FAILED: return "FAILED";
26 } // no default case, so the compiler can warn about missing cases
27 return "";
28}
29
31
33{
34private:
36
37public:
38 int64_t BeginTime(const Consensus::Params& params) const override { return TestTime(10000); }
39 int64_t EndTime(const Consensus::Params& params) const override { return TestTime(20000); }
40 int Period(const Consensus::Params& params) const override { return 1000; }
41 int Threshold(const Consensus::Params& params) const override { return 900; }
42 bool Condition(const CBlockIndex* pindex, const Consensus::Params& params) const override { return (pindex->nVersion & 0x100); }
43
46};
47
49{
50public:
51 int MinActivationHeight(const Consensus::Params& params) const override { return 15000; }
52};
53
55{
56public:
57 int64_t BeginTime(const Consensus::Params& params) const override { return Consensus::BIP9Deployment::ALWAYS_ACTIVE; }
58};
59
61{
62public:
63 int64_t BeginTime(const Consensus::Params& params) const override { return Consensus::BIP9Deployment::NEVER_ACTIVE; }
64};
65
66#define CHECKERS 6
67
69{
70 // A fake blockchain
71 std::vector<CBlockIndex*> vpblock;
72
73 // 6 independent checkers for the same bit.
74 // The first one performs all checks, the second only 50%, the third only 25%, etc...
75 // This is to test whether lack of cached information leads to the same results.
77 // Another 6 that assume delayed activation
79 // Another 6 that assume always active activation
81 // Another 6 that assume never active activation
83
84 // Test counter (to identify failures)
85 int num{1000};
86
87public:
89 // Have each group of tests be counted by the 1000s part, starting at 1000
90 num = num - (num % 1000) + 1000;
91
92 for (unsigned int i = 0; i < vpblock.size(); i++) {
93 delete vpblock[i];
94 }
95 for (unsigned int i = 0; i < CHECKERS; i++) {
100 }
101 vpblock.clear();
102 return *this;
103 }
104
106 Reset();
107 }
108
109 VersionBitsTester& Mine(unsigned int height, int32_t nTime, int32_t nVersion) {
110 while (vpblock.size() < height) {
111 CBlockIndex* pindex = new CBlockIndex();
112 pindex->nHeight = vpblock.size();
113 pindex->pprev = Tip();
114 pindex->nTime = nTime;
115 pindex->nVersion = nVersion;
116 pindex->BuildSkip();
117 vpblock.push_back(pindex);
118 }
119 return *this;
120 }
121
123 {
124 return TestStateSinceHeight(height, height);
125 }
126
127 VersionBitsTester& TestStateSinceHeight(int height, int height_delayed)
128 {
129 const CBlockIndex* tip = Tip();
130 for (int i = 0; i < CHECKERS; i++) {
131 if (InsecureRandBits(i) == 0) {
132 BOOST_CHECK_MESSAGE(checker[i].GetStateSinceHeightFor(tip) == height, strprintf("Test %i for StateSinceHeight", num));
133 BOOST_CHECK_MESSAGE(checker_delayed[i].GetStateSinceHeightFor(tip) == height_delayed, strprintf("Test %i for StateSinceHeight (delayed)", num));
134 BOOST_CHECK_MESSAGE(checker_always[i].GetStateSinceHeightFor(tip) == 0, strprintf("Test %i for StateSinceHeight (always active)", num));
135 BOOST_CHECK_MESSAGE(checker_never[i].GetStateSinceHeightFor(tip) == 0, strprintf("Test %i for StateSinceHeight (never active)", num));
136 }
137 }
138 num++;
139 return *this;
140 }
141
143 {
144 return TestState(exp, exp);
145 }
146
148 {
149 if (exp != exp_delayed) {
150 // only expected differences are that delayed stays in locked_in longer
153 }
154
155 const CBlockIndex* pindex = Tip();
156 for (int i = 0; i < CHECKERS; i++) {
157 if (InsecureRandBits(i) == 0) {
158 ThresholdState got = checker[i].GetStateFor(pindex);
159 ThresholdState got_delayed = checker_delayed[i].GetStateFor(pindex);
160 ThresholdState got_always = checker_always[i].GetStateFor(pindex);
161 ThresholdState got_never = checker_never[i].GetStateFor(pindex);
162 // nHeight of the next block. If vpblock is empty, the next (ie first)
163 // block should be the genesis block with nHeight == 0.
164 int height = pindex == nullptr ? 0 : pindex->nHeight + 1;
165 BOOST_CHECK_MESSAGE(got == exp, strprintf("Test %i for %s height %d (got %s)", num, StateName(exp), height, StateName(got)));
166 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)));
167 BOOST_CHECK_MESSAGE(got_always == ThresholdState::ACTIVE, strprintf("Test %i for ACTIVE height %d (got %s; always active case)", num, height, StateName(got_always)));
168 BOOST_CHECK_MESSAGE(got_never == ThresholdState::FAILED, strprintf("Test %i for FAILED height %d (got %s; never active case)", num, height, StateName(got_never)));
169 }
170 }
171 num++;
172 return *this;
173 }
174
180
181 // non-delayed should be active; delayed should still be locked in
183
184 CBlockIndex* Tip() { return vpblock.empty() ? nullptr : vpblock.back(); }
185};
186
187BOOST_FIXTURE_TEST_SUITE(versionbits_tests, BasicTestingSetup)
188
189BOOST_AUTO_TEST_CASE(versionbits_test)
190{
191 for (int i = 0; i < 64; i++) {
192 // DEFINED -> STARTED after timeout reached -> FAILED
195 .Mine(11, TestTime(11), 0x100).TestDefined().TestStateSinceHeight(0)
196 .Mine(989, TestTime(989), 0x100).TestDefined().TestStateSinceHeight(0)
197 .Mine(999, TestTime(20000), 0x100).TestDefined().TestStateSinceHeight(0) // Timeout and start time reached simultaneously
198 .Mine(1000, TestTime(20000), 0).TestStarted().TestStateSinceHeight(1000) // Hit started, stop signalling
199 .Mine(1999, TestTime(30001), 0).TestStarted().TestStateSinceHeight(1000)
200 .Mine(2000, TestTime(30002), 0x100).TestFailed().TestStateSinceHeight(2000) // Hit failed, start signalling again
201 .Mine(2001, TestTime(30003), 0x100).TestFailed().TestStateSinceHeight(2000)
202 .Mine(2999, TestTime(30004), 0x100).TestFailed().TestStateSinceHeight(2000)
203 .Mine(3000, TestTime(30005), 0x100).TestFailed().TestStateSinceHeight(2000)
204 .Mine(4000, TestTime(30006), 0x100).TestFailed().TestStateSinceHeight(2000)
205
206 // DEFINED -> STARTED -> FAILED
209 .Mine(1000, TestTime(10000) - 1, 0x100).TestDefined().TestStateSinceHeight(0) // One second more and it would be defined
210 .Mine(2000, TestTime(10000), 0x100).TestStarted().TestStateSinceHeight(2000) // So that's what happens the next period
211 .Mine(2051, TestTime(10010), 0).TestStarted().TestStateSinceHeight(2000) // 51 old blocks
212 .Mine(2950, TestTime(10020), 0x100).TestStarted().TestStateSinceHeight(2000) // 899 new blocks
213 .Mine(3000, TestTime(20000), 0).TestFailed().TestStateSinceHeight(3000) // 50 old blocks (so 899 out of the past 1000)
214 .Mine(4000, TestTime(20010), 0x100).TestFailed().TestStateSinceHeight(3000)
215
216 // DEFINED -> STARTED -> LOCKEDIN after timeout reached -> ACTIVE
219 .Mine(1000, TestTime(10000) - 1, 0x101).TestDefined().TestStateSinceHeight(0) // One second more and it would be defined
220 .Mine(2000, TestTime(10000), 0x101).TestStarted().TestStateSinceHeight(2000) // So that's what happens the next period
221 .Mine(2999, TestTime(30000), 0x100).TestStarted().TestStateSinceHeight(2000) // 999 new blocks
222 .Mine(3000, TestTime(30000), 0x100).TestLockedIn().TestStateSinceHeight(3000) // 1 new block (so 1000 out of the past 1000 are new)
223 .Mine(3999, TestTime(30001), 0).TestLockedIn().TestStateSinceHeight(3000)
224 .Mine(4000, TestTime(30002), 0).TestActiveDelayed().TestStateSinceHeight(4000, 3000)
225 .Mine(14333, TestTime(30003), 0).TestActiveDelayed().TestStateSinceHeight(4000, 3000)
226 .Mine(24000, TestTime(40000), 0).TestActive().TestStateSinceHeight(4000, 15000)
227
228 // DEFINED -> STARTED -> LOCKEDIN before timeout -> ACTIVE
229 .Reset().TestDefined()
231 .Mine(1000, TestTime(10000) - 1, 0x101).TestDefined().TestStateSinceHeight(0) // One second more and it would be defined
232 .Mine(2000, TestTime(10000), 0x101).TestStarted().TestStateSinceHeight(2000) // So that's what happens the next period
233 .Mine(2050, TestTime(10010), 0x200).TestStarted().TestStateSinceHeight(2000) // 50 old blocks
234 .Mine(2950, TestTime(10020), 0x100).TestStarted().TestStateSinceHeight(2000) // 900 new blocks
235 .Mine(2999, TestTime(19999), 0x200).TestStarted().TestStateSinceHeight(2000) // 49 old blocks
236 .Mine(3000, TestTime(29999), 0x200).TestLockedIn().TestStateSinceHeight(3000) // 1 old block (so 900 out of the past 1000)
237 .Mine(3999, TestTime(30001), 0).TestLockedIn().TestStateSinceHeight(3000)
238 .Mine(4000, TestTime(30002), 0).TestActiveDelayed().TestStateSinceHeight(4000, 3000) // delayed will not become active until height=15000
239 .Mine(14333, TestTime(30003), 0).TestActiveDelayed().TestStateSinceHeight(4000, 3000)
240 .Mine(15000, TestTime(40000), 0).TestActive().TestStateSinceHeight(4000, 15000)
241 .Mine(24000, TestTime(40000), 0).TestActive().TestStateSinceHeight(4000, 15000)
242
243 // DEFINED multiple periods -> STARTED multiple periods -> FAILED
246 .Mine(1000, TestTime(1000), 0).TestDefined().TestStateSinceHeight(0)
247 .Mine(2000, TestTime(2000), 0).TestDefined().TestStateSinceHeight(0)
248 .Mine(3000, TestTime(10000), 0).TestStarted().TestStateSinceHeight(3000)
249 .Mine(4000, TestTime(10000), 0).TestStarted().TestStateSinceHeight(3000)
250 .Mine(5000, TestTime(10000), 0).TestStarted().TestStateSinceHeight(3000)
251 .Mine(5999, TestTime(20000), 0).TestStarted().TestStateSinceHeight(3000)
252 .Mine(6000, TestTime(20000), 0).TestFailed().TestStateSinceHeight(6000)
253 .Mine(7000, TestTime(20000), 0x100).TestFailed().TestStateSinceHeight(6000)
254 .Mine(24000, TestTime(20000), 0x100).TestFailed().TestStateSinceHeight(6000) // stay in FAILED no matter how much we signal
255 ;
256 }
257}
258
261{
262 // Clear the cache every time
263 versionbitscache.Clear();
264
265 int64_t bit = params.vDeployments[dep].bit;
266 int64_t nStartTime = params.vDeployments[dep].nStartTime;
267 int64_t nTimeout = params.vDeployments[dep].nTimeout;
268 int min_activation_height = params.vDeployments[dep].min_activation_height;
269
270 // should not be any signalling for first block
271 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(nullptr, params), VERSIONBITS_TOP_BITS);
272
273 // always/never active deployments shouldn't need to be tested further
276 {
277 BOOST_CHECK_EQUAL(min_activation_height, 0);
279 return;
280 }
281
282 BOOST_REQUIRE(nStartTime < nTimeout);
283 BOOST_REQUIRE(nStartTime >= 0);
284 BOOST_REQUIRE(nTimeout <= std::numeric_limits<uint32_t>::max() || nTimeout == Consensus::BIP9Deployment::NO_TIMEOUT);
285 BOOST_REQUIRE(0 <= bit && bit < 32);
286 // Make sure that no deployment tries to set an invalid bit.
287 BOOST_REQUIRE(((1 << bit) & VERSIONBITS_TOP_MASK) == 0);
288 BOOST_REQUIRE(min_activation_height >= 0);
289 // Check min_activation_height is on a retarget boundary
290 BOOST_REQUIRE_EQUAL(min_activation_height % params.nMinerConfirmationWindow, 0U);
291
292 const uint32_t bitmask{versionbitscache.Mask(params, dep)};
293 BOOST_CHECK_EQUAL(bitmask, uint32_t{1} << bit);
294
295 // In the first chain, test that the bit is set by CBV until it has failed.
296 // In the second chain, test the bit is set by CBV while STARTED and
297 // LOCKED-IN, and then no longer set while ACTIVE.
298 VersionBitsTester firstChain, secondChain;
299
300 int64_t nTime = nStartTime;
301
302 const CBlockIndex *lastBlock = nullptr;
303
304 // Before MedianTimePast of the chain has crossed nStartTime, the bit
305 // should not be set.
306 if (nTime == 0) {
307 // since CBlockIndex::nTime is uint32_t we can't represent any
308 // earlier time, so will transition from DEFINED to STARTED at the
309 // end of the first period by mining blocks at nTime == 0
310 lastBlock = firstChain.Mine(params.nMinerConfirmationWindow - 1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
311 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
312 lastBlock = firstChain.Mine(params.nMinerConfirmationWindow, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
313 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
314 // then we'll keep mining at nStartTime...
315 } else {
316 // use a time 1s earlier than start time to check we stay DEFINED
317 --nTime;
318
319 // Start generating blocks before nStartTime
320 lastBlock = firstChain.Mine(params.nMinerConfirmationWindow, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
321 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
322
323 // Mine more blocks (4 less than the adjustment period) at the old time, and check that CBV isn't setting the bit yet.
324 for (uint32_t i = 1; i < params.nMinerConfirmationWindow - 4; i++) {
325 lastBlock = firstChain.Mine(params.nMinerConfirmationWindow + i, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
326 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
327 }
328 // Now mine 5 more blocks at the start time -- MTP should not have passed yet, so
329 // CBV should still not yet set the bit.
330 nTime = nStartTime;
331 for (uint32_t i = params.nMinerConfirmationWindow - 4; i <= params.nMinerConfirmationWindow; i++) {
332 lastBlock = firstChain.Mine(params.nMinerConfirmationWindow + i, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
333 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
334 }
335 // Next we will advance to the next period and transition to STARTED,
336 }
337
338 lastBlock = firstChain.Mine(params.nMinerConfirmationWindow * 3, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
339 // so ComputeBlockVersion should now set the bit,
340 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
341 // and should also be using the VERSIONBITS_TOP_BITS.
343
344 // Check that ComputeBlockVersion will set the bit until nTimeout
345 nTime += 600;
346 uint32_t blocksToMine = params.nMinerConfirmationWindow * 2; // test blocks for up to 2 time periods
347 uint32_t nHeight = params.nMinerConfirmationWindow * 3;
348 // These blocks are all before nTimeout is reached.
349 while (nTime < nTimeout && blocksToMine > 0) {
350 lastBlock = firstChain.Mine(nHeight+1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
351 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
353 blocksToMine--;
354 nTime += 600;
355 nHeight += 1;
356 }
357
359 // can reach any nTimeout other than NO_TIMEOUT due to earlier BOOST_REQUIRE
360
361 nTime = nTimeout;
362
363 // finish the last period before we start timing out
364 while (nHeight % params.nMinerConfirmationWindow != 0) {
365 lastBlock = firstChain.Mine(nHeight+1, nTime - 1, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
366 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
367 nHeight += 1;
368 }
369
370 // FAILED is only triggered at the end of a period, so CBV should be setting
371 // the bit until the period transition.
372 for (uint32_t i = 0; i < params.nMinerConfirmationWindow - 1; i++) {
373 lastBlock = firstChain.Mine(nHeight+1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
374 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
375 nHeight += 1;
376 }
377 // The next block should trigger no longer setting the bit.
378 lastBlock = firstChain.Mine(nHeight+1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
379 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
380 }
381
382 // On a new chain:
383 // verify that the bit will be set after lock-in, and then stop being set
384 // after activation.
385 nTime = nStartTime;
386
387 // Mine one period worth of blocks, and check that the bit will be on for the
388 // next period.
389 lastBlock = secondChain.Mine(params.nMinerConfirmationWindow, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
390 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
391
392 // Mine another period worth of blocks, signaling the new bit.
393 lastBlock = secondChain.Mine(params.nMinerConfirmationWindow * 2, nTime, VERSIONBITS_TOP_BITS | (1<<bit)).Tip();
394 // After one period of setting the bit on each block, it should have locked in.
395 // We keep setting the bit for one more period though, until activation.
396 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
397
398 // Now check that we keep mining the block until the end of this period, and
399 // then stop at the beginning of the next period.
400 lastBlock = secondChain.Mine((params.nMinerConfirmationWindow * 3) - 1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
401 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
402 lastBlock = secondChain.Mine(params.nMinerConfirmationWindow * 3, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
403
404 if (lastBlock->nHeight + 1 < min_activation_height) {
405 // check signalling continues while min_activation_height is not reached
406 lastBlock = secondChain.Mine(min_activation_height - 1, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
407 BOOST_CHECK((versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit)) != 0);
408 // then reach min_activation_height, which was already REQUIRE'd to start a new period
409 lastBlock = secondChain.Mine(min_activation_height, nTime, VERSIONBITS_LAST_OLD_BLOCK_VERSION).Tip();
410 }
411
412 // Check that we don't signal after activation
413 BOOST_CHECK_EQUAL(versionbitscache.ComputeBlockVersion(lastBlock, params) & (1 << bit), 0);
414}
415
416BOOST_AUTO_TEST_CASE(versionbits_computeblockversion)
417{
418 VersionBitsCache vbcache;
419
420 // check that any deployment on any chain can conceivably reach both
421 // ACTIVE and FAILED states in roughly the way we expect
423 const auto chainParams = CreateChainParams(*m_node.args, chain_type);
424 uint32_t chain_all_vbits{0};
425 for (int i = 0; i < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++i) {
426 const auto dep = static_cast<Consensus::DeploymentPos>(i);
427 // Check that no bits are reused (within the same chain). This is
428 // disallowed because the transition to FAILED (on timeout) does
429 // not take precedence over STARTED/LOCKED_IN. So all softforks on
430 // the same bit might overlap, even when non-overlapping start-end
431 // times are picked.
432 const uint32_t dep_mask{vbcache.Mask(chainParams->GetConsensus(), dep)};
433 BOOST_CHECK(!(chain_all_vbits & dep_mask));
434 chain_all_vbits |= dep_mask;
435 check_computeblockversion(vbcache, chainParams->GetConsensus(), dep);
436 }
437 }
438
439 {
440 // Use regtest/testdummy to ensure we always exercise some
441 // deployment that's not always/never active
443 args.ForceSetArg("-vbparams", "testdummy:1199145601:1230767999"); // January 1, 2008 - December 31, 2008
444 const auto chainParams = CreateChainParams(args, ChainType::REGTEST);
445 check_computeblockversion(vbcache, chainParams->GetConsensus(), Consensus::DEPLOYMENT_TESTDUMMY);
446 }
447
448 {
449 // Use regtest/testdummy to ensure we always exercise the
450 // min_activation_height test, even if we're not using that in a
451 // live deployment
453 args.ForceSetArg("-vbparams", "testdummy:1199145601:1230767999:403200"); // January 1, 2008 - December 31, 2008, min act height 403200
454 const auto chainParams = CreateChainParams(args, ChainType::REGTEST);
455 check_computeblockversion(vbcache, chainParams->GetConsensus(), Consensus::DEPLOYMENT_TESTDUMMY);
456 }
457}
458
node::NodeContext m_node
ArgsManager & args
Definition bitcoind.cpp:270
std::unique_ptr< const CChainParams > CreateChainParams(const ArgsManager &args, const ChainType chain)
Creates and returns a std::unique_ptr<CChainParams> of the chosen chain.
Abstract class that implements BIP9-style threshold logic, and caches results.
Definition versionbits.h:57
ThresholdState GetStateFor(const CBlockIndex *pindexPrev, const Consensus::Params &params, ThresholdConditionCache &cache) const
Returns the state for pindex A based on parent pindexPrev B.
int GetStateSinceHeightFor(const CBlockIndex *pindexPrev, const Consensus::Params &params, 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)
Definition args.cpp:545
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition chain.h:141
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition chain.h:147
void BuildSkip()
Build the skiplist pointer for this entry.
Definition chain.cpp:125
uint32_t nTime
Definition chain.h:189
int32_t nVersion
block header
Definition chain.h:187
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition chain.h:153
int64_t BeginTime(const Consensus::Params &params) const override
ThresholdConditionCache cache
int Threshold(const Consensus::Params &params) const override
int Period(const Consensus::Params &params) const override
int64_t BeginTime(const Consensus::Params &params) const override
bool Condition(const CBlockIndex *pindex, const Consensus::Params &params) const override
ThresholdState GetStateFor(const CBlockIndex *pindexPrev) const
int64_t EndTime(const Consensus::Params &params) const override
int GetStateSinceHeightFor(const CBlockIndex *pindexPrev) const
int MinActivationHeight(const Consensus::Params &params) const override
int64_t BeginTime(const Consensus::Params &params) const override
BIP 9 allows multiple softforks to be deployed in parallel.
Definition versionbits.h:81
int32_t ComputeBlockVersion(const CBlockIndex *pindexPrev, const Consensus::Params &params) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
Determine what nVersion a new block should use.
static uint32_t Mask(const Consensus::Params &params, Consensus::DeploymentPos pos)
void Clear() EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
VersionBitsTester & TestState(ThresholdState exp, ThresholdState exp_delayed)
VersionBitsTester & TestStateSinceHeight(int height)
VersionBitsTester & TestActive()
VersionBitsTester & TestFailed()
VersionBitsTester & TestLockedIn()
VersionBitsTester & TestState(ThresholdState exp)
VersionBitsTester & TestDefined()
TestDelayedActivationConditionChecker checker_delayed[CHECKERS]
VersionBitsTester & Mine(unsigned int height, int32_t nTime, int32_t nVersion)
VersionBitsTester & Reset()
VersionBitsTester & TestActiveDelayed()
std::vector< CBlockIndex * > vpblock
TestNeverActiveConditionChecker checker_never[CHECKERS]
TestConditionChecker checker[CHECKERS]
VersionBitsTester & TestStarted()
TestAlwaysActiveConditionChecker checker_always[CHECKERS]
VersionBitsTester & TestStateSinceHeight(int height, int height_delayed)
BOOST_AUTO_TEST_SUITE_END()
unsigned int nHeight
DeploymentPos
Definition params.h:32
@ DEPLOYMENT_TESTDUMMY
Definition params.h:33
@ MAX_VERSION_BITS_DEPLOYMENTS
Definition params.h:36
#define BOOST_CHECK_EQUAL(v1, v2)
Definition object.cpp:18
#define BOOST_CHECK(expr)
Definition object.cpp:17
Basic testing setup.
int min_activation_height
If lock in occurs, delay activation until at least this block height.
Definition params.h:54
int bit
Bit position to select the particular bit in nVersion.
Definition params.h:45
static constexpr int64_t ALWAYS_ACTIVE
Special value for nStartTime indicating that the deployment is always active.
Definition params.h:63
static constexpr int64_t NEVER_ACTIVE
Special value for nStartTime indicating that the deployment is never active.
Definition params.h:68
int64_t nTimeout
Timeout/expiry MedianTime for the deployment attempt.
Definition params.h:49
static constexpr int64_t NO_TIMEOUT
Constant for nTimeout very far in the future.
Definition params.h:57
int64_t nStartTime
Start MedianTime for version bits miner confirmation.
Definition params.h:47
Parameters that influence chain consensus.
Definition params.h:74
uint32_t nMinerConfirmationWindow
Definition params.h:106
BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS]
Definition params.h:107
ArgsManager * args
Definition context.h:71
static uint64_t InsecureRandBits(int bits)
Definition random.h:40
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
std::map< const CBlockIndex *, ThresholdState > ThresholdConditionCache
Definition versionbits.h:38
static const int32_t VERSIONBITS_TOP_BITS
What bits to set in version for versionbits blocks.
Definition versionbits.h:16
static const int32_t VERSIONBITS_LAST_OLD_BLOCK_VERSION
What block version to use for new blocks (pre versionbits)
Definition versionbits.h:14
static const int32_t VERSIONBITS_TOP_MASK
What bitmask determines whether versionbits is in use.
Definition versionbits.h:18
ThresholdState
BIP 9 defines a finite-state-machine to deploy a softfork in multiple stages.
Definition versionbits.h:27
#define CHECKERS
static const Consensus::Params paramsDummy
static std::string StateName(ThresholdState state)
static int32_t TestTime(int nHeight)
static void check_computeblockversion(VersionBitsCache &versionbitscache, const Consensus::Params &params, Consensus::DeploymentPos dep)
Check that ComputeBlockVersion will set the appropriate bit correctly.
BOOST_AUTO_TEST_CASE(versionbits_test)