replace ComputeMinWork with CheckMinWork
This commit is contained in:
parent
b343c1a1e3
commit
654871d436
4 changed files with 19 additions and 21 deletions
|
@ -2410,12 +2410,7 @@ bool AcceptBlockHeader(CBlockHeader& block, CValidationState& state, CBlockIndex
|
||||||
return state.DoS(100, error("CheckBlockHeader() : block with timestamp before last checkpoint"),
|
return state.DoS(100, error("CheckBlockHeader() : block with timestamp before last checkpoint"),
|
||||||
REJECT_CHECKPOINT, "time-too-old");
|
REJECT_CHECKPOINT, "time-too-old");
|
||||||
}
|
}
|
||||||
bool fOverflow = false;
|
if (!CheckMinWork(block.nBits, pcheckpoint->nBits, deltaTime))
|
||||||
uint256 bnNewBlock;
|
|
||||||
bnNewBlock.SetCompact(block.nBits, NULL, &fOverflow);
|
|
||||||
uint256 bnRequired;
|
|
||||||
bnRequired.SetCompact(ComputeMinWork(pcheckpoint->nBits, deltaTime));
|
|
||||||
if (fOverflow || bnNewBlock > bnRequired)
|
|
||||||
{
|
{
|
||||||
return state.DoS(100, error("CheckBlockHeader() : block with too little proof-of-work"),
|
return state.DoS(100, error("CheckBlockHeader() : block with too little proof-of-work"),
|
||||||
REJECT_INVALID, "bad-diffbits");
|
REJECT_INVALID, "bad-diffbits");
|
||||||
|
|
23
src/pow.cpp
23
src/pow.cpp
|
@ -94,29 +94,36 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits)
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// minimum amount of work that could possibly be required nTime after
|
// true if nBits is greater than the minimum amount of work that could
|
||||||
// minimum work required was nBase
|
// possibly be required deltaTime after minimum work required was nBase
|
||||||
//
|
//
|
||||||
unsigned int ComputeMinWork(unsigned int nBase, int64_t nTime)
|
bool CheckMinWork(unsigned int nBits, unsigned int nBase, int64_t deltaTime)
|
||||||
{
|
{
|
||||||
|
bool fOverflow = false;
|
||||||
|
uint256 bnNewBlock;
|
||||||
|
bnNewBlock.SetCompact(nBits, NULL, &fOverflow);
|
||||||
|
if (fOverflow)
|
||||||
|
return false;
|
||||||
|
|
||||||
const uint256 &bnLimit = Params().ProofOfWorkLimit();
|
const uint256 &bnLimit = Params().ProofOfWorkLimit();
|
||||||
// Testnet has min-difficulty blocks
|
// Testnet has min-difficulty blocks
|
||||||
// after Params().TargetSpacing()*2 time between blocks:
|
// after Params().TargetSpacing()*2 time between blocks:
|
||||||
if (Params().AllowMinDifficultyBlocks() && nTime > Params().TargetSpacing()*2)
|
if (Params().AllowMinDifficultyBlocks() && deltaTime > Params().TargetSpacing()*2)
|
||||||
return bnLimit.GetCompact();
|
return bnNewBlock <= bnLimit;
|
||||||
|
|
||||||
uint256 bnResult;
|
uint256 bnResult;
|
||||||
bnResult.SetCompact(nBase);
|
bnResult.SetCompact(nBase);
|
||||||
while (nTime > 0 && bnResult < bnLimit)
|
while (deltaTime > 0 && bnResult < bnLimit)
|
||||||
{
|
{
|
||||||
// Maximum 400% adjustment...
|
// Maximum 400% adjustment...
|
||||||
bnResult *= 4;
|
bnResult *= 4;
|
||||||
// ... in best-case exactly 4-times-normal target time
|
// ... in best-case exactly 4-times-normal target time
|
||||||
nTime -= Params().TargetTimespan()*4;
|
deltaTime -= Params().TargetTimespan()*4;
|
||||||
}
|
}
|
||||||
if (bnResult > bnLimit)
|
if (bnResult > bnLimit)
|
||||||
bnResult = bnLimit;
|
bnResult = bnLimit;
|
||||||
return bnResult.GetCompact();
|
|
||||||
|
return bnNewBlock <= bnResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateTime(CBlockHeader* pblock, const CBlockIndex* pindexPrev)
|
void UpdateTime(CBlockHeader* pblock, const CBlockIndex* pindexPrev)
|
||||||
|
|
|
@ -17,8 +17,8 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead
|
||||||
|
|
||||||
/** 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);
|
bool CheckProofOfWork(uint256 hash, unsigned int nBits);
|
||||||
/** Calculate the minimum amount of work a received block needs, without knowing its direct parent */
|
/** Check the work is more than the minimum a received block needs, without knowing its direct parent */
|
||||||
unsigned int ComputeMinWork(unsigned int nBase, int64_t nTime);
|
bool CheckMinWork(unsigned int nBits, unsigned int nBase, int64_t deltaTime);
|
||||||
|
|
||||||
void UpdateTime(CBlockHeader* block, const CBlockIndex* pindexPrev);
|
void UpdateTime(CBlockHeader* block, const CBlockIndex* pindexPrev);
|
||||||
|
|
||||||
|
|
|
@ -106,11 +106,7 @@ static bool CheckNBits(unsigned int nbits1, int64_t time1, unsigned int nbits2,
|
||||||
return CheckNBits(nbits2, time2, nbits1, time1);
|
return CheckNBits(nbits2, time2, nbits1, time1);
|
||||||
int64_t deltaTime = time2-time1;
|
int64_t deltaTime = time2-time1;
|
||||||
|
|
||||||
uint256 required;
|
return CheckMinWork(nbits2, nbits1, deltaTime);
|
||||||
required.SetCompact(ComputeMinWork(nbits1, deltaTime));
|
|
||||||
uint256 have;
|
|
||||||
have.SetCompact(nbits2);
|
|
||||||
return (have <= required);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(DoS_checknbits)
|
BOOST_AUTO_TEST_CASE(DoS_checknbits)
|
||||||
|
|
Loading…
Reference in a new issue