The min-difficulty blocks are incompatible with difficulty averaging.
Network difficulty is also now defined as the difficulty the network is
currently working to solve, rather than the last non-min-difficulty block
difficulty.
#include "streams.h"
#include "utilstrencodings.h"
-TEST(rpc, GetDifficultyTestnetRules) {
- SelectParams(CBaseChainParams::TESTNET);
-
- CBlockIndex prev;
- prev.nTime = 1472700000;
- prev.nBits = 0x201fffff;
-
- CBlockIndex curr;
- curr.pprev = &prev;
- curr.nTime = 1472700300;
- curr.nBits = 0x207fffff;
-
- // Time interval is within 5 minutes, so the min-difficulty block should be
- // interpreted as a valid network difficulty.
- EXPECT_EQ(1, GetDifficulty(&curr));
- EXPECT_EQ(1, GetNetworkDifficulty(&curr));
-
- curr.nTime += 1;
-
- // Time interval is over 5 minutes, so the min-difficulty block should be
- // ignored for network difficulty determination.
- EXPECT_EQ(1, GetDifficulty(&curr));
- // We have to check this directly, because of some combination of rounding
- // and truncation issues that result in Google Test displaying 4 != 4
- EXPECT_EQ((double)0x7fffff/(double)0x1fffff, GetNetworkDifficulty(&curr));
-}
-
extern json_spirit::Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDetails = false);
TEST(rpc, check_blockToJSON_returns_minified_solution) {
if (pindexLast == NULL)
return nProofOfWorkLimit;
- const CBlockIndex* pindexBits = pindexLast;
- {
- if (params.fPowAllowMinDifficultyBlocks)
- {
- // Special difficulty rule for testnet:
- // If the new block's timestamp is more than 2* 2.5 minutes
- // then allow mining of a min-difficulty block.
- if (pblock->GetBlockTime() > pindexLast->GetBlockTime() + params.nPowTargetSpacing*2)
- return nProofOfWorkLimit;
- else {
- // Get the last non-min-difficulty (or at worst the genesis difficulty)
- while (pindexBits->pprev && pindexBits->nBits == nProofOfWorkLimit)
- pindexBits = pindexBits->pprev;
- }
- }
- }
-
// Find the first block in the averaging interval
const CBlockIndex* pindexFirst = pindexLast;
arith_uint256 bnAvg;
blockindex = chainActive.Tip();
}
- uint32_t powLimit =
- UintToArith256(Params().GetConsensus().powLimit).GetCompact();;
- {
- if (networkDifficulty && Params().GetConsensus().fPowAllowMinDifficultyBlocks)
- {
- // Special difficulty rule for testnet:
- // If a block's timestamp is more than 2*nPowTargetSpacing minutes after
- // the previous block, then it is permitted to be min-difficulty. So
- // get the last non-min-difficulty (or at worst the genesis difficulty).
- auto window = Params().GetConsensus().nPowTargetSpacing*2;
- while (blockindex->pprev && blockindex->nBits == powLimit &&
- blockindex->GetBlockTime() > blockindex->pprev->GetBlockTime() + window) {
- blockindex = blockindex->pprev;
- }
- }
+ uint32_t bits;
+ if (networkDifficulty) {
+ bits = GetNextWorkRequired(blockindex, nullptr, Params().GetConsensus());
+ } else {
+ bits = blockindex->nBits;
}
- int nShift = (blockindex->nBits >> 24) & 0xff;
+ uint32_t powLimit =
+ UintToArith256(Params().GetConsensus().powLimit).GetCompact();;
+ int nShift = (bits >> 24) & 0xff;
int nShiftAmount = (powLimit >> 24) & 0xff;
double dDiff =
(double)(powLimit & 0x00ffffff) /
- (double)(blockindex->nBits & 0x00ffffff);
+ (double)(bits & 0x00ffffff);
while (nShift < nShiftAmount)
{