|
|
@ -56,6 +56,7 @@ bool fHavePruned = false; |
|
|
|
bool fPruneMode = false; |
|
|
|
bool fPruneMode = false; |
|
|
|
bool fIsBareMultisigStd = true; |
|
|
|
bool fIsBareMultisigStd = true; |
|
|
|
bool fCheckBlockIndex = false; |
|
|
|
bool fCheckBlockIndex = false; |
|
|
|
|
|
|
|
bool fCheckpointsEnabled = true; |
|
|
|
unsigned int nCoinCacheSize = 5000; |
|
|
|
unsigned int nCoinCacheSize = 5000; |
|
|
|
uint64_t nPruneTarget = 0; |
|
|
|
uint64_t nPruneTarget = 0; |
|
|
|
|
|
|
|
|
|
|
@ -1206,7 +1207,9 @@ bool IsInitialBlockDownload() |
|
|
|
{ |
|
|
|
{ |
|
|
|
const CChainParams& chainParams = Params(); |
|
|
|
const CChainParams& chainParams = Params(); |
|
|
|
LOCK(cs_main); |
|
|
|
LOCK(cs_main); |
|
|
|
if (fImporting || fReindex || chainActive.Height() < Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints())) |
|
|
|
if (fImporting || fReindex) |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
if (fCheckpointsEnabled && chainActive.Height() < Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints())) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
static bool lockIBDState = false; |
|
|
|
static bool lockIBDState = false; |
|
|
|
if (lockIBDState) |
|
|
|
if (lockIBDState) |
|
|
@ -1710,7 +1713,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool fScriptChecks = pindex->nHeight >= Checkpoints::GetTotalBlocksEstimate(chainparams.Checkpoints()); |
|
|
|
bool fScriptChecks = (!fCheckpointsEnabled || pindex->nHeight >= Checkpoints::GetTotalBlocksEstimate(chainparams.Checkpoints())); |
|
|
|
|
|
|
|
|
|
|
|
// 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.
|
|
|
@ -2274,7 +2277,9 @@ bool ActivateBestChain(CValidationState &state, CBlock *pblock) { |
|
|
|
if (!fInitialDownload) { |
|
|
|
if (!fInitialDownload) { |
|
|
|
uint256 hashNewTip = pindexNewTip->GetBlockHash(); |
|
|
|
uint256 hashNewTip = pindexNewTip->GetBlockHash(); |
|
|
|
// Relay inventory, but don't relay old inventory during initial block download.
|
|
|
|
// Relay inventory, but don't relay old inventory during initial block download.
|
|
|
|
int nBlockEstimate = Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints()); |
|
|
|
int nBlockEstimate = 0; |
|
|
|
|
|
|
|
if (fCheckpointsEnabled) |
|
|
|
|
|
|
|
nBlockEstimate = Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints()); |
|
|
|
// Don't relay blocks if pruning -- could cause a peer to try to download, resulting
|
|
|
|
// Don't relay blocks if pruning -- could cause a peer to try to download, resulting
|
|
|
|
// in a stalled download if the block file is pruned before the request.
|
|
|
|
// in a stalled download if the block file is pruned before the request.
|
|
|
|
if (nLocalServices & NODE_NETWORK) { |
|
|
|
if (nLocalServices & NODE_NETWORK) { |
|
|
@ -2624,6 +2629,8 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta |
|
|
|
return state.Invalid(error("%s: block's timestamp is too early", __func__), |
|
|
|
return state.Invalid(error("%s: block's timestamp is too early", __func__), |
|
|
|
REJECT_INVALID, "time-too-old"); |
|
|
|
REJECT_INVALID, "time-too-old"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(fCheckpointsEnabled) |
|
|
|
|
|
|
|
{ |
|
|
|
// Check that the block chain matches the known block chain up to a checkpoint
|
|
|
|
// Check that the block chain matches the known block chain up to a checkpoint
|
|
|
|
if (!Checkpoints::CheckBlock(chainParams.Checkpoints(), nHeight, hash)) |
|
|
|
if (!Checkpoints::CheckBlock(chainParams.Checkpoints(), nHeight, hash)) |
|
|
|
return state.DoS(100, error("%s: rejected by checkpoint lock-in at %d", __func__, nHeight), |
|
|
|
return state.DoS(100, error("%s: rejected by checkpoint lock-in at %d", __func__, nHeight), |
|
|
@ -2633,6 +2640,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta |
|
|
|
CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(chainParams.Checkpoints()); |
|
|
|
CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(chainParams.Checkpoints()); |
|
|
|
if (pcheckpoint && nHeight < pcheckpoint->nHeight) |
|
|
|
if (pcheckpoint && nHeight < pcheckpoint->nHeight) |
|
|
|
return state.DoS(100, error("%s: forked chain older than last checkpoint (height %d)", __func__, nHeight)); |
|
|
|
return state.DoS(100, error("%s: forked chain older than last checkpoint (height %d)", __func__, nHeight)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Reject block.nVersion=1 blocks when 95% (75% on testnet) of the network has upgraded:
|
|
|
|
// Reject block.nVersion=1 blocks when 95% (75% on testnet) of the network has upgraded:
|
|
|
|
if (block.nVersion < 2 && IsSuperMajority(2, pindexPrev, consensusParams.nMajorityRejectBlockOutdated)) |
|
|
|
if (block.nVersion < 2 && IsSuperMajority(2, pindexPrev, consensusParams.nMajorityRejectBlockOutdated)) |
|
|
|