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;
|
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
|
// Get prev block index
|
||||||
CBlockIndex* pindexPrev = NULL;
|
CBlockIndex* pindexPrev = NULL;
|
||||||
int nHeight = 0;
|
int nHeight = 0;
|
||||||
|
|
33
src/pow.cpp
33
src/pow.cpp
|
@ -98,39 +98,6 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits)
|
||||||
return true;
|
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)
|
void UpdateTime(CBlockHeader* pblock, const CBlockIndex* pindexPrev)
|
||||||
{
|
{
|
||||||
pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
|
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 */
|
/** 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);
|
||||||
/** 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);
|
void UpdateTime(CBlockHeader* block, const CBlockIndex* pindexPrev);
|
||||||
|
|
||||||
|
|
|
@ -106,51 +106,6 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
|
||||||
BOOST_CHECK(!CNode::IsBanned(addr));
|
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()
|
CTransaction RandomOrphan()
|
||||||
{
|
{
|
||||||
std::map<uint256, COrphanTx>::iterator it;
|
std::map<uint256, COrphanTx>::iterator it;
|
||||||
|
|
Loading…
Reference in a new issue