|
|
|
@ -186,8 +186,11 @@ enum FlushStateMode {
@@ -186,8 +186,11 @@ enum FlushStateMode {
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// See definition for documentation
|
|
|
|
|
bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode, int nManualPruneHeight=0); |
|
|
|
|
void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeight); |
|
|
|
|
static bool FlushStateToDisk(const CChainParams& chainParams, CValidationState &state, FlushStateMode mode, int nManualPruneHeight=0); |
|
|
|
|
static void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeight); |
|
|
|
|
static void FindFilesToPrune(std::set<int>& setFilesToPrune, uint64_t nPruneAfterHeight); |
|
|
|
|
static bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, std::vector<CScriptCheck> *pvChecks = NULL); |
|
|
|
|
static FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly = false); |
|
|
|
|
|
|
|
|
|
bool CheckFinalTx(const CTransaction &tx, int flags) |
|
|
|
|
{ |
|
|
|
@ -309,7 +312,7 @@ bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp, bool
@@ -309,7 +312,7 @@ bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp, bool
|
|
|
|
|
return EvaluateSequenceLocks(index, lockPair); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age) { |
|
|
|
|
static void LimitMempoolSize(CTxMemPool& pool, size_t limit, unsigned long age) { |
|
|
|
|
int expired = pool.Expire(GetTime() - age); |
|
|
|
|
if (expired != 0) { |
|
|
|
|
LogPrint(BCLog::MEMPOOL, "Expired %i transactions from the memory pool\n", expired); |
|
|
|
@ -392,7 +395,7 @@ void UpdateMempoolForReorg(DisconnectedBlockTransactions &disconnectpool, bool f
@@ -392,7 +395,7 @@ void UpdateMempoolForReorg(DisconnectedBlockTransactions &disconnectpool, bool f
|
|
|
|
|
LimitMempoolSize(mempool, GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000, GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const CTransactionRef& ptx, bool fLimitFree, |
|
|
|
|
static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool& pool, CValidationState& state, const CTransactionRef& ptx, bool fLimitFree, |
|
|
|
|
bool* pfMissingInputs, int64_t nAcceptTime, std::list<CTransactionRef>* plTxnReplaced, |
|
|
|
|
bool fOverrideMempoolLimit, const CAmount& nAbsurdFee, std::vector<COutPoint>& coins_to_uncache) |
|
|
|
|
{ |
|
|
|
@ -410,7 +413,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
@@ -410,7 +413,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
|
|
|
|
|
return state.DoS(100, false, REJECT_INVALID, "coinbase"); |
|
|
|
|
|
|
|
|
|
// Reject transactions with witness before segregated witness activates (override with -prematurewitness)
|
|
|
|
|
bool witnessEnabled = IsWitnessEnabled(chainActive.Tip(), Params().GetConsensus()); |
|
|
|
|
bool witnessEnabled = IsWitnessEnabled(chainActive.Tip(), chainparams.GetConsensus()); |
|
|
|
|
if (!GetBoolArg("-prematurewitness",false) && tx.HasWitness() && !witnessEnabled) { |
|
|
|
|
return state.DoS(0, false, REJECT_NONSTANDARD, "no-witness-yet", true); |
|
|
|
|
} |
|
|
|
@ -739,7 +742,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
@@ -739,7 +742,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
unsigned int scriptVerifyFlags = STANDARD_SCRIPT_VERIFY_FLAGS; |
|
|
|
|
if (!Params().RequireStandard()) { |
|
|
|
|
if (!chainparams.RequireStandard()) { |
|
|
|
|
scriptVerifyFlags = GetArg("-promiscuousmempoolflags", scriptVerifyFlags); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -809,19 +812,20 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
@@ -809,19 +812,20 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool AcceptToMemoryPoolWithTime(CTxMemPool& pool, CValidationState &state, const CTransactionRef &tx, bool fLimitFree, |
|
|
|
|
/** (try to) add transaction to memory pool with a specified acceptance time **/ |
|
|
|
|
static bool AcceptToMemoryPoolWithTime(const CChainParams& chainparams, CTxMemPool& pool, CValidationState &state, const CTransactionRef &tx, bool fLimitFree, |
|
|
|
|
bool* pfMissingInputs, int64_t nAcceptTime, std::list<CTransactionRef>* plTxnReplaced, |
|
|
|
|
bool fOverrideMempoolLimit, const CAmount nAbsurdFee) |
|
|
|
|
{ |
|
|
|
|
std::vector<COutPoint> coins_to_uncache; |
|
|
|
|
bool res = AcceptToMemoryPoolWorker(pool, state, tx, fLimitFree, pfMissingInputs, nAcceptTime, plTxnReplaced, fOverrideMempoolLimit, nAbsurdFee, coins_to_uncache); |
|
|
|
|
bool res = AcceptToMemoryPoolWorker(chainparams, pool, state, tx, fLimitFree, pfMissingInputs, nAcceptTime, plTxnReplaced, fOverrideMempoolLimit, nAbsurdFee, coins_to_uncache); |
|
|
|
|
if (!res) { |
|
|
|
|
BOOST_FOREACH(const COutPoint& hashTx, coins_to_uncache) |
|
|
|
|
pcoinsTip->Uncache(hashTx); |
|
|
|
|
} |
|
|
|
|
// After we've (potentially) uncached entries, ensure our coins cache is still within its size limits
|
|
|
|
|
CValidationState stateDummy; |
|
|
|
|
FlushStateToDisk(stateDummy, FLUSH_STATE_PERIODIC); |
|
|
|
|
FlushStateToDisk(chainparams, stateDummy, FLUSH_STATE_PERIODIC); |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -829,7 +833,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
@@ -829,7 +833,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
|
|
|
|
bool* pfMissingInputs, std::list<CTransactionRef>* plTxnReplaced, |
|
|
|
|
bool fOverrideMempoolLimit, const CAmount nAbsurdFee) |
|
|
|
|
{ |
|
|
|
|
return AcceptToMemoryPoolWithTime(pool, state, tx, fLimitFree, pfMissingInputs, GetTime(), plTxnReplaced, fOverrideMempoolLimit, nAbsurdFee); |
|
|
|
|
const CChainParams& chainparams = Params(); |
|
|
|
|
return AcceptToMemoryPoolWithTime(chainparams, pool, state, tx, fLimitFree, pfMissingInputs, GetTime(), plTxnReplaced, fOverrideMempoolLimit, nAbsurdFee); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** Return transaction in txOut, and if it was found inside a block, its hash is placed in hashBlock */ |
|
|
|
@ -898,7 +903,7 @@ bool GetTransaction(const uint256 &hash, CTransactionRef &txOut, const Consensus
@@ -898,7 +903,7 @@ bool GetTransaction(const uint256 &hash, CTransactionRef &txOut, const Consensus
|
|
|
|
|
// CBlock and CBlockIndex
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
bool WriteBlockToDisk(const CBlock& block, CDiskBlockPos& pos, const CMessageHeader::MessageStartChars& messageStart) |
|
|
|
|
static bool WriteBlockToDisk(const CBlock& block, CDiskBlockPos& pos, const CMessageHeader::MessageStartChars& messageStart) |
|
|
|
|
{ |
|
|
|
|
// Open history file to append
|
|
|
|
|
CAutoFile fileout(OpenBlockFile(pos), SER_DISK, CLIENT_VERSION); |
|
|
|
@ -1011,7 +1016,7 @@ static void AlertNotify(const std::string& strMessage)
@@ -1011,7 +1016,7 @@ static void AlertNotify(const std::string& strMessage)
|
|
|
|
|
boost::thread t(runCommand, strCmd); // thread runs free
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void CheckForkWarningConditions() |
|
|
|
|
static void CheckForkWarningConditions() |
|
|
|
|
{ |
|
|
|
|
AssertLockHeld(cs_main); |
|
|
|
|
// Before we get past initial download, we cannot reliably alert about forks
|
|
|
|
@ -1052,7 +1057,7 @@ void CheckForkWarningConditions()
@@ -1052,7 +1057,7 @@ void CheckForkWarningConditions()
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void CheckForkWarningConditionsOnNewFork(CBlockIndex* pindexNewForkTip) |
|
|
|
|
static void CheckForkWarningConditionsOnNewFork(CBlockIndex* pindexNewForkTip) |
|
|
|
|
{ |
|
|
|
|
AssertLockHeld(cs_main); |
|
|
|
|
// If we are on a fork that is sufficiently large, set a warning flag
|
|
|
|
@ -1144,7 +1149,12 @@ int GetSpendHeight(const CCoinsViewCache& inputs)
@@ -1144,7 +1149,12 @@ int GetSpendHeight(const CCoinsViewCache& inputs)
|
|
|
|
|
return pindexPrev->nHeight + 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, std::vector<CScriptCheck> *pvChecks) |
|
|
|
|
/**
|
|
|
|
|
* Check whether all inputs of this transaction are valid (no double spends, scripts & sigs, amounts) |
|
|
|
|
* This does not modify the UTXO set. If pvChecks is not NULL, script checks are pushed onto it |
|
|
|
|
* instead of being performed inline. |
|
|
|
|
*/ |
|
|
|
|
static bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, PrecomputedTransactionData& txdata, std::vector<CScriptCheck> *pvChecks) |
|
|
|
|
{ |
|
|
|
|
if (!tx.IsCoinBase()) |
|
|
|
|
{ |
|
|
|
@ -1411,7 +1421,7 @@ void static FlushBlockFile(bool fFinalize = false)
@@ -1411,7 +1421,7 @@ void static FlushBlockFile(bool fFinalize = false)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigned int nAddSize); |
|
|
|
|
static bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigned int nAddSize); |
|
|
|
|
|
|
|
|
|
static CCheckQueue<CScriptCheck> scriptcheckqueue(128); |
|
|
|
|
|
|
|
|
@ -1730,9 +1740,8 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd
@@ -1730,9 +1740,8 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd
|
|
|
|
|
* if they're too large, if it's been a while since the last write, |
|
|
|
|
* or always and in all cases if we're in prune mode and are deleting files. |
|
|
|
|
*/ |
|
|
|
|
bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode, int nManualPruneHeight) { |
|
|
|
|
bool static FlushStateToDisk(const CChainParams& chainparams, CValidationState &state, FlushStateMode mode, int nManualPruneHeight) { |
|
|
|
|
int64_t nMempoolUsage = mempool.DynamicMemoryUsage(); |
|
|
|
|
const CChainParams& chainparams = Params(); |
|
|
|
|
LOCK2(cs_main, cs_LastBlockFile); |
|
|
|
|
static int64_t nLastWrite = 0; |
|
|
|
|
static int64_t nLastFlush = 0; |
|
|
|
@ -1836,13 +1845,15 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode, int n
@@ -1836,13 +1845,15 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode, int n
|
|
|
|
|
|
|
|
|
|
void FlushStateToDisk() { |
|
|
|
|
CValidationState state; |
|
|
|
|
FlushStateToDisk(state, FLUSH_STATE_ALWAYS); |
|
|
|
|
const CChainParams& chainparams = Params(); |
|
|
|
|
FlushStateToDisk(chainparams, state, FLUSH_STATE_ALWAYS); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void PruneAndFlush() { |
|
|
|
|
CValidationState state; |
|
|
|
|
fCheckForPruning = true; |
|
|
|
|
FlushStateToDisk(state, FLUSH_STATE_NONE); |
|
|
|
|
const CChainParams& chainparams = Params(); |
|
|
|
|
FlushStateToDisk(chainparams, state, FLUSH_STATE_NONE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void DoWarning(const std::string& strWarning) |
|
|
|
@ -1939,7 +1950,7 @@ bool static DisconnectTip(CValidationState& state, const CChainParams& chainpara
@@ -1939,7 +1950,7 @@ bool static DisconnectTip(CValidationState& state, const CChainParams& chainpara
|
|
|
|
|
} |
|
|
|
|
LogPrint(BCLog::BENCH, "- Disconnect block: %.2fms\n", (GetTimeMicros() - nStart) * 0.001); |
|
|
|
|
// Write the chain state to disk, if necessary.
|
|
|
|
|
if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) |
|
|
|
|
if (!FlushStateToDisk(chainparams, state, FLUSH_STATE_IF_NEEDED)) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
if (disconnectpool) { |
|
|
|
@ -2076,7 +2087,7 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams,
@@ -2076,7 +2087,7 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams,
|
|
|
|
|
int64_t nTime4 = GetTimeMicros(); nTimeFlush += nTime4 - nTime3; |
|
|
|
|
LogPrint(BCLog::BENCH, " - Flush: %.2fms [%.2fs]\n", (nTime4 - nTime3) * 0.001, nTimeFlush * 0.000001); |
|
|
|
|
// Write the chain state to disk, if necessary.
|
|
|
|
|
if (!FlushStateToDisk(state, FLUSH_STATE_IF_NEEDED)) |
|
|
|
|
if (!FlushStateToDisk(chainparams, state, FLUSH_STATE_IF_NEEDED)) |
|
|
|
|
return false; |
|
|
|
|
int64_t nTime5 = GetTimeMicros(); nTimeChainState += nTime5 - nTime4; |
|
|
|
|
LogPrint(BCLog::BENCH, " - Writing chainstate: %.2fms [%.2fs]\n", (nTime5 - nTime4) * 0.001, nTimeChainState * 0.000001); |
|
|
|
@ -2336,7 +2347,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
@@ -2336,7 +2347,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
|
|
|
|
|
CheckBlockIndex(chainparams.GetConsensus()); |
|
|
|
|
|
|
|
|
|
// Write changes periodically to disk, after relay.
|
|
|
|
|
if (!FlushStateToDisk(state, FLUSH_STATE_PERIODIC)) { |
|
|
|
|
if (!FlushStateToDisk(chainparams, state, FLUSH_STATE_PERIODIC)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -2453,7 +2464,7 @@ bool ResetBlockFailureFlags(CBlockIndex *pindex) {
@@ -2453,7 +2464,7 @@ bool ResetBlockFailureFlags(CBlockIndex *pindex) {
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CBlockIndex* AddToBlockIndex(const CBlockHeader& block) |
|
|
|
|
static CBlockIndex* AddToBlockIndex(const CBlockHeader& block) |
|
|
|
|
{ |
|
|
|
|
// Check for duplicate
|
|
|
|
|
uint256 hash = block.GetHash(); |
|
|
|
@ -2537,7 +2548,7 @@ static bool ReceivedBlockTransactions(const CBlock &block, CValidationState& sta
@@ -2537,7 +2548,7 @@ static bool ReceivedBlockTransactions(const CBlock &block, CValidationState& sta
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAddSize, unsigned int nHeight, uint64_t nTime, bool fKnown = false) |
|
|
|
|
static bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAddSize, unsigned int nHeight, uint64_t nTime, bool fKnown = false) |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_LastBlockFile); |
|
|
|
|
|
|
|
|
@ -2594,7 +2605,7 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd
@@ -2594,7 +2605,7 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigned int nAddSize) |
|
|
|
|
static bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigned int nAddSize) |
|
|
|
|
{ |
|
|
|
|
pos.nFile = nFile; |
|
|
|
|
|
|
|
|
@ -2625,7 +2636,7 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne
@@ -2625,7 +2636,7 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW) |
|
|
|
|
static bool CheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW = true) |
|
|
|
|
{ |
|
|
|
|
// Check proof of work matches claimed amount
|
|
|
|
|
if (fCheckPOW && !CheckProofOfWork(block.GetHash(), block.nBits, consensusParams)) |
|
|
|
@ -2775,7 +2786,10 @@ std::vector<unsigned char> GenerateCoinbaseCommitment(CBlock& block, const CBloc
@@ -2775,7 +2786,10 @@ std::vector<unsigned char> GenerateCoinbaseCommitment(CBlock& block, const CBloc
|
|
|
|
|
return commitment; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev, int64_t nAdjustedTime) |
|
|
|
|
/** Context-dependent validity checks.
|
|
|
|
|
* By "context", we mean only the previous block headers, but not the UTXO |
|
|
|
|
* set; UTXO-related validity checks are done in ConnectBlock(). */ |
|
|
|
|
static bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev, int64_t nAdjustedTime) |
|
|
|
|
{ |
|
|
|
|
assert(pindexPrev != NULL); |
|
|
|
|
const int nHeight = pindexPrev->nHeight + 1; |
|
|
|
@ -2802,7 +2816,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
@@ -2802,7 +2816,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool ContextualCheckBlock(const CBlock& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev) |
|
|
|
|
static bool ContextualCheckBlock(const CBlock& block, CValidationState& state, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev) |
|
|
|
|
{ |
|
|
|
|
const int nHeight = pindexPrev == NULL ? 0 : pindexPrev->nHeight + 1; |
|
|
|
|
|
|
|
|
@ -3026,7 +3040,7 @@ static bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CValidation
@@ -3026,7 +3040,7 @@ static bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CValidation
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (fCheckForPruning) |
|
|
|
|
FlushStateToDisk(state, FLUSH_STATE_NONE); // we just allocated more disk space for block files
|
|
|
|
|
FlushStateToDisk(chainparams, state, FLUSH_STATE_NONE); // we just allocated more disk space for block files
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
@ -3094,7 +3108,7 @@ bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams,
@@ -3094,7 +3108,7 @@ bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams,
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/* Calculate the amount of disk space the block & undo files currently use */ |
|
|
|
|
uint64_t CalculateCurrentUsage() |
|
|
|
|
static uint64_t CalculateCurrentUsage() |
|
|
|
|
{ |
|
|
|
|
uint64_t retval = 0; |
|
|
|
|
BOOST_FOREACH(const CBlockFileInfo &file, vinfoBlockFile) { |
|
|
|
@ -3147,7 +3161,7 @@ void UnlinkPrunedFiles(const std::set<int>& setFilesToPrune)
@@ -3147,7 +3161,7 @@ void UnlinkPrunedFiles(const std::set<int>& setFilesToPrune)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Calculate the block/rev files to delete based on height specified by user with RPC command pruneblockchain */ |
|
|
|
|
void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeight) |
|
|
|
|
static void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeight) |
|
|
|
|
{ |
|
|
|
|
assert(fPruneMode && nManualPruneHeight > 0); |
|
|
|
|
|
|
|
|
@ -3172,11 +3186,26 @@ void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeig
@@ -3172,11 +3186,26 @@ void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeig
|
|
|
|
|
void PruneBlockFilesManual(int nManualPruneHeight) |
|
|
|
|
{ |
|
|
|
|
CValidationState state; |
|
|
|
|
FlushStateToDisk(state, FLUSH_STATE_NONE, nManualPruneHeight); |
|
|
|
|
const CChainParams& chainparams = Params(); |
|
|
|
|
FlushStateToDisk(chainparams, state, FLUSH_STATE_NONE, nManualPruneHeight); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Calculate the block/rev files that should be deleted to remain under target*/ |
|
|
|
|
void FindFilesToPrune(std::set<int>& setFilesToPrune, uint64_t nPruneAfterHeight) |
|
|
|
|
/**
|
|
|
|
|
* Prune block and undo files (blk???.dat and undo???.dat) so that the disk space used is less than a user-defined target. |
|
|
|
|
* The user sets the target (in MB) on the command line or in config file. This will be run on startup and whenever new |
|
|
|
|
* space is allocated in a block or undo file, staying below the target. Changing back to unpruned requires a reindex |
|
|
|
|
* (which in this case means the blockchain must be re-downloaded.) |
|
|
|
|
* |
|
|
|
|
* Pruning functions are called from FlushStateToDisk when the global fCheckForPruning flag has been set. |
|
|
|
|
* Block and undo files are deleted in lock-step (when blk00003.dat is deleted, so is rev00003.dat.) |
|
|
|
|
* Pruning cannot take place until the longest chain is at least a certain length (100000 on mainnet, 1000 on testnet, 1000 on regtest). |
|
|
|
|
* Pruning will never delete a block within a defined distance (currently 288) from the active chain's tip. |
|
|
|
|
* The block index is updated by unsetting HAVE_DATA and HAVE_UNDO for any blocks that were stored in the deleted files. |
|
|
|
|
* A db flag records the fact that at least some block files have been pruned. |
|
|
|
|
* |
|
|
|
|
* @param[out] setFilesToPrune The set of file indices that can be unlinked will be returned |
|
|
|
|
*/ |
|
|
|
|
static void FindFilesToPrune(std::set<int>& setFilesToPrune, uint64_t nPruneAfterHeight) |
|
|
|
|
{ |
|
|
|
|
LOCK2(cs_main, cs_LastBlockFile); |
|
|
|
|
if (chainActive.Tip() == NULL || nPruneTarget == 0) { |
|
|
|
@ -3234,7 +3263,7 @@ bool CheckDiskSpace(uint64_t nAdditionalBytes)
@@ -3234,7 +3263,7 @@ bool CheckDiskSpace(uint64_t nAdditionalBytes)
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) |
|
|
|
|
static FILE* OpenDiskFile(const CDiskBlockPos &pos, const char *prefix, bool fReadOnly) |
|
|
|
|
{ |
|
|
|
|
if (pos.IsNull()) |
|
|
|
|
return NULL; |
|
|
|
@ -3261,7 +3290,8 @@ FILE* OpenBlockFile(const CDiskBlockPos &pos, bool fReadOnly) {
@@ -3261,7 +3290,8 @@ FILE* OpenBlockFile(const CDiskBlockPos &pos, bool fReadOnly) {
|
|
|
|
|
return OpenDiskFile(pos, "blk", fReadOnly); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly) { |
|
|
|
|
/** Open an undo file (rev?????.dat) */ |
|
|
|
|
static FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly) { |
|
|
|
|
return OpenDiskFile(pos, "rev", fReadOnly); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -3533,7 +3563,7 @@ bool RewindBlockIndex(const CChainParams& params)
@@ -3533,7 +3563,7 @@ bool RewindBlockIndex(const CChainParams& params)
|
|
|
|
|
return error("RewindBlockIndex: unable to disconnect block at height %i", pindex->nHeight); |
|
|
|
|
} |
|
|
|
|
// Occasionally flush state to disk.
|
|
|
|
|
if (!FlushStateToDisk(state, FLUSH_STATE_PERIODIC)) |
|
|
|
|
if (!FlushStateToDisk(params, state, FLUSH_STATE_PERIODIC)) |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -3582,7 +3612,7 @@ bool RewindBlockIndex(const CChainParams& params)
@@ -3582,7 +3612,7 @@ bool RewindBlockIndex(const CChainParams& params)
|
|
|
|
|
|
|
|
|
|
CheckBlockIndex(params.GetConsensus()); |
|
|
|
|
|
|
|
|
|
if (!FlushStateToDisk(state, FLUSH_STATE_ALWAYS)) { |
|
|
|
|
if (!FlushStateToDisk(params, state, FLUSH_STATE_ALWAYS)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -3655,7 +3685,7 @@ bool InitBlockIndex(const CChainParams& chainparams)
@@ -3655,7 +3685,7 @@ bool InitBlockIndex(const CChainParams& chainparams)
|
|
|
|
|
if (!ReceivedBlockTransactions(block, state, pindex, blockPos, chainparams.GetConsensus())) |
|
|
|
|
return error("LoadBlockIndex(): genesis block not accepted"); |
|
|
|
|
// Force a chainstate write so that when we VerifyDB in a moment, it doesn't check stale data
|
|
|
|
|
return FlushStateToDisk(state, FLUSH_STATE_ALWAYS); |
|
|
|
|
return FlushStateToDisk(chainparams, state, FLUSH_STATE_ALWAYS); |
|
|
|
|
} catch (const std::runtime_error& e) { |
|
|
|
|
return error("LoadBlockIndex(): failed to initialize block database: %s", e.what()); |
|
|
|
|
} |
|
|
|
@ -3997,6 +4027,7 @@ static const uint64_t MEMPOOL_DUMP_VERSION = 1;
@@ -3997,6 +4027,7 @@ static const uint64_t MEMPOOL_DUMP_VERSION = 1;
|
|
|
|
|
|
|
|
|
|
bool LoadMempool(void) |
|
|
|
|
{ |
|
|
|
|
const CChainParams& chainparams = Params(); |
|
|
|
|
int64_t nExpiryTimeout = GetArg("-mempoolexpiry", DEFAULT_MEMPOOL_EXPIRY) * 60 * 60; |
|
|
|
|
FILE* filestr = fsbridge::fopen(GetDataDir() / "mempool.dat", "rb"); |
|
|
|
|
CAutoFile file(filestr, SER_DISK, CLIENT_VERSION); |
|
|
|
@ -4033,7 +4064,7 @@ bool LoadMempool(void)
@@ -4033,7 +4064,7 @@ bool LoadMempool(void)
|
|
|
|
|
CValidationState state; |
|
|
|
|
if (nTime + nExpiryTimeout > nNow) { |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
AcceptToMemoryPoolWithTime(mempool, state, tx, true, NULL, nTime); |
|
|
|
|
AcceptToMemoryPoolWithTime(chainparams, mempool, state, tx, true, NULL, nTime, NULL, false, 0); |
|
|
|
|
if (state.IsValid()) { |
|
|
|
|
++count; |
|
|
|
|
} else { |
|
|
|
|