@ -186,8 +186,11 @@ enum FlushStateMode {
} ;
} ;
// See definition for documentation
// See definition for documentation
bool static FlushStateToDisk ( CValidationState & state , FlushStateMode mode , int nManualPruneHeight = 0 ) ;
static bool FlushStateToDisk ( const CChainParams & chainParams , CValidationState & state , FlushStateMode mode , int nManualPruneHeight = 0 ) ;
void FindFilesToPruneManual ( std : : set < int > & setFilesToPrune , int nManualPruneHeight ) ;
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 )
bool CheckFinalTx ( const CTransaction & tx , int flags )
{
{
@ -309,7 +312,7 @@ bool CheckSequenceLocks(const CTransaction &tx, int flags, LockPoints* lp, bool
return EvaluateSequenceLocks ( index , lockPair ) ;
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 ) ;
int expired = pool . Expire ( GetTime ( ) - age ) ;
if ( expired ! = 0 ) {
if ( expired ! = 0 ) {
LogPrint ( BCLog : : MEMPOOL , " Expired %i transactions from the memory pool \n " , expired ) ;
LogPrint ( BCLog : : MEMPOOL , " Expired %i transactions from the memory pool \n " , expired ) ;
@ -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 ) ;
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 * pfMissingInputs , int64_t nAcceptTime , std : : list < CTransactionRef > * plTxnReplaced ,
bool fOverrideMempoolLimit , const CAmount & nAbsurdFee , std : : vector < COutPoint > & coins_to_uncache )
bool fOverrideMempoolLimit , const CAmount & nAbsurdFee , std : : vector < COutPoint > & coins_to_uncache )
{
{
@ -410,7 +413,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
return state . DoS ( 100 , false , REJECT_INVALID , " coinbase " ) ;
return state . DoS ( 100 , false , REJECT_INVALID , " coinbase " ) ;
// Reject transactions with witness before segregated witness activates (override with -prematurewitness)
// 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 ) {
if ( ! GetBoolArg ( " -prematurewitness " , false ) & & tx . HasWitness ( ) & & ! witnessEnabled ) {
return state . DoS ( 0 , false , REJECT_NONSTANDARD , " no-witness-yet " , true ) ;
return state . DoS ( 0 , false , REJECT_NONSTANDARD , " no-witness-yet " , true ) ;
}
}
@ -739,7 +742,7 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
}
}
unsigned int scriptVerifyFlags = STANDARD_SCRIPT_VERIFY_FLAGS ;
unsigned int scriptVerifyFlags = STANDARD_SCRIPT_VERIFY_FLAGS ;
if ( ! Params ( ) . RequireStandard ( ) ) {
if ( ! chainparams . RequireStandard ( ) ) {
scriptVerifyFlags = GetArg ( " -promiscuousmempoolflags " , scriptVerifyFlags ) ;
scriptVerifyFlags = GetArg ( " -promiscuousmempoolflags " , scriptVerifyFlags ) ;
}
}
@ -809,19 +812,20 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C
return true ;
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 * pfMissingInputs , int64_t nAcceptTime , std : : list < CTransactionRef > * plTxnReplaced ,
bool fOverrideMempoolLimit , const CAmount nAbsurdFee )
bool fOverrideMempoolLimit , const CAmount nAbsurdFee )
{
{
std : : vector < COutPoint > coins_to_uncache ;
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 ) {
if ( ! res ) {
BOOST_FOREACH ( const COutPoint & hashTx , coins_to_uncache )
BOOST_FOREACH ( const COutPoint & hashTx , coins_to_uncache )
pcoinsTip - > Uncache ( hashTx ) ;
pcoinsTip - > Uncache ( hashTx ) ;
}
}
// After we've (potentially) uncached entries, ensure our coins cache is still within its size limits
// After we've (potentially) uncached entries, ensure our coins cache is still within its size limits
CValidationState stateDummy ;
CValidationState stateDummy ;
FlushStateToDisk ( stateDummy , FLUSH_STATE_PERIODIC ) ;
FlushStateToDisk ( chainparams , stateDummy , FLUSH_STATE_PERIODIC ) ;
return res ;
return res ;
}
}
@ -829,7 +833,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
bool * pfMissingInputs , std : : list < CTransactionRef > * plTxnReplaced ,
bool * pfMissingInputs , std : : list < CTransactionRef > * plTxnReplaced ,
bool fOverrideMempoolLimit , const CAmount nAbsurdFee )
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 */
/** 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
// CBlock and CBlockIndex
// 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
// Open history file to append
CAutoFile fileout ( OpenBlockFile ( pos ) , SER_DISK , CLIENT_VERSION ) ;
CAutoFile fileout ( OpenBlockFile ( pos ) , SER_DISK , CLIENT_VERSION ) ;
@ -1011,7 +1016,7 @@ static void AlertNotify(const std::string& strMessage)
boost : : thread t ( runCommand , strCmd ) ; // thread runs free
boost : : thread t ( runCommand , strCmd ) ; // thread runs free
}
}
void CheckForkWarningConditions ( )
static void CheckForkWarningConditions ( )
{
{
AssertLockHeld ( cs_main ) ;
AssertLockHeld ( cs_main ) ;
// Before we get past initial download, we cannot reliably alert about forks
// Before we get past initial download, we cannot reliably alert about forks
@ -1052,7 +1057,7 @@ void CheckForkWarningConditions()
}
}
}
}
void CheckForkWarningConditionsOnNewFork ( CBlockIndex * pindexNewForkTip )
static void CheckForkWarningConditionsOnNewFork ( CBlockIndex * pindexNewForkTip )
{
{
AssertLockHeld ( cs_main ) ;
AssertLockHeld ( cs_main ) ;
// If we are on a fork that is sufficiently large, set a warning flag
// If we are on a fork that is sufficiently large, set a warning flag
@ -1144,7 +1149,12 @@ int GetSpendHeight(const CCoinsViewCache& inputs)
return pindexPrev - > nHeight + 1 ;
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 ( ) )
if ( ! tx . IsCoinBase ( ) )
{
{
@ -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 ) ;
static CCheckQueue < CScriptCheck > scriptcheckqueue ( 128 ) ;
@ -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 ,
* 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 .
* 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 ( ) ;
int64_t nMempoolUsage = mempool . DynamicMemoryUsage ( ) ;
const CChainParams & chainparams = Params ( ) ;
LOCK2 ( cs_main , cs_LastBlockFile ) ;
LOCK2 ( cs_main , cs_LastBlockFile ) ;
static int64_t nLastWrite = 0 ;
static int64_t nLastWrite = 0 ;
static int64_t nLastFlush = 0 ;
static int64_t nLastFlush = 0 ;
@ -1836,13 +1845,15 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode, int n
void FlushStateToDisk ( ) {
void FlushStateToDisk ( ) {
CValidationState state ;
CValidationState state ;
FlushStateToDisk ( state , FLUSH_STATE_ALWAYS ) ;
const CChainParams & chainparams = Params ( ) ;
FlushStateToDisk ( chainparams , state , FLUSH_STATE_ALWAYS ) ;
}
}
void PruneAndFlush ( ) {
void PruneAndFlush ( ) {
CValidationState state ;
CValidationState state ;
fCheckForPruning = true ;
fCheckForPruning = true ;
FlushStateToDisk ( state , FLUSH_STATE_NONE ) ;
const CChainParams & chainparams = Params ( ) ;
FlushStateToDisk ( chainparams , state , FLUSH_STATE_NONE ) ;
}
}
static void DoWarning ( const std : : string & strWarning )
static void DoWarning ( const std : : string & strWarning )
@ -1939,7 +1950,7 @@ bool static DisconnectTip(CValidationState& state, const CChainParams& chainpara
}
}
LogPrint ( BCLog : : BENCH , " - Disconnect block: %.2fms \n " , ( GetTimeMicros ( ) - nStart ) * 0.001 ) ;
LogPrint ( BCLog : : BENCH , " - Disconnect block: %.2fms \n " , ( GetTimeMicros ( ) - nStart ) * 0.001 ) ;
// Write the chain state to disk, if necessary.
// 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 ;
return false ;
if ( disconnectpool ) {
if ( disconnectpool ) {
@ -2076,7 +2087,7 @@ bool static ConnectTip(CValidationState& state, const CChainParams& chainparams,
int64_t nTime4 = GetTimeMicros ( ) ; nTimeFlush + = nTime4 - nTime3 ;
int64_t nTime4 = GetTimeMicros ( ) ; nTimeFlush + = nTime4 - nTime3 ;
LogPrint ( BCLog : : BENCH , " - Flush: %.2fms [%.2fs] \n " , ( nTime4 - nTime3 ) * 0.001 , nTimeFlush * 0.000001 ) ;
LogPrint ( BCLog : : BENCH , " - Flush: %.2fms [%.2fs] \n " , ( nTime4 - nTime3 ) * 0.001 , nTimeFlush * 0.000001 ) ;
// Write the chain state to disk, if necessary.
// 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 ;
return false ;
int64_t nTime5 = GetTimeMicros ( ) ; nTimeChainState + = nTime5 - nTime4 ;
int64_t nTime5 = GetTimeMicros ( ) ; nTimeChainState + = nTime5 - nTime4 ;
LogPrint ( BCLog : : BENCH , " - Writing chainstate: %.2fms [%.2fs] \n " , ( nTime5 - nTime4 ) * 0.001 , nTimeChainState * 0.000001 ) ;
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,
CheckBlockIndex ( chainparams . GetConsensus ( ) ) ;
CheckBlockIndex ( chainparams . GetConsensus ( ) ) ;
// Write changes periodically to disk, after relay.
// Write changes periodically to disk, after relay.
if ( ! FlushStateToDisk ( state , FLUSH_STATE_PERIODIC ) ) {
if ( ! FlushStateToDisk ( chainparams , state , FLUSH_STATE_PERIODIC ) ) {
return false ;
return false ;
}
}
@ -2453,7 +2464,7 @@ bool ResetBlockFailureFlags(CBlockIndex *pindex) {
return true ;
return true ;
}
}
CBlockIndex * AddToBlockIndex ( const CBlockHeader & block )
static CBlockIndex * AddToBlockIndex ( const CBlockHeader & block )
{
{
// Check for duplicate
// Check for duplicate
uint256 hash = block . GetHash ( ) ;
uint256 hash = block . GetHash ( ) ;
@ -2537,7 +2548,7 @@ static bool ReceivedBlockTransactions(const CBlock &block, CValidationState& sta
return true ;
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 ) ;
LOCK ( cs_LastBlockFile ) ;
@ -2594,7 +2605,7 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd
return true ;
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 ;
pos . nFile = nFile ;
@ -2625,7 +2636,7 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne
return true ;
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
// Check proof of work matches claimed amount
if ( fCheckPOW & & ! CheckProofOfWork ( block . GetHash ( ) , block . nBits , consensusParams ) )
if ( fCheckPOW & & ! CheckProofOfWork ( block . GetHash ( ) , block . nBits , consensusParams ) )
@ -2775,7 +2786,10 @@ std::vector<unsigned char> GenerateCoinbaseCommitment(CBlock& block, const CBloc
return commitment ;
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 ) ;
assert ( pindexPrev ! = NULL ) ;
const int nHeight = pindexPrev - > nHeight + 1 ;
const int nHeight = pindexPrev - > nHeight + 1 ;
@ -2802,7 +2816,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
return true ;
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 ;
const int nHeight = pindexPrev = = NULL ? 0 : pindexPrev - > nHeight + 1 ;
@ -3026,7 +3040,7 @@ static bool AcceptBlock(const std::shared_ptr<const CBlock>& pblock, CValidation
}
}
if ( fCheckForPruning )
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 ;
return true ;
}
}
@ -3094,7 +3108,7 @@ bool TestBlockValidity(CValidationState& state, const CChainParams& chainparams,
*/
*/
/* Calculate the amount of disk space the block & undo files currently use */
/* Calculate the amount of disk space the block & undo files currently use */
uint64_t CalculateCurrentUsage ( )
static uint64_t CalculateCurrentUsage ( )
{
{
uint64_t retval = 0 ;
uint64_t retval = 0 ;
BOOST_FOREACH ( const CBlockFileInfo & file , vinfoBlockFile ) {
BOOST_FOREACH ( const CBlockFileInfo & file , vinfoBlockFile ) {
@ -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 */
/* 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 ) ;
assert ( fPruneMode & & nManualPruneHeight > 0 ) ;
@ -3172,11 +3186,26 @@ void FindFilesToPruneManual(std::set<int>& setFilesToPrune, int nManualPruneHeig
void PruneBlockFilesManual ( int nManualPruneHeight )
void PruneBlockFilesManual ( int nManualPruneHeight )
{
{
CValidationState state ;
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 ) ;
LOCK2 ( cs_main , cs_LastBlockFile ) ;
if ( chainActive . Tip ( ) = = NULL | | nPruneTarget = = 0 ) {
if ( chainActive . Tip ( ) = = NULL | | nPruneTarget = = 0 ) {
@ -3234,7 +3263,7 @@ bool CheckDiskSpace(uint64_t nAdditionalBytes)
return true ;
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 ( ) )
if ( pos . IsNull ( ) )
return NULL ;
return NULL ;
@ -3261,7 +3290,8 @@ FILE* OpenBlockFile(const CDiskBlockPos &pos, bool fReadOnly) {
return OpenDiskFile ( pos , " blk " , 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 ) ;
return OpenDiskFile ( pos , " rev " , fReadOnly ) ;
}
}
@ -3533,7 +3563,7 @@ bool RewindBlockIndex(const CChainParams& params)
return error ( " RewindBlockIndex: unable to disconnect block at height %i " , pindex - > nHeight ) ;
return error ( " RewindBlockIndex: unable to disconnect block at height %i " , pindex - > nHeight ) ;
}
}
// Occasionally flush state to disk.
// Occasionally flush state to disk.
if ( ! FlushStateToDisk ( state , FLUSH_STATE_PERIODIC ) )
if ( ! FlushStateToDisk ( params , state , FLUSH_STATE_PERIODIC ) )
return false ;
return false ;
}
}
@ -3582,7 +3612,7 @@ bool RewindBlockIndex(const CChainParams& params)
CheckBlockIndex ( params . GetConsensus ( ) ) ;
CheckBlockIndex ( params . GetConsensus ( ) ) ;
if ( ! FlushStateToDisk ( state , FLUSH_STATE_ALWAYS ) ) {
if ( ! FlushStateToDisk ( params , state , FLUSH_STATE_ALWAYS ) ) {
return false ;
return false ;
}
}
@ -3655,7 +3685,7 @@ bool InitBlockIndex(const CChainParams& chainparams)
if ( ! ReceivedBlockTransactions ( block , state , pindex , blockPos , chainparams . GetConsensus ( ) ) )
if ( ! ReceivedBlockTransactions ( block , state , pindex , blockPos , chainparams . GetConsensus ( ) ) )
return error ( " LoadBlockIndex() : genesis block not accepted " ) ;
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
// 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 ) {
} catch ( const std : : runtime_error & e ) {
return error ( " LoadBlockIndex() : failed to initialize block database : % s " , e.what()) ;
return error ( " LoadBlockIndex() : failed to initialize block database : % s " , e.what()) ;
}
}
@ -3997,6 +4027,7 @@ static const uint64_t MEMPOOL_DUMP_VERSION = 1;
bool LoadMempool ( void )
bool LoadMempool ( void )
{
{
const CChainParams & chainparams = Params ( ) ;
int64_t nExpiryTimeout = GetArg ( " -mempoolexpiry " , DEFAULT_MEMPOOL_EXPIRY ) * 60 * 60 ;
int64_t nExpiryTimeout = GetArg ( " -mempoolexpiry " , DEFAULT_MEMPOOL_EXPIRY ) * 60 * 60 ;
FILE * filestr = fsbridge : : fopen ( GetDataDir ( ) / " mempool.dat " , " rb " ) ;
FILE * filestr = fsbridge : : fopen ( GetDataDir ( ) / " mempool.dat " , " rb " ) ;
CAutoFile file ( filestr , SER_DISK , CLIENT_VERSION ) ;
CAutoFile file ( filestr , SER_DISK , CLIENT_VERSION ) ;
@ -4033,7 +4064,7 @@ bool LoadMempool(void)
CValidationState state ;
CValidationState state ;
if ( nTime + nExpiryTimeout > nNow ) {
if ( nTime + nExpiryTimeout > nNow ) {
LOCK ( cs_main ) ;
LOCK ( cs_main ) ;
AcceptToMemoryPoolWithTime ( mempool , state , tx , true , NULL , nTime ) ;
AcceptToMemoryPoolWithTime ( chainparams , mempool , state , tx , true , NULL , nTime , NULL , false , 0 ) ;
if ( state . IsValid ( ) ) {
if ( state . IsValid ( ) ) {
+ + count ;
+ + count ;
} else {
} else {