Merge pull request #5927
dce8360
Reduce checkpoints' effect on consensus. (Pieter Wuille)
This commit is contained in:
commit
8d9f0a6069
6 changed files with 15 additions and 38 deletions
|
@ -82,9 +82,10 @@ CBlockIndex* CBlockIndex::GetAncestor(int height)
|
||||||
while (heightWalk > height) {
|
while (heightWalk > height) {
|
||||||
int heightSkip = GetSkipHeight(heightWalk);
|
int heightSkip = GetSkipHeight(heightWalk);
|
||||||
int heightSkipPrev = GetSkipHeight(heightWalk - 1);
|
int heightSkipPrev = GetSkipHeight(heightWalk - 1);
|
||||||
if (heightSkip == height ||
|
if (pindexWalk->pskip != NULL &&
|
||||||
|
(heightSkip == height ||
|
||||||
(heightSkip > height && !(heightSkipPrev < heightSkip - 2 &&
|
(heightSkip > height && !(heightSkipPrev < heightSkip - 2 &&
|
||||||
heightSkipPrev >= height))) {
|
heightSkipPrev >= height)))) {
|
||||||
// Only follow pskip if pprev->pskip isn't better than pskip->pprev.
|
// Only follow pskip if pprev->pskip isn't better than pskip->pprev.
|
||||||
pindexWalk = pindexWalk->pskip;
|
pindexWalk = pindexWalk->pskip;
|
||||||
heightWalk = heightSkip;
|
heightWalk = heightSkip;
|
||||||
|
|
|
@ -24,15 +24,6 @@ namespace Checkpoints {
|
||||||
*/
|
*/
|
||||||
static const double SIGCHECK_VERIFICATION_FACTOR = 5.0;
|
static const double SIGCHECK_VERIFICATION_FACTOR = 5.0;
|
||||||
|
|
||||||
bool CheckBlock(const CCheckpointData& data, int nHeight, const uint256& hash)
|
|
||||||
{
|
|
||||||
const MapCheckpoints& checkpoints = data.mapCheckpoints;
|
|
||||||
|
|
||||||
MapCheckpoints::const_iterator i = checkpoints.find(nHeight);
|
|
||||||
if (i == checkpoints.end()) return true;
|
|
||||||
return hash == i->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Guess how far we are in the verification process at the given block index
|
//! Guess how far we are in the verification process at the given block index
|
||||||
double GuessVerificationProgress(const CCheckpointData& data, CBlockIndex *pindex, bool fSigchecks) {
|
double GuessVerificationProgress(const CCheckpointData& data, CBlockIndex *pindex, bool fSigchecks) {
|
||||||
if (pindex==NULL)
|
if (pindex==NULL)
|
||||||
|
|
|
@ -26,9 +26,6 @@ struct CCheckpointData {
|
||||||
double fTransactionsPerDay;
|
double fTransactionsPerDay;
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Returns true if block passes checkpoint checks
|
|
||||||
bool CheckBlock(const CCheckpointData& data, int nHeight, const uint256& hash);
|
|
||||||
|
|
||||||
//! Return conservative estimate of total number of blocks, 0 if unknown
|
//! Return conservative estimate of total number of blocks, 0 if unknown
|
||||||
int GetTotalBlocksEstimate(const CCheckpointData& data);
|
int GetTotalBlocksEstimate(const CCheckpointData& data);
|
||||||
|
|
||||||
|
|
|
@ -355,7 +355,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||||
strUsage += HelpMessageGroup(_("Debugging/Testing options:"));
|
strUsage += HelpMessageGroup(_("Debugging/Testing options:"));
|
||||||
if (GetBoolArg("-help-debug", false))
|
if (GetBoolArg("-help-debug", false))
|
||||||
{
|
{
|
||||||
strUsage += HelpMessageOpt("-checkpoints", strprintf(_("Only accept block chain matching built-in checkpoints (default: %u)"), 1));
|
strUsage += HelpMessageOpt("-checkpoints", strprintf(_("Disable expensive verification for known chain history (default: %u)"), 1));
|
||||||
strUsage += HelpMessageOpt("-dblogsize=<n>", strprintf(_("Flush database activity from memory pool to disk log every <n> megabytes (default: %u)"), 100));
|
strUsage += HelpMessageOpt("-dblogsize=<n>", strprintf(_("Flush database activity from memory pool to disk log every <n> megabytes (default: %u)"), 100));
|
||||||
strUsage += HelpMessageOpt("-disablesafemode", strprintf(_("Disable safemode, override a real safe mode event (default: %u)"), 0));
|
strUsage += HelpMessageOpt("-disablesafemode", strprintf(_("Disable safemode, override a real safe mode event (default: %u)"), 0));
|
||||||
strUsage += HelpMessageOpt("-testsafemode", strprintf(_("Force safe mode (default: %u)"), 0));
|
strUsage += HelpMessageOpt("-testsafemode", strprintf(_("Force safe mode (default: %u)"), 0));
|
||||||
|
|
14
src/main.cpp
14
src/main.cpp
|
@ -1790,7 +1790,14 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool fScriptChecks = (!fCheckpointsEnabled || pindex->nHeight >= Checkpoints::GetTotalBlocksEstimate(chainparams.Checkpoints()));
|
bool fScriptChecks = true;
|
||||||
|
if (fCheckpointsEnabled) {
|
||||||
|
CBlockIndex *pindexLastCheckpoint = Checkpoints::GetLastCheckpoint(chainparams.Checkpoints());
|
||||||
|
if (pindexLastCheckpoint && pindexLastCheckpoint->GetAncestor(pindex->nHeight) == pindex) {
|
||||||
|
// This block is an ancestor of a checkpoint: disable script checks
|
||||||
|
fScriptChecks = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Do not allow blocks that contain transactions which 'overwrite' older transactions,
|
// Do not allow blocks that contain transactions which 'overwrite' older transactions,
|
||||||
// unless those are already completely spent.
|
// unless those are already completely spent.
|
||||||
|
@ -2736,11 +2743,6 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
|
||||||
|
|
||||||
if (fCheckpointsEnabled)
|
if (fCheckpointsEnabled)
|
||||||
{
|
{
|
||||||
// Check that the block chain matches the known block chain up to a checkpoint
|
|
||||||
if (!Checkpoints::CheckBlock(chainParams.Checkpoints(), nHeight, hash))
|
|
||||||
return state.DoS(100, error("%s: rejected by checkpoint lock-in at %d", __func__, nHeight),
|
|
||||||
REJECT_CHECKPOINT, "checkpoint mismatch");
|
|
||||||
|
|
||||||
// Don't accept any forks from the main chain prior to last checkpoint
|
// Don't accept any forks from the main chain prior to last checkpoint
|
||||||
CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(chainParams.Checkpoints());
|
CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(chainParams.Checkpoints());
|
||||||
if (pcheckpoint && nHeight < pcheckpoint->nHeight)
|
if (pcheckpoint && nHeight < pcheckpoint->nHeight)
|
||||||
|
|
|
@ -21,20 +21,6 @@ BOOST_FIXTURE_TEST_SUITE(Checkpoints_tests, BasicTestingSetup)
|
||||||
BOOST_AUTO_TEST_CASE(sanity)
|
BOOST_AUTO_TEST_CASE(sanity)
|
||||||
{
|
{
|
||||||
const Checkpoints::CCheckpointData& checkpoints = Params(CBaseChainParams::MAIN).Checkpoints();
|
const Checkpoints::CCheckpointData& checkpoints = Params(CBaseChainParams::MAIN).Checkpoints();
|
||||||
uint256 p11111 = uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d");
|
|
||||||
uint256 p134444 = uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe");
|
|
||||||
BOOST_CHECK(Checkpoints::CheckBlock(checkpoints, 11111, p11111));
|
|
||||||
BOOST_CHECK(Checkpoints::CheckBlock(checkpoints, 134444, p134444));
|
|
||||||
|
|
||||||
|
|
||||||
// Wrong hashes at checkpoints should fail:
|
|
||||||
BOOST_CHECK(!Checkpoints::CheckBlock(checkpoints, 11111, p134444));
|
|
||||||
BOOST_CHECK(!Checkpoints::CheckBlock(checkpoints, 134444, p11111));
|
|
||||||
|
|
||||||
// ... but any hash not at a checkpoint should succeed:
|
|
||||||
BOOST_CHECK(Checkpoints::CheckBlock(checkpoints, 11111+1, p134444));
|
|
||||||
BOOST_CHECK(Checkpoints::CheckBlock(checkpoints, 134444+1, p11111));
|
|
||||||
|
|
||||||
BOOST_CHECK(Checkpoints::GetTotalBlocksEstimate(checkpoints) >= 134444);
|
BOOST_CHECK(Checkpoints::GetTotalBlocksEstimate(checkpoints) >= 134444);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue