- GetBlockProof - GetBlockProofEquivalentTimetags/v0.15.1
@@ -110,3 +110,35 @@ void CBlockIndex::BuildSkip() | |||
if (pprev) | |||
pskip = pprev->GetAncestor(GetSkipHeight(nHeight)); | |||
} | |||
arith_uint256 GetBlockProof(const CBlockIndex& block) | |||
{ | |||
arith_uint256 bnTarget; | |||
bool fNegative; | |||
bool fOverflow; | |||
bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); | |||
if (fNegative || fOverflow || bnTarget == 0) | |||
return 0; | |||
// We need to compute 2**256 / (bnTarget+1), but we can't represent 2**256 | |||
// as it's too large for a arith_uint256. However, as 2**256 is at least as large | |||
// as bnTarget+1, it is equal to ((2**256 - bnTarget - 1) / (bnTarget+1)) + 1, | |||
// or ~bnTarget / (nTarget+1) + 1. | |||
return (~bnTarget / (bnTarget + 1)) + 1; | |||
} | |||
int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params& params) | |||
{ | |||
arith_uint256 r; | |||
int sign = 1; | |||
if (to.nChainWork > from.nChainWork) { | |||
r = to.nChainWork - from.nChainWork; | |||
} else { | |||
r = from.nChainWork - to.nChainWork; | |||
sign = -1; | |||
} | |||
r = r * arith_uint256(params.nPowTargetSpacing) / GetBlockProof(tip); | |||
if (r.bits() > 63) { | |||
return sign * std::numeric_limits<int64_t>::max(); | |||
} | |||
return sign * r.GetLow64(); | |||
} |
@@ -282,6 +282,10 @@ public: | |||
const CBlockIndex* GetAncestor(int height) const; | |||
}; | |||
arith_uint256 GetBlockProof(const CBlockIndex& block); | |||
/** Return the time it would take to redo the work difference between from and to, assuming the current hashrate corresponds to the difficulty at tip, in seconds. */ | |||
int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params&); | |||
/** Used to marshal pointers into hashes for db storage. */ | |||
class CDiskBlockIndex : public CBlockIndex | |||
{ |
@@ -102,35 +102,3 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params& | |||
return true; | |||
} | |||
arith_uint256 GetBlockProof(const CBlockIndex& block) | |||
{ | |||
arith_uint256 bnTarget; | |||
bool fNegative; | |||
bool fOverflow; | |||
bnTarget.SetCompact(block.nBits, &fNegative, &fOverflow); | |||
if (fNegative || fOverflow || bnTarget == 0) | |||
return 0; | |||
// We need to compute 2**256 / (bnTarget+1), but we can't represent 2**256 | |||
// as it's too large for a arith_uint256. However, as 2**256 is at least as large | |||
// as bnTarget+1, it is equal to ((2**256 - bnTarget - 1) / (bnTarget+1)) + 1, | |||
// or ~bnTarget / (nTarget+1) + 1. | |||
return (~bnTarget / (bnTarget + 1)) + 1; | |||
} | |||
int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params& params) | |||
{ | |||
arith_uint256 r; | |||
int sign = 1; | |||
if (to.nChainWork > from.nChainWork) { | |||
r = to.nChainWork - from.nChainWork; | |||
} else { | |||
r = from.nChainWork - to.nChainWork; | |||
sign = -1; | |||
} | |||
r = r * arith_uint256(params.nPowTargetSpacing) / GetBlockProof(tip); | |||
if (r.bits() > 63) { | |||
return sign * std::numeric_limits<int64_t>::max(); | |||
} | |||
return sign * r.GetLow64(); | |||
} |
@@ -13,16 +13,11 @@ | |||
class CBlockHeader; | |||
class CBlockIndex; | |||
class uint256; | |||
class arith_uint256; | |||
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params&); | |||
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, const Consensus::Params&); | |||
/** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */ | |||
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&); | |||
arith_uint256 GetBlockProof(const CBlockIndex& block); | |||
/** Return the time it would take to redo the work difference between from and to, assuming the current hashrate corresponds to the difficulty at tip, in seconds. */ | |||
int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params&); | |||
#endif // BITCOIN_POW_H |