| 13 | #include <boost/lexical_cast.hpp> |
| 14 | |
| 15 | uint64_t GetNextMaxBlockSize(const CBlockIndex* pindexLast, const Consensus::Params& params) |
| 16 | { |
| 17 | // BIP100 not active, return legacy max size |
| 18 | if (pindexLast == NULL || |
| 19 | ((Opt().UAHFTime() != 0) && (pindexLast->GetMedianTimePast() < Opt().UAHFTime())) || |
| 20 | ((Opt().UAHFTime() == 0) && (pindexLast->nHeight < params.bip100ActivationHeight))) |
| 21 | return MAX_BLOCK_SIZE; |
| 22 | |
| 23 | // Bump to 8MB at UAHF fork |
| 24 | if (IsUAHFActivatingBlock(pindexLast->GetMedianTimePast(), pindexLast->pprev)) |
| 25 | return UAHF_INITIAL_MAX_BLOCK_SIZE; |
| 26 | |
| 27 | uint64_t nMaxBlockSize = pindexLast->nMaxBlockSize; |
| 28 | |
| 29 | // Only change once per difficulty adjustment interval |
| 30 | if ((pindexLast->nHeight+1) % params.DifficultyAdjustmentInterval() != 0) { |
| 31 | return nMaxBlockSize; |
| 32 | } |
| 33 | |
| 34 | std::vector<uint64_t> votes; |
| 35 | const CBlockIndex *pindexWalk = pindexLast; |
| 36 | for (int64_t i = 0; i < params.DifficultyAdjustmentInterval(); i++) { |
| 37 | assert(pindexWalk); |
| 38 | votes.push_back(pindexWalk->nMaxBlockSizeVote ? pindexWalk->nMaxBlockSizeVote : nMaxBlockSize); |
| 39 | pindexWalk = pindexWalk->pprev; |
| 40 | } |
| 41 | |
| 42 | std::sort(votes.begin(),votes.end()); |
| 43 | uint64_t lowerValue = votes.at(params.nMaxBlockSizeChangePosition - 1); |
| 44 | uint64_t raiseValue = votes.at(params.DifficultyAdjustmentInterval() - params.nMaxBlockSizeChangePosition); |
| 45 | |
| 46 | assert(lowerValue >= 1000000); // minimal vote supported is 1MB |
| 47 | assert(lowerValue >= raiseValue); // lowerValue comes from a higher sorted position |
| 48 | |
| 49 | uint64_t raiseCap = nMaxBlockSize * 105 / 100; |
| 50 | raiseValue = (raiseValue > raiseCap ? raiseCap : raiseValue); |
| 51 | if (raiseValue > nMaxBlockSize) { |
| 52 | nMaxBlockSize = raiseValue; |
| 53 | } else { |
| 54 | uint64_t lowerFloor = nMaxBlockSize * 100 / 105; |
| 55 | lowerValue = (lowerValue < lowerFloor ? lowerFloor : lowerValue); |
| 56 | if (lowerValue < nMaxBlockSize) |
| 57 | nMaxBlockSize = lowerValue; |
| 58 | } |
| 59 | |
| 60 | if (nMaxBlockSize != pindexLast->nMaxBlockSize) { |
| 61 | LogPrintf("GetNextMaxBlockSize RETARGET\n"); |
| 62 | LogPrintf("Before: %d\n", pindexLast->nMaxBlockSize); |
| 63 | LogPrintf("After: %d\n", nMaxBlockSize); |
| 64 | } |
| 65 | |
| 66 | return nMaxBlockSize; |
| 67 | } |
| 68 | |
| 69 | static uint32_t FindVote(const std::string& coinbase) { |
| 70 | |