@ -74,53 +74,54 @@ const string strMessageMagic = "Bitcoin Signed Message:\n";
// Internal stuff
// Internal stuff
namespace {
namespace {
struct CBlockIndexWorkComparator
struct CBlockIndexWorkComparator
{
{
bool operator ( ) ( CBlockIndex * pa , CBlockIndex * pb ) {
bool operator ( ) ( CBlockIndex * pa , CBlockIndex * pb ) {
// First sort by most total work, ...
// First sort by most total work, ...
if ( pa - > nChainWork > pb - > nChainWork ) return false ;
if ( pa - > nChainWork > pb - > nChainWork ) return false ;
if ( pa - > nChainWork < pb - > nChainWork ) return true ;
if ( pa - > nChainWork < pb - > nChainWork ) return true ;
// ... then by earliest time received, ...
// ... then by earliest time received, ...
if ( pa - > nSequenceId < pb - > nSequenceId ) return false ;
if ( pa - > nSequenceId < pb - > nSequenceId ) return false ;
if ( pa - > nSequenceId > pb - > nSequenceId ) return true ;
if ( pa - > nSequenceId > pb - > nSequenceId ) return true ;
// Use pointer address as tie breaker (should only happen with blocks
// Use pointer address as tie breaker (should only happen with blocks
// loaded from disk, as those all have id 0).
// loaded from disk, as those all have id 0).
if ( pa < pb ) return false ;
if ( pa < pb ) return false ;
if ( pa > pb ) return true ;
if ( pa > pb ) return true ;
// Identical blocks.
// Identical blocks.
return false ;
return false ;
}
}
} ;
} ;
CBlockIndex * pindexBestInvalid ;
CBlockIndex * pindexBestInvalid ;
set < CBlockIndex * , CBlockIndexWorkComparator > setBlockIndexValid ; // may contain all CBlockIndex*'s that have validness >=BLOCK_VALID_TRANSACTIONS, and must contain those who aren't failed
// may contain all CBlockIndex*'s that have validness >=BLOCK_VALID_TRANSACTIONS, and must contain those who aren't failed
set < CBlockIndex * , CBlockIndexWorkComparator > setBlockIndexValid ;
CCriticalSection cs_LastBlockFile ;
CBlockFileInfo infoLastBlockFile ;
CCriticalSection cs_LastBlockFile ;
int nLastBlockFile = 0 ;
CBlockFileInfo infoLastBlockFile ;
int nLastBlockFile = 0 ;
// Every received block is assigned a unique and increasing identifier, so we
// know which one to give priority in case of a fork.
// Every received block is assigned a unique and increasing identifier, so we
CCriticalSection cs_nBlockSequenceId ;
// know which one to give priority in case of a fork.
// Blocks loaded from disk are assigned id 0, so start the counter at 1.
CCriticalSection cs_nBlockSequenceId ;
uint32_t nBlockSequenceId = 1 ;
// Blocks loaded from disk are assigned id 0, so start the counter at 1.
uint32_t nBlockSequenceId = 1 ;
// Sources of received blocks, to be able to send them reject messages or ban
// them, if processing happens afterwards. Protected by cs_main.
// Sources of received blocks, to be able to send them reject messages or ban
map < uint256 , NodeId > mapBlockSource ;
// them, if processing happens afterwards. Protected by cs_main.
map < uint256 , NodeId > mapBlockSource ;
// Blocks that are in flight, and that are in the queue to be downloaded.
// Protected by cs_main.
// Blocks that are in flight, and that are in the queue to be downloaded.
struct QueuedBlock {
// Protected by cs_main.
uint256 hash ;
struct QueuedBlock {
int64_t nTime ; // Time of "getdata" request in microseconds.
uint256 hash ;
int nQueuedBefore ; // Number of blocks in flight at the time of request.
int64_t nTime ; // Time of "getdata" request in microseconds.
} ;
int nQueuedBefore ; // Number of blocks in flight at the time of request.
map < uint256 , pair < NodeId , list < QueuedBlock > : : iterator > > mapBlocksInFlight ;
} ;
map < uint256 , pair < NodeId , list < uint256 > : : iterator > > mapBlocksToDownload ;
map < uint256 , pair < NodeId , list < QueuedBlock > : : iterator > > mapBlocksInFlight ;
map < uint256 , pair < NodeId , list < uint256 > : : iterator > > mapBlocksToDownload ;
}
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////