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