Merge pull request #4076

397668e Deduplicate uint* comparison operator logic (Pieter Wuille)
df9eb5e Move {Get,Set}Compact from bignum to uint256 (Pieter Wuille)
a703150 Add multiplication and division to uint160/uint256 (Pieter Wuille)
4d480c8 Exception instead of assigning 0 in case of wrong vector length (Pieter Wuille)
eb2cbd7 Deduplicate shared code between uint160 and uint256 (Pieter Wuille)
This commit is contained in:
Wladimir J. van der Laan
2014-05-09 16:57:06 +02:00
13 changed files with 477 additions and 512 deletions

View File

@@ -10,7 +10,6 @@
#include "bitcoin-config.h"
#endif
#include "bignum.h"
#include "chainparams.h"
#include "coins.h"
#include "core.h"
@@ -814,13 +813,19 @@ public:
return (int64_t)nTime;
}
CBigNum GetBlockWork() const
uint256 GetBlockWork() const
{
CBigNum bnTarget;
bnTarget.SetCompact(nBits);
if (bnTarget <= 0)
uint256 bnTarget;
bool fNegative;
bool fOverflow;
bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
if (fNegative || fOverflow || bnTarget == 0)
return 0;
return (CBigNum(1)<<256) / (bnTarget+1);
// We need to compute 2**256 / (bnTarget+1), but we can't represent 2**256
// as it's too large for a 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;
}
bool CheckIndex() const