Bitcoin ABC  0.26.3
P2P Digital Currency
grasberg_tests.cpp
Go to the documentation of this file.
1 // Copyright (c) 2015-2019 The Bitcoin Core developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <pow/grasberg.h>
6 
7 #include <chain.h>
8 #include <chainparams.h>
9 #include <test/lcg.h>
10 
11 #include <test/util/setup_common.h>
12 
13 #include <boost/test/unit_test.hpp>
14 
15 #include <cmath>
16 
17 using namespace grasberg;
18 
19 BOOST_FIXTURE_TEST_SUITE(grasberg_tests, BasicTestingSetup)
20 
25  BOOST_CHECK_EQUAL(deterministicExp2(0x000ff1ce), 724359);
26  BOOST_CHECK_EQUAL(deterministicExp2(0x0badf00d), 137991563);
27  BOOST_CHECK_EQUAL(deterministicExp2(0x7fffffff), 1779033703);
28  BOOST_CHECK_EQUAL(deterministicExp2(0x80000000), 1779033704);
29  BOOST_CHECK_EQUAL(deterministicExp2(0xdeadbeef), 3553907236);
30  BOOST_CHECK_EQUAL(deterministicExp2(0xfeedcafe), 4270091087);
31  BOOST_CHECK_EQUAL(deterministicExp2(0xffffffff), 4294967294);
32 
33  // 100 randomly picked values.
34  BOOST_CHECK_EQUAL(deterministicExp2(0x087ae9b4), 0x05f22b96);
35  BOOST_CHECK_EQUAL(deterministicExp2(0x5425cdf3), 0x41818942);
36  BOOST_CHECK_EQUAL(deterministicExp2(0x8dbb6e9b), 0x77c0cbd7);
37  BOOST_CHECK_EQUAL(deterministicExp2(0xc72cd267), 0xb6fc25bf);
38  BOOST_CHECK_EQUAL(deterministicExp2(0x9a67c66f), 0x84ded919);
39  BOOST_CHECK_EQUAL(deterministicExp2(0x94667388), 0x7e994692);
40  BOOST_CHECK_EQUAL(deterministicExp2(0x589c28c9), 0x456a0046);
41  BOOST_CHECK_EQUAL(deterministicExp2(0x54a063f8), 0x41ec5164);
42  BOOST_CHECK_EQUAL(deterministicExp2(0xe4741ebb), 0xdb33b0e3);
43  BOOST_CHECK_EQUAL(deterministicExp2(0xed6e1573), 0xe6e49c99);
44  BOOST_CHECK_EQUAL(deterministicExp2(0xd74a77d8), 0xca907219);
45  BOOST_CHECK_EQUAL(deterministicExp2(0xe9615051), 0xe19549ff);
46  BOOST_CHECK_EQUAL(deterministicExp2(0x4b52afdf), 0x39ea41a3);
47  BOOST_CHECK_EQUAL(deterministicExp2(0x9c23c8e3), 0x86b372e0);
48  BOOST_CHECK_EQUAL(deterministicExp2(0x7e3b8bb5), 0x684f7012);
49  BOOST_CHECK_EQUAL(deterministicExp2(0x6e2a4d01), 0x58f8adc7);
50  BOOST_CHECK_EQUAL(deterministicExp2(0xf82b8d68), 0xf5427e75);
51  BOOST_CHECK_EQUAL(deterministicExp2(0x95c28f4c), 0x80028e21);
52  BOOST_CHECK_EQUAL(deterministicExp2(0x7e7814bf), 0x688a837b);
53  BOOST_CHECK_EQUAL(deterministicExp2(0x315df77b), 0x249c68ce);
54  BOOST_CHECK_EQUAL(deterministicExp2(0x64c8d384), 0x5051d61a);
55  BOOST_CHECK_EQUAL(deterministicExp2(0x7e60ec44), 0x6873e8ca);
56  BOOST_CHECK_EQUAL(deterministicExp2(0x3b8b004f), 0x2cc90282);
57  BOOST_CHECK_EQUAL(deterministicExp2(0x444c4ea5), 0x3400274f);
58  BOOST_CHECK_EQUAL(deterministicExp2(0x80759f4a), 0x6a7d4596);
59  BOOST_CHECK_EQUAL(deterministicExp2(0xe7e46027), 0xdfa5919f);
60  BOOST_CHECK_EQUAL(deterministicExp2(0x487b844b), 0x37829001);
61  BOOST_CHECK_EQUAL(deterministicExp2(0xdd45a3f4), 0xd20d0b36);
62  BOOST_CHECK_EQUAL(deterministicExp2(0x3e03f2ea), 0x2ece376f);
63  BOOST_CHECK_EQUAL(deterministicExp2(0xe69e7c49), 0xddff10d2);
64  BOOST_CHECK_EQUAL(deterministicExp2(0x2901bda5), 0x1e0fcf09);
65  BOOST_CHECK_EQUAL(deterministicExp2(0x196a8489), 0x123cc6f8);
66  BOOST_CHECK_EQUAL(deterministicExp2(0x9a19b128), 0x848caaea);
67  BOOST_CHECK_EQUAL(deterministicExp2(0x0398cca8), 0x02815e0a);
68  BOOST_CHECK_EQUAL(deterministicExp2(0xbef03f61), 0xad4da3d5);
69  BOOST_CHECK_EQUAL(deterministicExp2(0x102e1734), 0x0b76e599);
70  BOOST_CHECK_EQUAL(deterministicExp2(0xf363cf7b), 0xeed050f5);
71  BOOST_CHECK_EQUAL(deterministicExp2(0x82c00c2d), 0x6cbe9fc1);
72  BOOST_CHECK_EQUAL(deterministicExp2(0xcffbcde3), 0xc194a25a);
73  BOOST_CHECK_EQUAL(deterministicExp2(0x18d6f2fe), 0x11cf4a02);
74  BOOST_CHECK_EQUAL(deterministicExp2(0xde1ea615), 0xd31f327e);
75  BOOST_CHECK_EQUAL(deterministicExp2(0x0e96d48f), 0x0a509911);
76  BOOST_CHECK_EQUAL(deterministicExp2(0x378fa034), 0x298f481e);
77  BOOST_CHECK_EQUAL(deterministicExp2(0x857061ec), 0x6f68e4c5);
78  BOOST_CHECK_EQUAL(deterministicExp2(0xc8408fdd), 0xb8445ebf);
79  BOOST_CHECK_EQUAL(deterministicExp2(0x09c3db93), 0x06dbe12d);
80  BOOST_CHECK_EQUAL(deterministicExp2(0x128598df), 0x0d2a6e92);
81  BOOST_CHECK_EQUAL(deterministicExp2(0x7fa9d335), 0x69b57700);
82  BOOST_CHECK_EQUAL(deterministicExp2(0x1177f216), 0x0c6630f5);
83  BOOST_CHECK_EQUAL(deterministicExp2(0xa7b1dfcd), 0x931e2c0c);
84  BOOST_CHECK_EQUAL(deterministicExp2(0xb0be2271), 0x9d1d8e6c);
85  BOOST_CHECK_EQUAL(deterministicExp2(0x665c61aa), 0x51c21b91);
86  BOOST_CHECK_EQUAL(deterministicExp2(0xe4472200), 0xdaf9d24c);
87  BOOST_CHECK_EQUAL(deterministicExp2(0x9ba928c3), 0x8631cfcc);
88  BOOST_CHECK_EQUAL(deterministicExp2(0xd1464a98), 0xc327a2cc);
89  BOOST_CHECK_EQUAL(deterministicExp2(0x64a0901d), 0x502d2df6);
90  BOOST_CHECK_EQUAL(deterministicExp2(0x636df03b), 0x4f16881e);
91  BOOST_CHECK_EQUAL(deterministicExp2(0x61bf5d3f), 0x4d90c410);
92  BOOST_CHECK_EQUAL(deterministicExp2(0xa8bf3caa), 0x944498b4);
93  BOOST_CHECK_EQUAL(deterministicExp2(0x683ed475), 0x537c7131);
94  BOOST_CHECK_EQUAL(deterministicExp2(0xb375673c), 0xa02a1e57);
95  BOOST_CHECK_EQUAL(deterministicExp2(0xcd1e7fa3), 0xbe1b716f);
96  BOOST_CHECK_EQUAL(deterministicExp2(0x8d064b3f), 0x7708af2d);
97  BOOST_CHECK_EQUAL(deterministicExp2(0x83148fe1), 0x6d122064);
98  BOOST_CHECK_EQUAL(deterministicExp2(0xbee2c2b4), 0xad3df6c9);
99  BOOST_CHECK_EQUAL(deterministicExp2(0x8f39659e), 0x794630af);
100  BOOST_CHECK_EQUAL(deterministicExp2(0x0cc3e1a5), 0x0900b8f2);
101  BOOST_CHECK_EQUAL(deterministicExp2(0xc41798fb), 0xb355fb23);
102  BOOST_CHECK_EQUAL(deterministicExp2(0x4dc8ef08), 0x3c03bab6);
103  BOOST_CHECK_EQUAL(deterministicExp2(0x00171815), 0x00100270);
104  BOOST_CHECK_EQUAL(deterministicExp2(0xdb6c9075), 0xcfb99180);
105  BOOST_CHECK_EQUAL(deterministicExp2(0x13cd960c), 0x0e19e23a);
106  BOOST_CHECK_EQUAL(deterministicExp2(0x9e19dd37), 0x88c7fe4a);
107  BOOST_CHECK_EQUAL(deterministicExp2(0x3afa11d6), 0x2c53111d);
108  BOOST_CHECK_EQUAL(deterministicExp2(0x03867141), 0x0274851a);
109  BOOST_CHECK_EQUAL(deterministicExp2(0x65b991fe), 0x512d57a0);
110  BOOST_CHECK_EQUAL(deterministicExp2(0x8960fee9), 0x7359a24d);
111  BOOST_CHECK_EQUAL(deterministicExp2(0x06302a65), 0x04534f70);
112  BOOST_CHECK_EQUAL(deterministicExp2(0x9ab4e776), 0x85301748);
113  BOOST_CHECK_EQUAL(deterministicExp2(0xd5c11fed), 0xc8a9149c);
114  BOOST_CHECK_EQUAL(deterministicExp2(0xcd325145), 0xbe33626d);
115  BOOST_CHECK_EQUAL(deterministicExp2(0x45dd5919), 0x354f4f40);
116  BOOST_CHECK_EQUAL(deterministicExp2(0xa5074b00), 0x9037d404);
117  BOOST_CHECK_EQUAL(deterministicExp2(0x19139f48), 0x11fc48dc);
118  BOOST_CHECK_EQUAL(deterministicExp2(0x0ef74095), 0x0a962932);
119  BOOST_CHECK_EQUAL(deterministicExp2(0x6d1ae43b), 0x57fb888b);
120  BOOST_CHECK_EQUAL(deterministicExp2(0x021946f0), 0x017578d9);
121  BOOST_CHECK_EQUAL(deterministicExp2(0xcae745a8), 0xbb7059dd);
122  BOOST_CHECK_EQUAL(deterministicExp2(0x47572522), 0x368c57ef);
123  BOOST_CHECK_EQUAL(deterministicExp2(0x576843af), 0x445b2880);
124  BOOST_CHECK_EQUAL(deterministicExp2(0x5b5734e9), 0x47d4359b);
125  BOOST_CHECK_EQUAL(deterministicExp2(0xb504a24a), 0xa1eced3c);
126  BOOST_CHECK_EQUAL(deterministicExp2(0xa99c6f97), 0x95370102);
127  BOOST_CHECK_EQUAL(deterministicExp2(0xd63094c2), 0xc932f907);
128  BOOST_CHECK_EQUAL(deterministicExp2(0x8339e407), 0x6d370833);
129  BOOST_CHECK_EQUAL(deterministicExp2(0x79056f7b), 0x63430c57);
130  BOOST_CHECK_EQUAL(deterministicExp2(0xee327961), 0xe7e7c8fb);
131  BOOST_CHECK_EQUAL(deterministicExp2(0x89c5e1a0), 0x73bf2027);
132  BOOST_CHECK_EQUAL(deterministicExp2(0x1f28adf5), 0x1688f169);
133  BOOST_CHECK_EQUAL(deterministicExp2(0x74abd815), 0x5f1a2852);
134 
135  // Check a ton of random values.
136  MMIXLinearCongruentialGenerator lcg;
137  for (int i = 0; i < 100000; i++) {
138  static constexpr int64_t POW2_32 = int64_t(1) << 32;
139 
140  const uint32_t n = lcg.next();
141  const double d = double(n) / POW2_32;
142 
143  const double computed = double(deterministicExp2(n)) / POW2_32;
144  const double expected = exp2(d) - 1;
145 
146  BOOST_CHECK(fabs(computed - expected) < 0.0000000075);
147  }
148 }
149 
150 BOOST_AUTO_TEST_CASE(target_block_time_test) {
151  const auto chainParams =
153  const auto &params = chainParams->GetConsensus();
154 
155  const int nHeight = 100000;
156  const int64_t expectedBlockTime =
157  nHeight * params.nPowTargetSpacing + chainParams->GenesisBlock().nTime;
158 
159  CBlockIndex block;
160  block.nHeight = nHeight;
161  block.nTime = expectedBlockTime;
162 
163  // When block come on schedule, the block time is what we expect.
164  BOOST_CHECK_EQUAL(computeTargetBlockTime(&block, *chainParams),
165  params.nPowTargetSpacing);
166 
167  // As block come later and later, the block time we target gets shorter.
168  int64_t currentTarget = params.nPowTargetSpacing;
169  std::vector<int> downSteps = {
170  2910, 2916, 2921, 2925, 2931, 2935, 2941, 2945, 2950, 2955, 2961,
171  2965, 2970, 2976, 2980, 2986, 2991, 2995, 3001, 3007, 3011, 3016,
172  3022, 3027, 3033, 3037, 3043, 3048, 3054, 3059, 3064, 3069, 3076,
173  3080, 3086, 3091, 3097, 3103, 3107, 3114, 3119, 3124, 3131, 3135,
174  3142, 3147, 3153, 3158, 3165, 3170, 3175, 3182, 3187, 3194, 3199,
175  3205, 3210, 3217, 3223, 3228, 3235, 3241, 3246, 3253, 3259, 3265,
176  };
177 
178  for (int step : downSteps) {
179  currentTarget--;
180  for (int i = 0; i < step; i++) {
181  block.nTime++;
182  BOOST_CHECK_EQUAL(computeTargetBlockTime(&block, *chainParams),
183  currentTarget);
184  }
185  }
186 
187  // Now we reached saturation and the targeted block time will stay where it
188  // is.
189  currentTarget--;
190  for (int i = 0; i < 10000; i++) {
191  block.nTime++;
192  BOOST_CHECK_EQUAL(computeTargetBlockTime(&block, *chainParams),
193  currentTarget);
194  }
195 
196  // As block come sooner and sooner, the block time we target gets longer.
197  block.nTime = expectedBlockTime;
198  currentTarget = params.nPowTargetSpacing;
199  std::vector<int> upSteps = {
200  2906, 2901, 2896, 2892, 2887, 2882, 2877, 2873, 2867, 2864, 2858,
201  2854, 2849, 2844, 2840, 2835, 2831, 2826, 2822, 2816, 2813, 2808,
202  2803, 2799, 2794, 2790, 2786, 2781, 2776, 2772, 2768, 2764, 2759,
203  2754, 2751, 2746, 2741, 2738, 2733, 2729, 2724, 2721, 2716, 2711,
204  2708, 2704, 2699, 2695, 2691, 2687, 2682, 2679, 2674, 2671, 2666,
205  2662, 2658, 2655, 2650, 2646, 2642, 2638, 2634, 2630, 2626, 2622,
206  2619, 2614, 2611, 2606, 2603, 2599, 2594, 2592,
207  };
208 
209  for (int step : upSteps) {
210  for (int i = 0; i < step; i++) {
211  block.nTime--;
212  BOOST_CHECK_EQUAL(computeTargetBlockTime(&block, *chainParams),
213  currentTarget);
214  }
215  currentTarget++;
216  }
217 
218  // Now we reached saturation and the targeted block time will stay where it
219  // is.
220  for (int i = 0; i < 10000; i++) {
221  block.nTime--;
222  BOOST_CHECK_EQUAL(computeTargetBlockTime(&block, *chainParams),
223  currentTarget);
224  }
225 }
226 
227 static CBlockIndex GetBlockIndex(CBlockIndex *pindexPrev, int64_t nTimeInterval,
228  uint32_t nBits) {
229  CBlockIndex block;
230  block.pprev = pindexPrev;
231  block.nHeight = pindexPrev->nHeight + 1;
232  block.nTime = pindexPrev->nTime + nTimeInterval;
233  block.nBits = nBits;
234 
235  block.nChainWork = pindexPrev->nChainWork + GetBlockProof(block);
236  return block;
237 }
238 
239 BOOST_AUTO_TEST_CASE(grasberg_test) {
240  const auto chainParams =
242  const auto &params = chainParams->GetConsensus();
243 
244  std::vector<CBlockIndex> blocks(3000);
245 
246  const arith_uint256 powLimit = UintToArith256(params.powLimit);
247  uint32_t powLimitBits = powLimit.GetCompact();
248  arith_uint256 currentPow = powLimit >> 4;
249  uint32_t initialBits = currentPow.GetCompact();
250 
251  // Genesis block.
252  blocks[0] = CBlockIndex();
253  blocks[0].nHeight = 0;
254  blocks[0].nTime = 1269211443;
255  blocks[0].nBits = initialBits;
256 
257  blocks[0].nChainWork = GetBlockProof(blocks[0]);
258 
259  // Check that we can use Grasberg directly from genesis.
260  CBlockHeader blkHeaderDummy;
261  uint32_t nBits =
262  GetNextGrasbergWorkRequired(&blocks[0], &blkHeaderDummy, *chainParams);
263  BOOST_CHECK_EQUAL(nBits, 0x1c100195);
264 
265  // Mine several blocks and check the difficulty.
266  size_t h = 1;
267 
268  // Mine regular 600s blocks.
269  std::vector<uint32_t> diffs = {
270  0x1c10032b, 0x1c1004c1, 0x1c100658, 0x1c1007ef, 0x1c100986, 0x1c100b1d,
271  0x1c100cb4, 0x1c100e4b, 0x1c100fe3, 0x1c10117b, 0x1c101313, 0x1c1014ab,
272  0x1c101643, 0x1c1017db, 0x1c101974, 0x1c101b0d, 0x1c101ca6, 0x1c101e3f,
273  0x1c101fd8, 0x1c102171, 0x1c10230a, 0x1c1024a4, 0x1c10263e, 0x1c1027d8,
274  0x1c102972, 0x1c102b0c, 0x1c102ca6, 0x1c102e41, 0x1c102fdc, 0x1c103177,
275  0x1c103312, 0x1c1034ad, 0x1c103648, 0x1c1037e4, 0x1c103980, 0x1c103b1c,
276  0x1c103cb8, 0x1c103e54, 0x1c103ff0, 0x1c10418c, 0x1c104329, 0x1c1044c6,
277  0x1c104663, 0x1c104800, 0x1c10499d, 0x1c104b3a, 0x1c104cd8, 0x1c104e76,
278  0x1c105014, 0x1c1051b2, 0x1c105350, 0x1c1054ee, 0x1c10568d, 0x1c10582c,
279  0x1c1059cb, 0x1c105b6a, 0x1c105d09, 0x1c105ea8, 0x1c106048, 0x1c1061e8,
280  0x1c106388, 0x1c106528, 0x1c1066c8, 0x1c106868, 0x1c106a09, 0x1c106baa,
281  0x1c106d4b, 0x1c106eec, 0x1c10708d, 0x1c10722e, 0x1c1073cf, 0x1c107571,
282  0x1c107713, 0x1c1078b5, 0x1c107a57, 0x1c107bf9, 0x1c107d9b, 0x1c107f3e,
283  0x1c1080e1, 0x1c108284, 0x1c108427, 0x1c1085ca, 0x1c10876d, 0x1c108911,
284  0x1c108ab5, 0x1c108c59, 0x1c108dfd, 0x1c108fa1, 0x1c109145, 0x1c1092ea,
285  0x1c10948f, 0x1c109634, 0x1c1097d9, 0x1c10997e, 0x1c109b23, 0x1c109cc9,
286  0x1c109e6f, 0x1c10a015, 0x1c10a1bb, 0x1c10a361, 0x1c10a507, 0x1c10a6ae,
287  0x1c10a855, 0x1c10a9fc, 0x1c10aba3, 0x1c10ad4a, 0x1c10aef1, 0x1c10b099,
288  0x1c10b241, 0x1c10b3e9, 0x1c10b591, 0x1c10b739, 0x1c10b8e1, 0x1c10ba8a,
289  0x1c10bc33, 0x1c10bddc, 0x1c10bf85, 0x1c10c12e, 0x1c10c2d7, 0x1c10c480,
290  0x1c10c62a, 0x1c10c7d4, 0x1c10c97e, 0x1c10cb28, 0x1c10ccd2, 0x1c10ce7c,
291  0x1c10d027, 0x1c10d1d2, 0x1c10d37d, 0x1c10d528, 0x1c10d6d3, 0x1c10d87e,
292  0x1c10da2a, 0x1c10dbd6, 0x1c10dd82, 0x1c10df2e, 0x1c10e0da, 0x1c10e286,
293  0x1c10e433, 0x1c10e5e0, 0x1c10e78d, 0x1c10e93a, 0x1c10eae7, 0x1c10ec94,
294  0x1c10ee42, 0x1c10eff0, 0x1c10f19e, 0x1c10f34c, 0x1c10f4fa, 0x1c10f6a8,
295  0x1c10f857, 0x1c10fa06, 0x1c10fbb5, 0x1c10fd64, 0x1c10ff13, 0x1c1100c2,
296  0x1c110272, 0x1c110422, 0x1c1105d2, 0x1c110782, 0x1c110932, 0x1c110ae2,
297  0x1c110c93, 0x1c110e44, 0x1c110ff5, 0x1c1111a6, 0x1c111357, 0x1c111508,
298  0x1c1116ba, 0x1c11186c, 0x1c111a1e, 0x1c111bd0, 0x1c111d82, 0x1c111f34,
299  0x1c1120e7, 0x1c11229a, 0x1c11244d, 0x1c112600, 0x1c1127b3, 0x1c112967,
300  0x1c112b1b, 0x1c112ccf, 0x1c112e83, 0x1c113037, 0x1c1131eb, 0x1c1133a0,
301  0x1c113555, 0x1c11370a, 0x1c1138bf, 0x1c113a74, 0x1c113c29, 0x1c113ddf,
302  0x1c113f95, 0x1c11414b, 0x1c114301, 0x1c1144b7, 0x1c11466d, 0x1c114824,
303  0x1c1149db, 0x1c114b92, 0x1c114d49, 0x1c114f00, 0x1c1150b7, 0x1c11526f,
304  0x1c115427, 0x1c1155df, 0x1c115797, 0x1c11594f, 0x1c115b07, 0x1c115cc0,
305  0x1c115e79, 0x1c116032, 0x1c1161eb, 0x1c1163a4, 0x1c11655d, 0x1c116717,
306  0x1c1168d1, 0x1c116a8b, 0x1c116c45, 0x1c116dff, 0x1c116fb9, 0x1c117174,
307  0x1c11732f, 0x1c1174ea, 0x1c1176a5, 0x1c117860, 0x1c117a1c, 0x1c117bd8,
308  0x1c117d94, 0x1c117f50, 0x1c11810c, 0x1c1182c8, 0x1c118485, 0x1c118642,
309  0x1c1187ff, 0x1c1189bc, 0x1c118b79, 0x1c118d36, 0x1c118ef4, 0x1c1190b2,
310  0x1c119270, 0x1c11942e, 0x1c1195ec, 0x1c1197aa, 0x1c119969, 0x1c119b28,
311  0x1c119ce7, 0x1c119ea6, 0x1c11a065, 0x1c11a224, 0x1c11a3e4, 0x1c11a5a4,
312  0x1c11a764, 0x1c11a924, 0x1c11aae4, 0x1c11aca5, 0x1c11ae66, 0x1c11b027,
313  0x1c11b1e8, 0x1c11b3a9, 0x1c11b56a, 0x1c11b72c, 0x1c11b8ee, 0x1c11bab0,
314  0x1c11bc72, 0x1c11be34, 0x1c11bff6, 0x1c11c1b9, 0x1c11c37c, 0x1c11c53f,
315  0x1c11c702, 0x1c11c8c5, 0x1c11ca88, 0x1c11cc4c, 0x1c11ce10, 0x1c11cfd4,
316  0x1c11d198, 0x1c11d35c, 0x1c11d521, 0x1c11d6e6, 0x1c11d8ab, 0x1c11da70,
317  0x1c11dc35, 0x1c11ddfa, 0x1c11dfc0, 0x1c11e186, 0x1c11e34c, 0x1c11e512,
318  0x1c11e6d8, 0x1c11e89e, 0x1c11ea65, 0x1c11ec2c, 0x1c11edf3, 0x1c11efba,
319  0x1c11f181, 0x1c11f349, 0x1c11f511, 0x1c11f6d9, 0x1c11f8a1, 0x1c11fa69,
320  };
321 
322  for (uint32_t expected : diffs) {
323  blocks[h] = GetBlockIndex(&blocks[h - 1], 600, nBits);
324  nBits = GetNextGrasbergWorkRequired(&blocks[h], &blkHeaderDummy,
325  *chainParams);
326  BOOST_CHECK_EQUAL(nBits, expected);
327  h++;
328  }
329 
330  // Mine faster to raise difficulty.
331  diffs = {
332  0x1c11eee4, 0x1c11e366, 0x1c11d7f0, 0x1c11cc81, 0x1c11c119, 0x1c11b5b9,
333  0x1c11aa60, 0x1c119f0e, 0x1c1193c3, 0x1c118880, 0x1c117d44, 0x1c11720f,
334  0x1c1166e1, 0x1c115bba, 0x1c11509a, 0x1c114582, 0x1c113a71, 0x1c112f67,
335  0x1c112464, 0x1c111968, 0x1c110e73, 0x1c110385, 0x1c10f89e, 0x1c10edbe,
336  0x1c10e2e5, 0x1c10d813, 0x1c10cd48, 0x1c10c284, 0x1c10b7c7, 0x1c10ad11,
337  0x1c10a261, 0x1c1097b8, 0x1c108d16, 0x1c10827b, 0x1c1077e7, 0x1c106d59,
338  0x1c1062d2, 0x1c105852, 0x1c104dd9, 0x1c104366, 0x1c1038fa, 0x1c102e95,
339  0x1c102436, 0x1c1019de, 0x1c100f8d, 0x1c100542, 0x1c0ffafe, 0x1c0ff0c0,
340  0x1c0fe689, 0x1c0fdc59, 0x1c0fd22f, 0x1c0fc80c, 0x1c0fbdef, 0x1c0fb3d9,
341  0x1c0fa9c9, 0x1c0f9fc0, 0x1c0f95bd, 0x1c0f8bc0, 0x1c0f81ca, 0x1c0f77da,
342  0x1c0f6df0, 0x1c0f640d, 0x1c0f5a30, 0x1c0f5059, 0x1c0f4689, 0x1c0f3cbf,
343  0x1c0f32fb, 0x1c0f293e, 0x1c0f1f87, 0x1c0f15d6, 0x1c0f0c2b, 0x1c0f0286,
344  0x1c0ef8e8, 0x1c0eef50, 0x1c0ee5be, 0x1c0edc32, 0x1c0ed2ac, 0x1c0ec92c,
345  0x1c0ebfb2, 0x1c0eb63e, 0x1c0eacd1, 0x1c0ea36a, 0x1c0e9a09, 0x1c0e90ae,
346  0x1c0e8759, 0x1c0e7e0a, 0x1c0e74c1, 0x1c0e6b7d, 0x1c0e623f, 0x1c0e5907,
347  0x1c0e4fd5, 0x1c0e46a9, 0x1c0e3d83, 0x1c0e3463, 0x1c0e2b49, 0x1c0e2235,
348  0x1c0e1926, 0x1c0e101d, 0x1c0e071a, 0x1c0dfe1d, 0x1c0df526, 0x1c0dec34,
349  0x1c0de348, 0x1c0dda62, 0x1c0dd181, 0x1c0dc8a6, 0x1c0dbfd1, 0x1c0db701,
350  0x1c0dae37, 0x1c0da573, 0x1c0d9cb4, 0x1c0d93fb, 0x1c0d8b47, 0x1c0d8299,
351  0x1c0d79f1, 0x1c0d714e, 0x1c0d68b1, 0x1c0d6019, 0x1c0d5787, 0x1c0d4efa,
352  0x1c0d4673, 0x1c0d3df1, 0x1c0d3575, 0x1c0d2cfe, 0x1c0d248c, 0x1c0d1c20,
353  0x1c0d13b9, 0x1c0d0b58, 0x1c0d02fc, 0x1c0cfaa5, 0x1c0cf254, 0x1c0cea08,
354  0x1c0ce1c1, 0x1c0cd980, 0x1c0cd144, 0x1c0cc90d, 0x1c0cc0dc, 0x1c0cb8b0,
355  0x1c0cb089, 0x1c0ca867, 0x1c0ca04a, 0x1c0c9833, 0x1c0c9021, 0x1c0c8814,
356  0x1c0c800c, 0x1c0c7809, 0x1c0c700b, 0x1c0c6813, 0x1c0c6020, 0x1c0c5832,
357  0x1c0c5049, 0x1c0c4865, 0x1c0c4086, 0x1c0c38ac, 0x1c0c30d7, 0x1c0c2907,
358  0x1c0c213c, 0x1c0c1976, 0x1c0c11b5, 0x1c0c09f9, 0x1c0c0242, 0x1c0bfa90,
359  0x1c0bf2e3, 0x1c0beb3b, 0x1c0be398, 0x1c0bdbfa, 0x1c0bd460, 0x1c0bcccb,
360  0x1c0bc53b, 0x1c0bbdb0, 0x1c0bb62a, 0x1c0baea9, 0x1c0ba72c, 0x1c0b9fb4,
361  0x1c0b9841, 0x1c0b90d3, 0x1c0b896a, 0x1c0b8205, 0x1c0b7aa5, 0x1c0b734a,
362  0x1c0b6bf3, 0x1c0b64a1, 0x1c0b5d54, 0x1c0b560c, 0x1c0b4ec8, 0x1c0b4789,
363  0x1c0b404f, 0x1c0b3919, 0x1c0b31e8, 0x1c0b2abb, 0x1c0b2393, 0x1c0b1c70,
364  0x1c0b1551, 0x1c0b0e37, 0x1c0b0721, 0x1c0b0010, 0x1c0af903, 0x1c0af1fb,
365  0x1c0aeaf7, 0x1c0ae3f8, 0x1c0adcfd, 0x1c0ad607, 0x1c0acf15, 0x1c0ac828,
366  0x1c0ac13f, 0x1c0aba5b, 0x1c0ab37b, 0x1c0aac9f, 0x1c0aa5c8, 0x1c0a9ef5,
367  0x1c0a9827, 0x1c0a915d, 0x1c0a8a97, 0x1c0a83d6, 0x1c0a7d19, 0x1c0a7660,
368  0x1c0a6fac, 0x1c0a68fc, 0x1c0a6250, 0x1c0a5ba8, 0x1c0a5505, 0x1c0a4e66,
369  0x1c0a47cb, 0x1c0a4134, 0x1c0a3aa2, 0x1c0a3414, 0x1c0a2d8a, 0x1c0a2704,
370  0x1c0a2082, 0x1c0a1a05, 0x1c0a138c, 0x1c0a0d17, 0x1c0a06a6, 0x1c0a0039,
371  0x1c09f9d0, 0x1c09f36b, 0x1c09ed0a, 0x1c09e6ae, 0x1c09e056, 0x1c09da02,
372  0x1c09d3b2, 0x1c09cd66, 0x1c09c71e, 0x1c09c0da, 0x1c09ba9a, 0x1c09b45e,
373  0x1c09ae26, 0x1c09a7f2, 0x1c09a1c2, 0x1c099b96, 0x1c09956e, 0x1c098f4a,
374  0x1c09892a, 0x1c09830d, 0x1c097cf4, 0x1c0976df, 0x1c0970ce, 0x1c096ac1,
375  0x1c0964b8, 0x1c095eb3, 0x1c0958b2, 0x1c0952b5, 0x1c094cbb, 0x1c0946c5,
376  0x1c0940d3, 0x1c093ae5, 0x1c0934fb, 0x1c092f14, 0x1c092931, 0x1c092352,
377  0x1c091d77, 0x1c09179f, 0x1c0911cb, 0x1c090bfb, 0x1c09062f, 0x1c090066,
378  0x1c08faa1, 0x1c08f4e0, 0x1c08ef22, 0x1c08e968, 0x1c08e3b2, 0x1c08de00,
379  0x1c08d851, 0x1c08d2a6, 0x1c08ccfe, 0x1c08c75a, 0x1c08c1ba, 0x1c08bc1d,
380  0x1c08b684, 0x1c08b0ee, 0x1c08ab5c, 0x1c08a5ce, 0x1c08a043, 0x1c089abc,
381  0x1c089538, 0x1c088fb8, 0x1c088a3b, 0x1c0884c2, 0x1c087f4c, 0x1c0879da,
382  };
383 
384  for (uint32_t expected : diffs) {
385  blocks[h] = GetBlockIndex(&blocks[h - 1], 100, nBits);
386  nBits = GetNextGrasbergWorkRequired(&blocks[h], &blkHeaderDummy,
387  *chainParams);
388  BOOST_CHECK_EQUAL(nBits, expected);
389  h++;
390  }
391 
392  // Mine slow blocks to lower and saturate the diffculty.
393  diffs = {
394  0x1c08a0b5, 0x1c08c842, 0x1c08f084, 0x1c09197f, 0x1c094336, 0x1c096dac,
395  0x1c0998e4, 0x1c09c4e3, 0x1c09f1ab, 0x1c0a1f41, 0x1c0a4da8, 0x1c0a7ce3,
396  0x1c0aacf7, 0x1c0adde7, 0x1c0b0fb8, 0x1c0b426d, 0x1c0b760a, 0x1c0baa94,
397  0x1c0be00f, 0x1c0c167f, 0x1c0c4de9, 0x1c0c8651, 0x1c0cbfbb, 0x1c0cfa2c,
398  0x1c0d35a9, 0x1c0d7237, 0x1c0dafdb, 0x1c0dee99, 0x1c0e2e77, 0x1c0e6f7a,
399  0x1c0eb1a7, 0x1c0ef503, 0x1c0f3994, 0x1c0f7f5f, 0x1c0fc66a, 0x1c100ebb,
400  0x1c105857, 0x1c10a345, 0x1c10ef8a, 0x1c113d2d, 0x1c118c34, 0x1c11dca5,
401  0x1c122e87, 0x1c1281e0, 0x1c12d6b7, 0x1c132d13, 0x1c1384fb, 0x1c13de76,
402  0x1c14398b, 0x1c149642, 0x1c14f4a2, 0x1c1554b3, 0x1c15b67c, 0x1c161a05,
403  0x1c167f57, 0x1c16e679, 0x1c174f74, 0x1c17ba50, 0x1c182716, 0x1c1895cf,
404  0x1c190683, 0x1c19793c, 0x1c19ee03, 0x1c1a64e1, 0x1c1adde0, 0x1c1b590a,
405  0x1c1bd668, 0x1c1c5605, 0x1c1cd7eb, 0x1c1d5c25, 0x1c1de2bd, 0x1c1e6bbe,
406  0x1c1ef733, 0x1c1f8527, 0x1c2015a6, 0x1c20a8bb, 0x1c213e73, 0x1c21d6d9,
407  0x1c2271fa, 0x1c230fe2, 0x1c23b09e, 0x1c24543a, 0x1c24fac5, 0x1c25a44b,
408  0x1c2650da, 0x1c270080, 0x1c27b34b, 0x1c28694a, 0x1c29228b, 0x1c29df1e,
409  0x1c2a9f11, 0x1c2b6274, 0x1c2c2957, 0x1c2cf3ca, 0x1c2dc1dd, 0x1c2e93a0,
410  0x1c2f6925, 0x1c30427d, 0x1c311fb9, 0x1c3200eb, 0x1c32e626, 0x1c33cf7c,
411  0x1c34bcff, 0x1c35aec3, 0x1c36a4db, 0x1c379f5c, 0x1c389e59, 0x1c39a1e7,
412  0x1c3aaa1b, 0x1c3bb70a, 0x1c3cc8ca, 0x1c3ddf71, 0x1c3efb15, 0x1c401bcd,
413  0x1c4141b1, 0x1c426cd8, 0x1c439d5b, 0x1c44d352, 0x1c460ed6, 0x1c475000,
414  0x1c4896ea, 0x1c49e3af, 0x1c4b366a, 0x1c4c8f35, 0x1c4dee2d, 0x1c4f536e,
415  0x1c50bf15, 0x1c52313f, 0x1c53aa0a, 0x1c552994, 0x1c56affc, 0x1c583d62,
416  0x1c59d1e6, 0x1c5b6da8, 0x1c5d10ca, 0x1c5ebb6d, 0x1c606db4, 0x1c6227c2,
417  0x1c63e9bb, 0x1c65b3c2, 0x1c6785fd, 0x1c696091, 0x1c6b43a5, 0x1c6d2f60,
418  0x1c6f23e9, 0x1c712169, 0x1c732808, 0x1c7537f1, 0x1c77514e, 0x1c79744a,
419  0x1c7ba112, 0x1c7dd7d2, 0x1d008018, 0x1d008263, 0x1d0084b8, 0x1d008718,
420  0x1d008983, 0x1d008bf9, 0x1d008e7a, 0x1d009107, 0x1d00939f, 0x1d009643,
421  0x1d0098f3, 0x1d009bb0, 0x1d009e79, 0x1d00a14f, 0x1d00a432, 0x1d00a722,
422  0x1d00aa20, 0x1d00ad2b, 0x1d00b044, 0x1d00b36c, 0x1d00b6a2, 0x1d00b9e7,
423  0x1d00bd3b, 0x1d00c09e, 0x1d00c411, 0x1d00c793, 0x1d00cb25, 0x1d00cec8,
424  0x1d00d27b, 0x1d00d63f, 0x1d00da15, 0x1d00ddfc, 0x1d00e1f5, 0x1d00e600,
425  0x1d00ea1e, 0x1d00ee4f, 0x1d00f293, 0x1d00f6eb, 0x1d00fb56, 0x1d00ffd6,
426  0x1d00ffff, 0x1d00ffff, 0x1d00ffff, 0x1d00ffff, 0x1d00ffff, 0x1d00ffff,
427  0x1d00ffff, 0x1d00ffff,
428  };
429 
430  for (uint32_t expected : diffs) {
431  blocks[h] = GetBlockIndex(&blocks[h - 1], 3600, nBits);
432  nBits = GetNextGrasbergWorkRequired(&blocks[h], &blkHeaderDummy,
433  *chainParams);
434  BOOST_CHECK_EQUAL(nBits, expected);
435  h++;
436  }
437 
438  // We floored the difficulty.
439  BOOST_CHECK_EQUAL(nBits, powLimitBits);
440 
441  // Check for 0 solve time.
442  diffs = {
443  0x1d00ff35, 0x1d00fe6b, 0x1d00fda2, 0x1d00fcda, 0x1d00fc12, 0x1d00fb4b,
444  0x1d00fa84, 0x1d00f9be, 0x1d00f8f9, 0x1d00f834, 0x1d00f770, 0x1d00f6ac,
445  0x1d00f5e9, 0x1d00f527, 0x1d00f465, 0x1d00f3a4, 0x1d00f2e3, 0x1d00f223,
446  0x1d00f164, 0x1d00f0a5, 0x1d00efe7, 0x1d00ef29, 0x1d00ee6c, 0x1d00edb0,
447  0x1d00ecf4, 0x1d00ec39, 0x1d00eb7e, 0x1d00eac4, 0x1d00ea0a, 0x1d00e951,
448  0x1d00e899, 0x1d00e7e1, 0x1d00e72a, 0x1d00e673, 0x1d00e5bd, 0x1d00e507,
449  0x1d00e452, 0x1d00e39d, 0x1d00e2e9, 0x1d00e236, 0x1d00e183, 0x1d00e0d1,
450  0x1d00e01f, 0x1d00df6e, 0x1d00debd, 0x1d00de0d, 0x1d00dd5d, 0x1d00dcae,
451  0x1d00dc00, 0x1d00db52, 0x1d00daa5, 0x1d00d9f8, 0x1d00d94c, 0x1d00d8a0,
452  0x1d00d7f5, 0x1d00d74a, 0x1d00d6a0, 0x1d00d5f6, 0x1d00d54d, 0x1d00d4a4,
453  0x1d00d3fc, 0x1d00d354, 0x1d00d2ad, 0x1d00d206, 0x1d00d160, 0x1d00d0ba,
454  0x1d00d015, 0x1d00cf70, 0x1d00cecc, 0x1d00ce28, 0x1d00cd85, 0x1d00cce2,
455  0x1d00cc40, 0x1d00cb9e, 0x1d00cafd, 0x1d00ca5c, 0x1d00c9bc, 0x1d00c91c,
456  0x1d00c87d, 0x1d00c7de, 0x1d00c740, 0x1d00c6a2, 0x1d00c605, 0x1d00c568,
457  0x1d00c4cc, 0x1d00c430, 0x1d00c395, 0x1d00c2fa, 0x1d00c260, 0x1d00c1c6,
458  0x1d00c12d, 0x1d00c094, 0x1d00bffc, 0x1d00bf64, 0x1d00becd, 0x1d00be36,
459  0x1d00bda0, 0x1d00bd0a, 0x1d00bc74, 0x1d00bbdf, 0x1d00bb4a, 0x1d00bab6,
460  0x1d00ba22, 0x1d00b98f, 0x1d00b8fc, 0x1d00b86a, 0x1d00b7d8, 0x1d00b747,
461  0x1d00b6b6, 0x1d00b625, 0x1d00b595, 0x1d00b505, 0x1d00b476, 0x1d00b3e7,
462  0x1d00b359, 0x1d00b2cb, 0x1d00b23e, 0x1d00b1b1, 0x1d00b124, 0x1d00b098,
463  0x1d00b00c, 0x1d00af81, 0x1d00aef6, 0x1d00ae6c, 0x1d00ade2, 0x1d00ad58,
464  0x1d00accf, 0x1d00ac46, 0x1d00abbe, 0x1d00ab36, 0x1d00aaaf, 0x1d00aa28,
465  0x1d00a9a1, 0x1d00a91b, 0x1d00a895, 0x1d00a810, 0x1d00a78b, 0x1d00a706,
466  0x1d00a682, 0x1d00a5fe, 0x1d00a57b, 0x1d00a4f8, 0x1d00a475, 0x1d00a3f3,
467  0x1d00a371, 0x1d00a2f0, 0x1d00a26f, 0x1d00a1ee, 0x1d00a16e, 0x1d00a0ee,
468  0x1d00a06f, 0x1d009ff0, 0x1d009f71, 0x1d009ef3, 0x1d009e75, 0x1d009df8,
469  0x1d009d7b, 0x1d009cfe, 0x1d009c82, 0x1d009c06, 0x1d009b8a, 0x1d009b0f,
470  0x1d009a94, 0x1d009a1a, 0x1d0099a0, 0x1d009926, 0x1d0098ad, 0x1d009834,
471  0x1d0097bc, 0x1d009744, 0x1d0096cc, 0x1d009655, 0x1d0095de, 0x1d009567,
472  0x1d0094f1, 0x1d00947b, 0x1d009405, 0x1d009390, 0x1d00931b, 0x1d0092a7,
473  0x1d009233, 0x1d0091bf, 0x1d00914c, 0x1d0090d9, 0x1d009066, 0x1d008ff4,
474  0x1d008f82, 0x1d008f10, 0x1d008e9f, 0x1d008e2e, 0x1d008dbd, 0x1d008d4d,
475  0x1d008cdd, 0x1d008c6d, 0x1d008bfe, 0x1d008b8f, 0x1d008b20, 0x1d008ab2,
476  0x1d008a44, 0x1d0089d6, 0x1d008969, 0x1d0088fc, 0x1d00888f, 0x1d008823,
477  0x1d0087b7, 0x1d00874b, 0x1d0086e0, 0x1d008675, 0x1d00860a, 0x1d0085a0,
478  0x1d008536, 0x1d0084cc, 0x1d008463, 0x1d0083fa, 0x1d008391, 0x1d008329,
479  0x1d0082c1, 0x1d008259, 0x1d0081f2, 0x1d00818b, 0x1d008124, 0x1d0080be,
480  0x1d008058, 0x1c7ff2cf, 0x1c7f8dee, 0x1c7f295d, 0x1c7ec51b, 0x1c7e6128,
481  0x1c7dfd84, 0x1c7d9a2e, 0x1c7d3727, 0x1c7cd46e, 0x1c7c7202, 0x1c7c0fe4,
482  0x1c7bae13, 0x1c7b4c90, 0x1c7aeb59, 0x1c7a8a6f, 0x1c7a29d1, 0x1c79c980,
483  0x1c79697b, 0x1c7909c1, 0x1c78aa53, 0x1c784b30, 0x1c77ec58, 0x1c778dcb,
484  0x1c772f88, 0x1c76d190, 0x1c7673e2, 0x1c76167e, 0x1c75b963, 0x1c755c92,
485  0x1c75000a, 0x1c74a3cb, 0x1c7447d4, 0x1c73ec26, 0x1c7390c0, 0x1c7335a2,
486  0x1c72dacc, 0x1c72803e, 0x1c7225f7, 0x1c71cbf7, 0x1c71723e, 0x1c7118cc,
487  0x1c70bfa1, 0x1c7066bc, 0x1c700e1d, 0x1c6fb5c4, 0x1c6f5db1, 0x1c6f05e3,
488  0x1c6eae5a, 0x1c6e5716, 0x1c6e0017, 0x1c6da95d, 0x1c6d52e7, 0x1c6cfcb5,
489  0x1c6ca6c7, 0x1c6c511d, 0x1c6bfbb6, 0x1c6ba693, 0x1c6b51b3, 0x1c6afd16,
490  0x1c6aa8bb, 0x1c6a54a3, 0x1c6a00cd, 0x1c69ad39, 0x1c6959e7, 0x1c6906d7,
491  0x1c68b408, 0x1c68617b, 0x1c680f2f, 0x1c67bd24, 0x1c676b59, 0x1c6719cf,
492  0x1c66c885, 0x1c66777b, 0x1c6626b1, 0x1c65d627, 0x1c6585dc, 0x1c6535d1,
493  };
494 
495  for (uint32_t expected : diffs) {
496  blocks[h] = GetBlockIndex(&blocks[h - 1], 0, nBits);
497  nBits = GetNextGrasbergWorkRequired(&blocks[h], &blkHeaderDummy,
498  *chainParams);
499  BOOST_CHECK_EQUAL(nBits, expected);
500  h++;
501  }
502 
503  // Check for negative solve time.
504  diffs = {
505  0x1c64d713, 0x1c6478ae, 0x1c641aa1, 0x1c63bcec, 0x1c635f8f, 0x1c630289,
506  0x1c62a5da, 0x1c624982, 0x1c61ed81, 0x1c6191d6, 0x1c613681, 0x1c60db81,
507  0x1c6080d6, 0x1c602680, 0x1c5fcc7f, 0x1c5f72d2, 0x1c5f1979, 0x1c5ec073,
508  0x1c5e67c1, 0x1c5e0f62, 0x1c5db756, 0x1c5d5f9c, 0x1c5d0834, 0x1c5cb11e,
509  0x1c5c5a59, 0x1c5c03e6, 0x1c5badc4, 0x1c5b57f2, 0x1c5b0271, 0x1c5aad40,
510  0x1c5a585e, 0x1c5a03cc, 0x1c59af89, 0x1c595b95, 0x1c5907ef, 0x1c58b498,
511  0x1c58618f, 0x1c580ed3, 0x1c57bc65, 0x1c576a44, 0x1c571870, 0x1c56c6e9,
512  0x1c5675ae, 0x1c5624bf, 0x1c55d41c, 0x1c5583c4, 0x1c5533b7, 0x1c54e3f5,
513  0x1c54947e, 0x1c544551, 0x1c53f66e, 0x1c53a7d5, 0x1c535986, 0x1c530b80,
514  0x1c52bdc3, 0x1c52704f, 0x1c522323, 0x1c51d640, 0x1c5189a5, 0x1c513d51,
515  0x1c50f145, 0x1c50a580, 0x1c505a02, 0x1c500ecb, 0x1c4fc3da, 0x1c4f792f,
516  0x1c4f2eca, 0x1c4ee4ab, 0x1c4e9ad1, 0x1c4e513c, 0x1c4e07ec, 0x1c4dbee1,
517  0x1c4d761a, 0x1c4d2d97, 0x1c4ce558, 0x1c4c9d5d, 0x1c4c55a5, 0x1c4c0e30,
518  0x1c4bc6fe, 0x1c4b800f, 0x1c4b3962, 0x1c4af2f7, 0x1c4aacce, 0x1c4a66e7,
519  0x1c4a2141, 0x1c49dbdc, 0x1c4996b8, 0x1c4951d5, 0x1c490d33, 0x1c48c8d1,
520  0x1c4884af, 0x1c4840cd, 0x1c47fd2a, 0x1c47b9c7, 0x1c4776a3, 0x1c4733bd,
521  0x1c46f116, 0x1c46aead, 0x1c466c83, 0x1c462a97, 0x1c45e8e8, 0x1c45a777,
522  0x1c456643, 0x1c45254c, 0x1c44e492, 0x1c44a414, 0x1c4463d3, 0x1c4423ce,
523  0x1c43e405, 0x1c43a478, 0x1c436526, 0x1c43260f, 0x1c42e733, 0x1c42a892,
524  0x1c426a2c, 0x1c422c00, 0x1c41ee0f, 0x1c41b057, 0x1c4172d9, 0x1c413595,
525  0x1c40f88a, 0x1c40bbb8, 0x1c407f1f, 0x1c4042bf, 0x1c400697, 0x1c3fcaa8,
526  0x1c3f8ef1, 0x1c3f5372, 0x1c3f182a, 0x1c3edd1a, 0x1c3ea241, 0x1c3e679f,
527  0x1c3e2d34, 0x1c3df300, 0x1c3db902, 0x1c3d7f3b, 0x1c3d45aa, 0x1c3d0c4f,
528  0x1c3cd329, 0x1c3c9a39, 0x1c3c617e, 0x1c3c28f8, 0x1c3bf0a7, 0x1c3bb88b,
529  0x1c3b80a3, 0x1c3b48f0, 0x1c3b1171, 0x1c3ada26, 0x1c3aa30f, 0x1c3a6c2b,
530  0x1c3a357b, 0x1c39fefe, 0x1c39c8b4, 0x1c39929d, 0x1c395cb8, 0x1c392706,
531  0x1c38f186, 0x1c38bc38, 0x1c38871c, 0x1c385232, 0x1c381d79, 0x1c37e8f1,
532  0x1c37b49b, 0x1c378076, 0x1c374c81, 0x1c3718bd, 0x1c36e52a, 0x1c36b1c7,
533  0x1c367e94, 0x1c364b91, 0x1c3618be, 0x1c35e61a, 0x1c35b3a6, 0x1c358161,
534  0x1c354f4b, 0x1c351d64, 0x1c34ebab, 0x1c34ba21, 0x1c3488c5, 0x1c345798,
535  0x1c342699, 0x1c33f5c7, 0x1c33c523, 0x1c3394ad, 0x1c336464, 0x1c333448,
536  0x1c330459, 0x1c32d497, 0x1c32a502, 0x1c327599, 0x1c32465d, 0x1c32174d,
537  0x1c31e869, 0x1c31b9b1, 0x1c318b25, 0x1c315cc4, 0x1c312e8f, 0x1c310085,
538  0x1c30d2a6, 0x1c30a4f2, 0x1c307769, 0x1c304a0a, 0x1c301cd6, 0x1c2fefcc,
539  0x1c2fc2ec, 0x1c2f9636, 0x1c2f69aa, 0x1c2f3d48, 0x1c2f110f, 0x1c2ee500,
540  0x1c2eb91a, 0x1c2e8d5d, 0x1c2e61c9, 0x1c2e365e, 0x1c2e0b1b, 0x1c2de001,
541  0x1c2db50f, 0x1c2d8a46, 0x1c2d5fa5, 0x1c2d352b, 0x1c2d0ad9, 0x1c2ce0af,
542  0x1c2cb6ac, 0x1c2c8cd1, 0x1c2c631d, 0x1c2c3990, 0x1c2c102a, 0x1c2be6ea,
543  0x1c2bbdd1, 0x1c2b94df, 0x1c2b6c13, 0x1c2b436d, 0x1c2b1aed, 0x1c2af293,
544  0x1c2aca5f, 0x1c2aa250, 0x1c2a7a67, 0x1c2a52a3, 0x1c2a2b05, 0x1c2a038c,
545  0x1c29dc38, 0x1c29b508, 0x1c298dfd, 0x1c296717, 0x1c294055, 0x1c2919b7,
546  0x1c28f33d, 0x1c28cce7, 0x1c28a6b5, 0x1c2880a7, 0x1c285abd, 0x1c2834f6,
547  0x1c280f53, 0x1c27e9d3, 0x1c27c476, 0x1c279f3c, 0x1c277a25, 0x1c275530,
548  0x1c27305e, 0x1c270baf, 0x1c26e722, 0x1c26c2b7, 0x1c269e6e, 0x1c267a47,
549  0x1c265642, 0x1c26325f, 0x1c260e9d, 0x1c25eafd, 0x1c25c77e, 0x1c25a420,
550  0x1c2580e3, 0x1c255dc7, 0x1c253acc, 0x1c2517f2, 0x1c24f539, 0x1c24d2a0,
551  0x1c24b028, 0x1c248dd0, 0x1c246b98, 0x1c244980, 0x1c242788, 0x1c2405b0,
552  0x1c23e3f7, 0x1c23c25e, 0x1c23a0e4, 0x1c237f8a, 0x1c235e4f, 0x1c233d33,
553  0x1c231c36, 0x1c22fb58, 0x1c22da99, 0x1c22b9f8, 0x1c229976, 0x1c227912,
554  0x1c2258cd, 0x1c2238a6, 0x1c22189d, 0x1c21f8b2, 0x1c21d8e5, 0x1c21b936,
555  };
556 
557  for (uint32_t expected : diffs) {
558  blocks[h] = GetBlockIndex(&blocks[h - 1], -100, nBits);
559  nBits = GetNextGrasbergWorkRequired(&blocks[h], &blkHeaderDummy,
560  *chainParams);
561  BOOST_CHECK_EQUAL(nBits, expected);
562  h++;
563  }
564 
565  // Check for absurd solve time.
566  blocks[h] = GetBlockIndex(&blocks[h - 1], -3900000, nBits);
567  nBits = GetNextGrasbergWorkRequired(&blocks[h++], &blkHeaderDummy,
568  *chainParams);
569  BOOST_CHECK_EQUAL(nBits, 0x1821b936);
570 
571  blocks[h] = GetBlockIndex(&blocks[h - 1], -5000000, nBits);
572  nBits = GetNextGrasbergWorkRequired(&blocks[h++], &blkHeaderDummy,
573  *chainParams);
574  BOOST_CHECK_EQUAL(nBits, 0x1421b936);
575 
576  blocks[h] = GetBlockIndex(&blocks[h - 1], 3900000, nBits);
577  nBits = GetNextGrasbergWorkRequired(&blocks[h++], &blkHeaderDummy,
578  *chainParams);
579  BOOST_CHECK_EQUAL(nBits, 0x1821b936);
580 
581  blocks[h] = GetBlockIndex(&blocks[h - 1], 5000000, nBits);
582  nBits = GetNextGrasbergWorkRequired(&blocks[h++], &blkHeaderDummy,
583  *chainParams);
584  BOOST_CHECK_EQUAL(nBits, 0x1c21b936);
585 
586  blocks[h] = GetBlockIndex(&blocks[h - 1], 9000000, nBits);
587  nBits = GetNextGrasbergWorkRequired(&blocks[h++], &blkHeaderDummy,
588  *chainParams);
589  BOOST_CHECK_EQUAL(nBits, 0x1d00ffff);
590 }
591 
592 BOOST_AUTO_TEST_CASE(testnet_difficulty_drop_test) {
593  const auto chainParams =
595  const auto &params = chainParams->GetConsensus();
596 
597  std::vector<CBlockIndex> blocks(3000);
598 
599  const arith_uint256 powLimit = UintToArith256(params.powLimit);
600  uint32_t powLimitBits = powLimit.GetCompact();
601  arith_uint256 currentPow = powLimit >> 4;
602  uint32_t initialBits = currentPow.GetCompact();
603 
604  // Genesis block.
605  blocks[0] = CBlockIndex();
606  blocks[0].nHeight = 0;
607  blocks[0].nTime = 1269211443;
608  blocks[0].nBits = initialBits;
609 
610  blocks[0].nChainWork = GetBlockProof(blocks[0]);
611 
612  // Check that we can use Grasberg directly from genesis.
613  CBlockHeader blkHeaderDummy;
614  uint32_t nBits =
615  GetNextGrasbergWorkRequired(&blocks[0], &blkHeaderDummy, *chainParams);
616  BOOST_CHECK_EQUAL(nBits, 0x1c0ffe3e);
617 
618  // Up to 20 mins, difficulty is unchanged.
619  blkHeaderDummy.nTime = blocks[0].nTime + 2 * params.nPowTargetSpacing;
620  nBits =
621  GetNextGrasbergWorkRequired(&blocks[0], &blkHeaderDummy, *chainParams);
622  BOOST_CHECK_EQUAL(nBits, 0x1c0ffe3e);
623 
624  // After 20 mins, difficulty drops.
625  blkHeaderDummy.nTime++;
626  nBits =
627  GetNextGrasbergWorkRequired(&blocks[0], &blkHeaderDummy, *chainParams);
628  BOOST_CHECK_EQUAL(nBits, powLimitBits);
629 
630  // Mine several blocks and check the difficulty.
631  size_t h = 1;
632 
633  std::vector<uint32_t> diffs = {
634  0x1c100c81, 0x1c101ad2, 0x1c10292f, 0x1c103799, 0x1c104610,
635  0x1c105494, 0x1c106325, 0x1c1071c2, 0x1c10806d, 0x1c108f25,
636  };
637 
638  // Mine several blocks at minimal difficulty. Block is skipped to compute
639  // the next difficulty.
640  for (uint32_t expected : diffs) {
641  blocks[h] = GetBlockIndex(
642  &blocks[h - 1], 2 * params.nPowTargetSpacing + 1, powLimitBits);
643  nBits = GetNextGrasbergWorkRequired(&blocks[h++], &blkHeaderDummy,
644  *chainParams);
645  BOOST_CHECK_EQUAL(nBits, expected);
646  }
647 
648  // Mine one block at regular difficulty, it will now be the new reference
649  // when skipping over low difficulty blocks.
650  blocks[h] = GetBlockIndex(&blocks[h - 1], 600, nBits);
651  nBits = GetNextGrasbergWorkRequired(&blocks[h++], &blkHeaderDummy,
652  *chainParams);
653  BOOST_CHECK_EQUAL(nBits, 0x1c108d54);
654 
655  diffs = {
656  0x1c109c17, 0x1c10aae8, 0x1c10b9c6, 0x1c10c8b1, 0x1c10d7a9,
657  0x1c10e6af, 0x1c10f5c2, 0x1c1104e2, 0x1c111410, 0x1c11234c,
658  };
659 
660  // As we mine more blocks with low difficulty, we use our new reference.
661  for (uint32_t expected : diffs) {
662  blocks[h] = GetBlockIndex(
663  &blocks[h - 1], 2 * params.nPowTargetSpacing + 1, powLimitBits);
664  nBits = GetNextGrasbergWorkRequired(&blocks[h++], &blkHeaderDummy,
665  *chainParams);
666  BOOST_CHECK_EQUAL(nBits, expected);
667  }
668 }
669 
670 BOOST_AUTO_TEST_SUITE_END()
arith_uint256 UintToArith256(const uint256 &a)
arith_uint256 GetBlockProof(const CBlockIndex &block)
Definition: chain.cpp:74
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:32
static const std::string TESTNET
static const std::string MAIN
BIP70 chain name strings (main, test or regtest)
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:23
uint32_t nTime
Definition: block.h:29
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: blockindex.h:25
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition: blockindex.h:32
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
Definition: blockindex.h:51
uint32_t nTime
Definition: blockindex.h:92
uint32_t nBits
Definition: blockindex.h:93
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition: blockindex.h:38
256-bit unsigned big integer.
uint32_t GetCompact(bool fNegative=false) const
static constexpr int64_t POW2_32
Definition: grasberg.cpp:17
uint32_t GetNextGrasbergWorkRequired(const CBlockIndex *pindexPrev, const CBlockHeader *pblock, const CChainParams &chainParams)
Compute the next required proof of work using a relative target based ASERT algorithm.
Definition: grasberg.cpp:71
static CBlockIndex GetBlockIndex(CBlockIndex *pindexPrev, int64_t nTimeInterval, uint32_t nBits)
BOOST_AUTO_TEST_CASE(exp2_test)
unsigned int nHeight
int64_t computeTargetBlockTime(const CBlockIndex *pindexPrev, const CChainParams &chainParams)
Compute the block time we are aiming for.
Definition: grasberg.cpp:108
uint32_t deterministicExp2(const uint32_t n)
Computes exp2(n) = 2^32 * (2^(n/2^32) - 1)
Definition: grasberg.cpp:140
NodeContext & m_node
Definition: interfaces.cpp:785
#define BOOST_CHECK_EQUAL(v1, v2)
Definition: object.cpp:18
#define BOOST_CHECK(expr)
Definition: object.cpp:17
BOOST_FIXTURE_TEST_SUITE(stakingrewards_tests, StakingRewardsActivationTestingSetup) BOOST_AUTO_TEST_CASE(isstakingrewardsactivated)