From dd8c6df53565aa617e747defd1487721c7761e2e Mon Sep 17 00:00:00 2001 From: Jon Layton Date: Mon, 15 Oct 2018 21:47:38 -0500 Subject: [PATCH] [mining] Update difficulty - Add Bitcoin Private's adjustment schedule; display GetNetworkDifficulty in info rpcs --- src/rpc/blockchain.cpp | 40 +++++++++++++++++++++++++++++++--------- src/rpc/blockchain.h | 2 ++ src/rpc/mining.cpp | 2 +- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 29d87ebb7..cfeb8cf21 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -52,31 +52,48 @@ static CUpdatedBlock latestblock; /* Calculate the difficulty for a given block index, * or the block index of the given chain. */ -double GetDifficulty(const CChain& chain, const CBlockIndex* blockindex) +double GetDifficultyINTERNAL(const CBlockIndex* blockindex, bool networkDifficulty) { + // Floating point number that is a multiple of the minimum difficulty, + // minimum difficulty = 1.0. if (blockindex == nullptr) { - if (chain.Tip() == nullptr) + if (chainActive.Tip() == nullptr) return 1.0; else - blockindex = chain.Tip(); + blockindex = chainActive.Tip(); } - int nShift = (blockindex->nBits >> 24) & 0xff; - double dDiff = - (double)0x0000ffff / (double)(blockindex->nBits & 0x00ffffff); + uint32_t bits; + if (networkDifficulty) { + bits = GetNextWorkRequired(blockindex, nullptr, Params().GetConsensus()); + } else { + bits = blockindex->nBits; + } - while (nShift < 29) + // instead of using powLimit, network difficulty is calculated using a legacy powLimit value to maintain comparability with the network difficulty of other Equihash-based coins for mining profitability calculations. + uint32_t powLimitLegacy = UintToArith256(Params().GetConsensus().prePowLimit).GetCompact(); + int nShift = (bits >> 24) & 0xff; + int nShiftAmount = (powLimitLegacy >> 24) & 0xff; + + double dDiff = + (double)(powLimitLegacy & 0x00ffffff) / + (double)(bits & 0x00ffffff); + + while (nShift < nShiftAmount) { dDiff *= 256.0; nShift++; } - while (nShift > 29) + while (nShift > nShiftAmount) { dDiff /= 256.0; nShift--; } + // for compatibility purposes, the floor of 1.0 is maintained. + if (dDiff < 1) dDiff = 1.0; + return dDiff; } @@ -85,6 +102,11 @@ double GetDifficulty(const CBlockIndex* blockindex) return GetDifficulty(chainActive, blockindex); } +double GetNetworkDifficulty(const CBlockIndex* blockindex) +{ + return GetDifficultyINTERNAL(blockindex, true); +} + UniValue blockheaderToJSON(const CBlockIndex* blockindex) { AssertLockHeld(cs_main); @@ -1240,7 +1262,7 @@ UniValue getblockchaininfo(const JSONRPCRequest& request) obj.pushKV("blocks", (int)chainActive.Height()); obj.pushKV("headers", pindexBestHeader ? pindexBestHeader->nHeight : -1); obj.pushKV("bestblockhash", chainActive.Tip()->GetBlockHash().GetHex()); - obj.pushKV("difficulty", (double)GetDifficulty()); + obj.pushKV("difficulty", (double)GetNetworkDifficulty()); obj.pushKV("mediantime", (int64_t)chainActive.Tip()->GetMedianTimePast()); obj.pushKV("verificationprogress", GuessVerificationProgress(Params().TxData(), chainActive.Tip())); obj.pushKV("initialblockdownload", IsInitialBlockDownload()); diff --git a/src/rpc/blockchain.h b/src/rpc/blockchain.h index 960edfd56..ab60cfc63 100644 --- a/src/rpc/blockchain.h +++ b/src/rpc/blockchain.h @@ -18,6 +18,8 @@ class UniValue; */ double GetDifficulty(const CBlockIndex* blockindex = nullptr); +double GetNetworkDifficulty(const CBlockIndex* blockindex = nullptr); + /** Callback for when block tip changed. */ void RPCNotifyBlockChange(bool ibd, const CBlockIndex *); diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 37d1e3773..7d8538353 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -253,7 +253,7 @@ static UniValue getmininginfo(const JSONRPCRequest& request) obj.pushKV("blocks", (int)chainActive.Height()); obj.pushKV("currentblockweight", (uint64_t)nLastBlockWeight); obj.pushKV("currentblocktx", (uint64_t)nLastBlockTx); - obj.pushKV("difficulty", (double)GetDifficulty()); + obj.pushKV("difficulty", (double)GetNetworkDifficulty()); obj.pushKV("networkhashps", getnetworkhashps(request)); obj.pushKV("pooledtx", (uint64_t)mempool.size()); obj.pushKV("chain", Params().NetworkIDString());