Browse Source

replace ComputeMinWork with CheckMinWork

0.10
jtimon 11 years ago
parent
commit
654871d436
  1. 7
      src/main.cpp
  2. 23
      src/pow.cpp
  3. 4
      src/pow.h
  4. 6
      src/test/DoS_tests.cpp

7
src/main.cpp

@ -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

@ -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)

4
src/pow.h

@ -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);

6
src/test/DoS_tests.cpp

@ -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…
Cancel
Save