mirror of
https://github.com/dashpay/dash.git
synced 2024-12-27 13:03:17 +01:00
MOVEONLY: non-consensus: from pow to chain:
- GetBlockProof - GetBlockProofEquivalentTime
This commit is contained in:
parent
3cd836c1d8
commit
e86756193e
@ -110,3 +110,35 @@ void CBlockIndex::BuildSkip()
|
|||||||
if (pprev)
|
if (pprev)
|
||||||
pskip = pprev->GetAncestor(GetSkipHeight(nHeight));
|
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;
|
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. */
|
/** Used to marshal pointers into hashes for db storage. */
|
||||||
class CDiskBlockIndex : public CBlockIndex
|
class CDiskBlockIndex : public CBlockIndex
|
||||||
{
|
{
|
||||||
|
32
src/pow.cpp
32
src/pow.cpp
@ -102,35 +102,3 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&
|
|||||||
|
|
||||||
return true;
|
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 CBlockHeader;
|
||||||
class CBlockIndex;
|
class CBlockIndex;
|
||||||
class uint256;
|
class uint256;
|
||||||
class arith_uint256;
|
|
||||||
|
|
||||||
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params&);
|
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params&);
|
||||||
unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nFirstBlockTime, 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 */
|
/** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */
|
||||||
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&);
|
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
|
#endif // BITCOIN_POW_H
|
||||||
|
Loading…
Reference in New Issue
Block a user