@ -5,40 +5,25 @@
# include <txdb.h>
# include <chain.h>
# include <coins.h>
# include <dbwrapper.h>
# include <kernel/cs_main.h>
# include <logging.h>
# include <pow.h>
# include <primitives/transaction.h>
# include <random.h>
# include <serialize.h>
# include <sync.h>
# include <uint256.h>
# include <util/signalinterrupt.h>
# include <util/translation.h>
# include <util/vector.h>
# include <cassert>
# include <cstdlib>
# include <iterator>
# include <utility>
static constexpr uint8_t DB_COIN { ' C ' } ;
static constexpr uint8_t DB_BLOCK_FILES { ' f ' } ;
static constexpr uint8_t DB_BLOCK_INDEX { ' b ' } ;
static constexpr uint8_t DB_BEST_BLOCK { ' B ' } ;
static constexpr uint8_t DB_HEAD_BLOCKS { ' H ' } ;
static constexpr uint8_t DB_FLAG { ' F ' } ;
static constexpr uint8_t DB_REINDEX_FLAG { ' R ' } ;
static constexpr uint8_t DB_LAST_BLOCK { ' l ' } ;
// Keys used in previous version that might still be found in the DB:
static constexpr uint8_t DB_COINS { ' c ' } ;
// CBlockTreeDB::DB_TXINDEX_BLOCK{'T'};
// CBlockTreeDB::DB_TXINDEX{'t'}
// CBlockTreeDB::ReadFlag("txindex")
bool CCoinsViewDB : : NeedsUpgrade ( )
{
@ -166,25 +151,6 @@ size_t CCoinsViewDB::EstimateSize() const
return m_db - > EstimateSize ( DB_COIN , uint8_t ( DB_COIN + 1 ) ) ;
}
bool CBlockTreeDB : : ReadBlockFileInfo ( int nFile , CBlockFileInfo & info ) {
return Read ( std : : make_pair ( DB_BLOCK_FILES , nFile ) , info ) ;
}
bool CBlockTreeDB : : WriteReindexing ( bool fReindexing ) {
if ( fReindexing )
return Write ( DB_REINDEX_FLAG , uint8_t { ' 1 ' } ) ;
else
return Erase ( DB_REINDEX_FLAG ) ;
}
void CBlockTreeDB : : ReadReindexing ( bool & fReindexing ) {
fReindexing = Exists ( DB_REINDEX_FLAG ) ;
}
bool CBlockTreeDB : : ReadLastBlockFile ( int & nFile ) {
return Read ( DB_LAST_BLOCK , nFile ) ;
}
/** Specialization of CCoinsViewCursor to iterate over a CCoinsViewDB */
class CCoinsViewDBCursor : public CCoinsViewCursor
{
@ -257,71 +223,3 @@ void CCoinsViewDBCursor::Next()
keyTmp . first = entry . key ;
}
}
bool CBlockTreeDB : : WriteBatchSync ( const std : : vector < std : : pair < int , const CBlockFileInfo * > > & fileInfo , int nLastFile , const std : : vector < const CBlockIndex * > & blockinfo ) {
CDBBatch batch ( * this ) ;
for ( std : : vector < std : : pair < int , const CBlockFileInfo * > > : : const_iterator it = fileInfo . begin ( ) ; it ! = fileInfo . end ( ) ; it + + ) {
batch . Write ( std : : make_pair ( DB_BLOCK_FILES , it - > first ) , * it - > second ) ;
}
batch . Write ( DB_LAST_BLOCK , nLastFile ) ;
for ( std : : vector < const CBlockIndex * > : : const_iterator it = blockinfo . begin ( ) ; it ! = blockinfo . end ( ) ; it + + ) {
batch . Write ( std : : make_pair ( DB_BLOCK_INDEX , ( * it ) - > GetBlockHash ( ) ) , CDiskBlockIndex ( * it ) ) ;
}
return WriteBatch ( batch , true ) ;
}
bool CBlockTreeDB : : WriteFlag ( const std : : string & name , bool fValue ) {
return Write ( std : : make_pair ( DB_FLAG , name ) , fValue ? uint8_t { ' 1 ' } : uint8_t { ' 0 ' } ) ;
}
bool CBlockTreeDB : : ReadFlag ( const std : : string & name , bool & fValue ) {
uint8_t ch ;
if ( ! Read ( std : : make_pair ( DB_FLAG , name ) , ch ) )
return false ;
fValue = ch = = uint8_t { ' 1 ' } ;
return true ;
}
bool CBlockTreeDB : : LoadBlockIndexGuts ( const Consensus : : Params & consensusParams , std : : function < CBlockIndex * ( const uint256 & ) > insertBlockIndex , const util : : SignalInterrupt & interrupt )
{
AssertLockHeld ( : : cs_main ) ;
std : : unique_ptr < CDBIterator > pcursor ( NewIterator ( ) ) ;
pcursor - > Seek ( std : : make_pair ( DB_BLOCK_INDEX , uint256 ( ) ) ) ;
// Load m_block_index
while ( pcursor - > Valid ( ) ) {
if ( interrupt ) return false ;
std : : pair < uint8_t , uint256 > key ;
if ( pcursor - > GetKey ( key ) & & key . first = = DB_BLOCK_INDEX ) {
CDiskBlockIndex diskindex ;
if ( pcursor - > GetValue ( diskindex ) ) {
// Construct block index object
CBlockIndex * pindexNew = insertBlockIndex ( diskindex . ConstructBlockHash ( ) ) ;
pindexNew - > pprev = insertBlockIndex ( diskindex . hashPrev ) ;
pindexNew - > nHeight = diskindex . nHeight ;
pindexNew - > nFile = diskindex . nFile ;
pindexNew - > nDataPos = diskindex . nDataPos ;
pindexNew - > nUndoPos = diskindex . nUndoPos ;
pindexNew - > nVersion = diskindex . nVersion ;
pindexNew - > hashMerkleRoot = diskindex . hashMerkleRoot ;
pindexNew - > nTime = diskindex . nTime ;
pindexNew - > nBits = diskindex . nBits ;
pindexNew - > nNonce = diskindex . nNonce ;
pindexNew - > nStatus = diskindex . nStatus ;
pindexNew - > nTx = diskindex . nTx ;
if ( ! CheckProofOfWork ( pindexNew - > GetBlockHash ( ) , pindexNew - > nBits , consensusParams ) ) {
return error ( " %s: CheckProofOfWork failed: %s " , __func__ , pindexNew - > ToString ( ) ) ;
}
pcursor - > Next ( ) ;
} else {
return error ( " %s: failed to read value " , __func__ ) ;
}
} else {
break ;
}
}
return true ;
}