|
|
|
@ -1204,8 +1204,9 @@ CAmount GetBlockValue(int nHeight, const CAmount& nFees)
|
|
|
|
|
|
|
|
|
|
bool IsInitialBlockDownload()
|
|
|
|
|
{
|
|
|
|
|
const CChainParams& chainParams = Params();
|
|
|
|
|
LOCK(cs_main);
|
|
|
|
|
if (fImporting || fReindex || chainActive.Height() < Checkpoints::GetTotalBlocksEstimate())
|
|
|
|
|
if (fImporting || fReindex || chainActive.Height() < Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints()))
|
|
|
|
|
return true;
|
|
|
|
|
static bool lockIBDState = false;
|
|
|
|
|
if (lockIBDState)
|
|
|
|
@ -1709,7 +1710,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|
|
|
|
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,
|
|
|
|
|
// unless those are already completely spent.
|
|
|
|
@ -1954,6 +1955,7 @@ void PruneAndFlush() {
|
|
|
|
|
|
|
|
|
|
/** Update chainActive and related internal data structures. */
|
|
|
|
|
void static UpdateTip(CBlockIndex *pindexNew) {
|
|
|
|
|
const CChainParams& chainParams = Params();
|
|
|
|
|
chainActive.SetTip(pindexNew);
|
|
|
|
|
|
|
|
|
|
// 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__,
|
|
|
|
|
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()),
|
|
|
|
|
Checkpoints::GuessVerificationProgress(chainActive.Tip()), (unsigned int)pcoinsTip->GetCacheSize());
|
|
|
|
|
Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), chainActive.Tip()), (unsigned int)pcoinsTip->GetCacheSize());
|
|
|
|
|
|
|
|
|
|
cvBlockChange.notify_all();
|
|
|
|
|
|
|
|
|
@ -2247,6 +2249,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo
|
|
|
|
|
bool ActivateBestChain(CValidationState &state, CBlock *pblock) {
|
|
|
|
|
CBlockIndex *pindexNewTip = NULL;
|
|
|
|
|
CBlockIndex *pindexMostWork = NULL;
|
|
|
|
|
const CChainParams& chainParams = Params();
|
|
|
|
|
do {
|
|
|
|
|
boost::this_thread::interruption_point();
|
|
|
|
|
|
|
|
|
@ -2271,7 +2274,7 @@ bool ActivateBestChain(CValidationState &state, CBlock *pblock) {
|
|
|
|
|
if (!fInitialDownload) {
|
|
|
|
|
uint256 hashNewTip = pindexNewTip->GetBlockHash();
|
|
|
|
|
// 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
|
|
|
|
|
// in a stalled download if the block file is pruned before the request.
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
const Consensus::Params& consensusParams = Params().GetConsensus();
|
|
|
|
|
const CChainParams& chainParams = Params();
|
|
|
|
|
const Consensus::Params& consensusParams = chainParams.GetConsensus();
|
|
|
|
|
uint256 hash = block.GetHash();
|
|
|
|
|
if (hash == consensusParams.hashGenesisBlock)
|
|
|
|
|
return true;
|
|
|
|
@ -2611,7 +2615,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
|
|
|
|
|
int nHeight = pindexPrev->nHeight+1;
|
|
|
|
|
|
|
|
|
|
// 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__),
|
|
|
|
|
REJECT_INVALID, "bad-diffbits");
|
|
|
|
|
|
|
|
|
@ -2621,24 +2625,24 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
|
|
|
|
|
REJECT_INVALID, "time-too-old");
|
|
|
|
|
|
|
|
|
|
// 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),
|
|
|
|
|
REJECT_CHECKPOINT, "checkpoint mismatch");
|
|
|
|
|
|
|
|
|
|
// 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)
|
|
|
|
|
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:
|
|
|
|
|
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__),
|
|
|
|
|
REJECT_OBSOLETE, "bad-version");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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__),
|
|
|
|
|
REJECT_OBSOLETE, "bad-version");
|
|
|
|
@ -3025,6 +3029,7 @@ CBlockIndex * InsertBlockIndex(uint256 hash)
|
|
|
|
|
|
|
|
|
|
bool static LoadBlockIndexDB()
|
|
|
|
|
{
|
|
|
|
|
const CChainParams& chainparams = Params();
|
|
|
|
|
if (!pblocktree->LoadBlockIndexGuts())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
@ -3127,7 +3132,7 @@ bool static LoadBlockIndexDB()
|
|
|
|
|
LogPrintf("%s: hashBestChain=%s height=%d date=%s progress=%f\n", __func__,
|
|
|
|
|
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(),
|
|
|
|
|
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()),
|
|
|
|
|
Checkpoints::GuessVerificationProgress(chainActive.Tip()));
|
|
|
|
|
Checkpoints::GuessVerificationProgress(chainparams.Checkpoints(), chainActive.Tip()));
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|