aboutsummaryrefslogtreecommitdiff
path: root/src/chain.cpp
diff options
context:
space:
mode:
authorLuke Dashjr <luke-jr+git@utopios.org>2016-02-27 06:11:04 +0000
committerLuke Dashjr <luke-jr+git@utopios.org>2016-02-27 06:11:37 +0000
commite5daa2e2aef61f0b9441d19f0b67015f426c6056 (patch)
tree90a095dcd23c8a74cb605f55e224a902cba75a06 /src/chain.cpp
parent5c70a6d6d15cc301b76558f708948c375fe63ccb (diff)
parent317462123f8e41fd7dd967ab907e59ddffb19898 (diff)
downloadbitcoin-e5daa2e2aef61f0b9441d19f0b67015f426c6056.tar.xz
Merge branch 'master' into depends_curl
Diffstat (limited to 'src/chain.cpp')
-rw-r--r--src/chain.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/chain.cpp b/src/chain.cpp
index 3450ed6c3f..32f6480f84 100644
--- a/src/chain.cpp
+++ b/src/chain.cpp
@@ -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();
+}