|
|
@ -1204,8 +1204,9 @@ CAmount GetBlockValue(int nHeight, const CAmount& nFees) |
|
|
|
|
|
|
|
|
|
|
|
bool IsInitialBlockDownload() |
|
|
|
bool IsInitialBlockDownload() |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
const CChainParams& chainParams = Params(); |
|
|
|
LOCK(cs_main); |
|
|
|
LOCK(cs_main); |
|
|
|
if (fImporting || fReindex || chainActive.Height() < Checkpoints::GetTotalBlocksEstimate()) |
|
|
|
if (fImporting || fReindex || chainActive.Height() < Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints())) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
static bool lockIBDState = false; |
|
|
|
static bool lockIBDState = false; |
|
|
|
if (lockIBDState) |
|
|
|
if (lockIBDState) |
|
|
@ -1709,7 +1710,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool fScriptChecks = pindex->nHeight >= Checkpoints::GetTotalBlocksEstimate(); |
|
|
|
bool fScriptChecks = 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.
|
|
|
@ -1954,6 +1955,7 @@ void PruneAndFlush() { |
|
|
|
|
|
|
|
|
|
|
|
/** Update chainActive and related internal data structures. */ |
|
|
|
/** Update chainActive and related internal data structures. */ |
|
|
|
void static UpdateTip(CBlockIndex *pindexNew) { |
|
|
|
void static UpdateTip(CBlockIndex *pindexNew) { |
|
|
|
|
|
|
|
const CChainParams& chainParams = Params(); |
|
|
|
chainActive.SetTip(pindexNew); |
|
|
|
chainActive.SetTip(pindexNew); |
|
|
|
|
|
|
|
|
|
|
|
// New best block
|
|
|
|
// New best block
|
|
|
@ -1963,7 +1965,7 @@ void static UpdateTip(CBlockIndex *pindexNew) { |
|
|
|
LogPrintf("%s: new best=%s height=%d log2_work=%.8g tx=%lu date=%s progress=%f cache=%u\n", __func__, |
|
|
|
LogPrintf("%s: new best=%s height=%d log2_work=%.8g tx=%lu date=%s progress=%f cache=%u\n", __func__, |
|
|
|
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0), (unsigned long)chainActive.Tip()->nChainTx, |
|
|
|
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0), (unsigned long)chainActive.Tip()->nChainTx, |
|
|
|
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), |
|
|
|
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), |
|
|
|
Checkpoints::GuessVerificationProgress(chainActive.Tip()), (unsigned int)pcoinsTip->GetCacheSize()); |
|
|
|
Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), chainActive.Tip()), (unsigned int)pcoinsTip->GetCacheSize()); |
|
|
|
|
|
|
|
|
|
|
|
cvBlockChange.notify_all(); |
|
|
|
cvBlockChange.notify_all(); |
|
|
|
|
|
|
|
|
|
|
@ -2247,6 +2249,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo |
|
|
|
bool ActivateBestChain(CValidationState &state, CBlock *pblock) { |
|
|
|
bool ActivateBestChain(CValidationState &state, CBlock *pblock) { |
|
|
|
CBlockIndex *pindexNewTip = NULL; |
|
|
|
CBlockIndex *pindexNewTip = NULL; |
|
|
|
CBlockIndex *pindexMostWork = NULL; |
|
|
|
CBlockIndex *pindexMostWork = NULL; |
|
|
|
|
|
|
|
const CChainParams& chainParams = Params(); |
|
|
|
do { |
|
|
|
do { |
|
|
|
boost::this_thread::interruption_point(); |
|
|
|
boost::this_thread::interruption_point(); |
|
|
|
|
|
|
|
|
|
|
@ -2271,7 +2274,7 @@ 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(); |
|
|
|
int 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) { |
|
|
@ -2601,7 +2604,8 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo |
|
|
|
|
|
|
|
|
|
|
|
bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex * const pindexPrev) |
|
|
|
bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex * const pindexPrev) |
|
|
|
{ |
|
|
|
{ |
|
|
|
const Consensus::Params& consensusParams = Params().GetConsensus(); |
|
|
|
const CChainParams& chainParams = Params(); |
|
|
|
|
|
|
|
const Consensus::Params& consensusParams = chainParams.GetConsensus(); |
|
|
|
uint256 hash = block.GetHash(); |
|
|
|
uint256 hash = block.GetHash(); |
|
|
|
if (hash == consensusParams.hashGenesisBlock) |
|
|
|
if (hash == consensusParams.hashGenesisBlock) |
|
|
|
return true; |
|
|
|
return true; |
|
|
@ -2611,7 +2615,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta |
|
|
|
int nHeight = pindexPrev->nHeight+1; |
|
|
|
int nHeight = pindexPrev->nHeight+1; |
|
|
|
|
|
|
|
|
|
|
|
// Check proof of work
|
|
|
|
// Check proof of work
|
|
|
|
if (block.nBits != GetNextWorkRequired(pindexPrev, &block, Params().GetConsensus())) |
|
|
|
if (block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams)) |
|
|
|
return state.DoS(100, error("%s: incorrect proof of work", __func__), |
|
|
|
return state.DoS(100, error("%s: incorrect proof of work", __func__), |
|
|
|
REJECT_INVALID, "bad-diffbits"); |
|
|
|
REJECT_INVALID, "bad-diffbits"); |
|
|
|
|
|
|
|
|
|
|
@ -2621,24 +2625,24 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta |
|
|
|
REJECT_INVALID, "time-too-old"); |
|
|
|
REJECT_INVALID, "time-too-old"); |
|
|
|
|
|
|
|
|
|
|
|
// 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(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), |
|
|
|
REJECT_CHECKPOINT, "checkpoint mismatch"); |
|
|
|
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(); |
|
|
|
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, Params().RejectBlockOutdatedMajority())) |
|
|
|
if (block.nVersion < 2 && IsSuperMajority(2, pindexPrev, consensusParams.nMajorityRejectBlockOutdated)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return state.Invalid(error("%s: rejected nVersion=1 block", __func__), |
|
|
|
return state.Invalid(error("%s: rejected nVersion=1 block", __func__), |
|
|
|
REJECT_OBSOLETE, "bad-version"); |
|
|
|
REJECT_OBSOLETE, "bad-version"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Reject block.nVersion=2 blocks when 95% (75% on testnet) of the network has upgraded:
|
|
|
|
// Reject block.nVersion=2 blocks when 95% (75% on testnet) of the network has upgraded:
|
|
|
|
if (block.nVersion < 3 && IsSuperMajority(3, pindexPrev, Params().RejectBlockOutdatedMajority())) |
|
|
|
if (block.nVersion < 3 && IsSuperMajority(3, pindexPrev, consensusParams.nMajorityRejectBlockOutdated)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return state.Invalid(error("%s : rejected nVersion=2 block", __func__), |
|
|
|
return state.Invalid(error("%s : rejected nVersion=2 block", __func__), |
|
|
|
REJECT_OBSOLETE, "bad-version"); |
|
|
|
REJECT_OBSOLETE, "bad-version"); |
|
|
@ -3025,6 +3029,7 @@ CBlockIndex * InsertBlockIndex(uint256 hash) |
|
|
|
|
|
|
|
|
|
|
|
bool static LoadBlockIndexDB() |
|
|
|
bool static LoadBlockIndexDB() |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
const CChainParams& chainparams = Params(); |
|
|
|
if (!pblocktree->LoadBlockIndexGuts()) |
|
|
|
if (!pblocktree->LoadBlockIndexGuts()) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
@ -3127,7 +3132,7 @@ bool static LoadBlockIndexDB() |
|
|
|
LogPrintf("%s: hashBestChain=%s height=%d date=%s progress=%f\n", __func__, |
|
|
|
LogPrintf("%s: hashBestChain=%s height=%d date=%s progress=%f\n", __func__, |
|
|
|
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), |
|
|
|
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), |
|
|
|
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), |
|
|
|
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()), |
|
|
|
Checkpoints::GuessVerificationProgress(chainActive.Tip())); |
|
|
|
Checkpoints::GuessVerificationProgress(chainparams.Checkpoints(), chainActive.Tip())); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|