Remove CheckMinWork, as we always know all parent headers
This commit is contained in:
parent
ad6e601712
commit
f244c99c96
4 changed files with 0 additions and 97 deletions
17
src/main.cpp
17
src/main.cpp
|
@ -2329,23 +2329,6 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc
|
|||
return true;
|
||||
}
|
||||
|
||||
CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint();
|
||||
if (pcheckpoint && block.hashPrevBlock != (chainActive.Tip() ? chainActive.Tip()->GetBlockHash() : uint256(0)))
|
||||
{
|
||||
// Extra checks to prevent "fill up memory by spamming with bogus blocks"
|
||||
int64_t deltaTime = block.GetBlockTime() - pcheckpoint->GetBlockTime();
|
||||
if (deltaTime < 0)
|
||||
{
|
||||
return state.DoS(100, error("%s : block with timestamp before last checkpoint", __func__),
|
||||
REJECT_CHECKPOINT, "time-too-old");
|
||||
}
|
||||
if (!CheckMinWork(block.nBits, pcheckpoint->nBits, deltaTime))
|
||||
{
|
||||
return state.DoS(100, error("%s : block with too little proof-of-work", __func__),
|
||||
REJECT_INVALID, "bad-diffbits");
|
||||
}
|
||||
}
|
||||
|
||||
// Get prev block index
|
||||
CBlockIndex* pindexPrev = NULL;
|
||||
int nHeight = 0;
|
||||
|
|
33
src/pow.cpp
33
src/pow.cpp
|
@ -98,39 +98,6 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits)
|
|||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
// true if nBits is greater than the minimum amount of work that could
|
||||
// possibly be required deltaTime after minimum work required was nBase
|
||||
//
|
||||
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();
|
||||
// Testnet has min-difficulty blocks
|
||||
// after Params().TargetSpacing()*2 time between blocks:
|
||||
if (Params().AllowMinDifficultyBlocks() && deltaTime > Params().TargetSpacing()*2)
|
||||
return bnNewBlock <= bnLimit;
|
||||
|
||||
uint256 bnResult;
|
||||
bnResult.SetCompact(nBase);
|
||||
while (deltaTime > 0 && bnResult < bnLimit)
|
||||
{
|
||||
// Maximum 400% adjustment...
|
||||
bnResult *= 4;
|
||||
// ... in best-case exactly 4-times-normal target time
|
||||
deltaTime -= Params().TargetTimespan()*4;
|
||||
}
|
||||
if (bnResult > bnLimit)
|
||||
bnResult = bnLimit;
|
||||
|
||||
return bnNewBlock <= bnResult;
|
||||
}
|
||||
|
||||
void UpdateTime(CBlockHeader* pblock, const CBlockIndex* pindexPrev)
|
||||
{
|
||||
pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
|
||||
|
|
|
@ -16,8 +16,6 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead
|
|||
|
||||
/** Check whether a block hash satisfies the proof-of-work requirement specified by nBits */
|
||||
bool CheckProofOfWork(uint256 hash, unsigned int nBits);
|
||||
/** Check the work is more than the minimum a received block needs, without knowing its direct parent */
|
||||
bool CheckMinWork(unsigned int nBits, unsigned int nBase, int64_t deltaTime);
|
||||
|
||||
void UpdateTime(CBlockHeader* block, const CBlockIndex* pindexPrev);
|
||||
|
||||
|
|
|
@ -106,51 +106,6 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
|
|||
BOOST_CHECK(!CNode::IsBanned(addr));
|
||||
}
|
||||
|
||||
static bool CheckNBits(unsigned int nbits1, int64_t time1, unsigned int nbits2, int64_t time2)\
|
||||
{
|
||||
if (time1 > time2)
|
||||
return CheckNBits(nbits2, time2, nbits1, time1);
|
||||
int64_t deltaTime = time2-time1;
|
||||
|
||||
return CheckMinWork(nbits2, nbits1, deltaTime);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(DoS_checknbits)
|
||||
{
|
||||
using namespace boost::assign; // for 'map_list_of()'
|
||||
|
||||
// Timestamps,nBits from the bitcoin block chain.
|
||||
// These are the block-chain checkpoint blocks
|
||||
typedef std::map<int64_t, unsigned int> BlockData;
|
||||
BlockData chainData =
|
||||
map_list_of(1239852051,486604799)(1262749024,486594666)
|
||||
(1279305360,469854461)(1280200847,469830746)(1281678674,469809688)
|
||||
(1296207707,453179945)(1302624061,453036989)(1309640330,437004818)
|
||||
(1313172719,436789733);
|
||||
|
||||
// Make sure CheckNBits considers every combination of block-chain-lock-in-points
|
||||
// "sane":
|
||||
BOOST_FOREACH(const BlockData::value_type& i, chainData)
|
||||
{
|
||||
BOOST_FOREACH(const BlockData::value_type& j, chainData)
|
||||
{
|
||||
BOOST_CHECK(CheckNBits(i.second, i.first, j.second, j.first));
|
||||
}
|
||||
}
|
||||
|
||||
// Test a couple of insane combinations:
|
||||
BlockData::value_type firstcheck = *(chainData.begin());
|
||||
BlockData::value_type lastcheck = *(chainData.rbegin());
|
||||
|
||||
// First checkpoint difficulty at or a while after the last checkpoint time should fail when
|
||||
// compared to last checkpoint
|
||||
BOOST_CHECK(!CheckNBits(firstcheck.second, lastcheck.first+60*10, lastcheck.second, lastcheck.first));
|
||||
BOOST_CHECK(!CheckNBits(firstcheck.second, lastcheck.first+60*60*24*14, lastcheck.second, lastcheck.first));
|
||||
|
||||
// ... but OK if enough time passed for difficulty to adjust downward:
|
||||
BOOST_CHECK(CheckNBits(firstcheck.second, lastcheck.first+60*60*24*365*4, lastcheck.second, lastcheck.first));
|
||||
}
|
||||
|
||||
CTransaction RandomOrphan()
|
||||
{
|
||||
std::map<uint256, COrphanTx>::iterator it;
|
||||
|
|
Loading…
Reference in a new issue