|
17 | 17 |
|
18 | 18 | #include <algorithm> |
19 | 19 |
|
| 20 | + |
20 | 21 | const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex) |
21 | 22 | { |
22 | 23 | while (pindex && pindex->pprev) |
23 | 24 | pindex = pindex->pprev; |
24 | 25 | return pindex; |
25 | 26 | } |
26 | 27 |
|
27 | | -unsigned int GetNextWorkRequired(const INDEX_TYPE pindexLast, const BLOCK_TYPE block, const Consensus::Params& params) |
28 | | -{ |
| 28 | +unsigned int GetNextWorkRequired(const INDEX_TYPE pindexLast, const BLOCK_TYPE block, const Consensus::Params& params) { |
29 | 29 | assert(pindexLast != nullptr); |
| 30 | + |
30 | 31 | if (pindexLast->nHeight + 1 <= params.nUpdateDiffAlgoHeight) |
31 | 32 | return UintToArith256(params.powLimit).GetCompact(); // genesis block and first x (nUpdateDiffAlgoHeight) blocks use the default difficulty |
32 | 33 |
|
| 34 | + return DigiShield(pindexLast, params.nPowAveragingWindow, params.AveragingWindowTimespan(), params.MinActualTimespan(), params.MaxActualTimespan(), params); |
| 35 | +} |
| 36 | + |
| 37 | +unsigned int DigiShield(const CBlockIndex* pindexLast, const int64_t AveragingWindow, const int64_t AveragingWindowTimespan, const int64_t MinActualTimespan, const int64_t MaxActualTimespan, const Consensus::Params& params) |
| 38 | +{ |
33 | 39 | // Find the first block in the averaging interval |
34 | 40 | const CBlockIndex* pindexFirst = pindexLast; |
35 | 41 | arith_uint256 bnTot{0}; |
36 | | - for (int i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) { |
| 42 | + |
| 43 | + for (int i = 0; pindexFirst && i < AveragingWindow; i++) { |
37 | 44 | arith_uint256 bnTmp; |
38 | 45 | bnTmp.SetCompact(pindexFirst->nBits); |
39 | 46 | bnTot += bnTmp; |
40 | 47 | pindexFirst = pindexFirst->pprev; |
41 | 48 | } |
42 | | - arith_uint256 bnAvg{bnTot / params.nPowAveragingWindow}; |
| 49 | + |
| 50 | + arith_uint256 bnAvg { bnTot / AveragingWindow }; |
43 | 51 |
|
44 | 52 | // Use medians to prevent time-warp attacks |
45 | 53 | int64_t nLastBlockTime = pindexLast->GetMedianTimePast(); |
46 | 54 | int64_t nFirstBlockTime = pindexFirst->GetMedianTimePast(); |
47 | 55 | int64_t nActualTimespan = nLastBlockTime - nFirstBlockTime; |
48 | | - LogPrint("pow", " nActualTimespan = %d before dampening\n", nActualTimespan); |
49 | | - nActualTimespan = params.AveragingWindowTimespan() + (nActualTimespan - params.AveragingWindowTimespan()) / 4; |
50 | | - LogPrint("pow", " nActualTimespan = %d before bounds\n", nActualTimespan); |
| 56 | + nActualTimespan = AveragingWindowTimespan + (nActualTimespan - AveragingWindowTimespan) / 4; |
51 | 57 |
|
52 | | - if (nActualTimespan < params.MinActualTimespan()) |
53 | | - nActualTimespan = params.MinActualTimespan(); |
54 | | - if (nActualTimespan > params.MaxActualTimespan()) |
55 | | - nActualTimespan = params.MaxActualTimespan(); |
| 58 | + if (nActualTimespan < MinActualTimespan) |
| 59 | + nActualTimespan = MinActualTimespan; |
| 60 | + if (nActualTimespan > MaxActualTimespan) |
| 61 | + nActualTimespan = MaxActualTimespan; |
56 | 62 |
|
57 | 63 | // Retarget |
58 | 64 | const arith_uint256 bnPowLimit = UintToArith256(params.powLimit); |
59 | 65 | arith_uint256 bnNew{bnAvg}; |
60 | | - bnNew /= params.AveragingWindowTimespan(); |
| 66 | + bnNew /= AveragingWindowTimespan; |
61 | 67 | bnNew *= nActualTimespan; |
62 | 68 |
|
63 | 69 | if (bnNew > bnPowLimit) |
64 | 70 | bnNew = bnPowLimit; |
65 | 71 |
|
66 | | - /// debug print |
67 | | - LogPrint("pow", "GetNextWorkRequired RETARGET\n"); |
68 | | - LogPrint("pow", "params.AveragingWindowTimespan() = %d nActualTimespan = %d\n", params.AveragingWindowTimespan(), nActualTimespan); |
69 | | - LogPrint("pow", "Current average: %08x %s\n", bnAvg.GetCompact(), bnAvg.ToString()); |
70 | | - LogPrint("pow", "After: %08x %s\n", bnNew.GetCompact(), bnNew.ToString()); |
71 | | - |
72 | 72 | return bnNew.GetCompact(); |
73 | 73 | } |
74 | 74 |
|
|
0 commit comments