Changeset View
Changeset View
Standalone View
Standalone View
src/net_processing.cpp
Show First 20 Lines • Show All 974 Lines • ▼ Show 20 Lines | PeerLogicValidation::PeerLogicValidation(CConnman *connmanIn, | ||||
scheduler.scheduleEvery( | scheduler.scheduleEvery( | ||||
[this, &consensusParams]() { | [this, &consensusParams]() { | ||||
this->CheckForStaleTipAndEvictPeers(consensusParams); | this->CheckForStaleTipAndEvictPeers(consensusParams); | ||||
return true; | return true; | ||||
}, | }, | ||||
EXTRA_PEER_CHECK_INTERVAL * 1000); | EXTRA_PEER_CHECK_INTERVAL * 1000); | ||||
} | } | ||||
/** | |||||
* Evict orphan txn pool entries (EraseOrphanTx) based on a newly connected | |||||
* block. Also save the time of the last tip update. | |||||
*/ | |||||
void PeerLogicValidation::BlockConnected( | void PeerLogicValidation::BlockConnected( | ||||
const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex, | const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex, | ||||
const std::vector<CTransactionRef> &vtxConflicted) { | const std::vector<CTransactionRef> &vtxConflicted) { | ||||
LOCK(g_cs_orphans); | LOCK(g_cs_orphans); | ||||
std::vector<uint256> vOrphanErase; | std::vector<uint256> vOrphanErase; | ||||
for (const CTransactionRef &ptx : pblock->vtx) { | for (const CTransactionRef &ptx : pblock->vtx) { | ||||
Show All 10 Lines | for (const CTransactionRef &ptx : pblock->vtx) { | ||||
mi != itByPrev->second.end(); ++mi) { | mi != itByPrev->second.end(); ++mi) { | ||||
const CTransaction &orphanTx = *(*mi)->second.tx; | const CTransaction &orphanTx = *(*mi)->second.tx; | ||||
const uint256 &orphanHash = orphanTx.GetHash(); | const uint256 &orphanHash = orphanTx.GetHash(); | ||||
vOrphanErase.push_back(orphanHash); | vOrphanErase.push_back(orphanHash); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
// Erase orphan transactions include or precluded by this block | // Erase orphan transactions included or precluded by this block | ||||
if (vOrphanErase.size()) { | if (vOrphanErase.size()) { | ||||
int nErased = 0; | int nErased = 0; | ||||
for (uint256 &orphanId : vOrphanErase) { | for (uint256 &orphanId : vOrphanErase) { | ||||
nErased += EraseOrphanTx(orphanId); | nErased += EraseOrphanTx(orphanId); | ||||
} | } | ||||
LogPrint(BCLog::MEMPOOL, | LogPrint(BCLog::MEMPOOL, | ||||
"Erased %d orphan tx included or conflicted by block\n", | "Erased %d orphan tx included or conflicted by block\n", | ||||
nErased); | nErased); | ||||
} | } | ||||
g_last_tip_update = GetTime(); | g_last_tip_update = GetTime(); | ||||
} | } | ||||
// All of the following cache a recent block, and are protected by | // All of the following cache a recent block, and are protected by | ||||
// cs_most_recent_block | // cs_most_recent_block | ||||
static CCriticalSection cs_most_recent_block; | static CCriticalSection cs_most_recent_block; | ||||
static std::shared_ptr<const CBlock> | static std::shared_ptr<const CBlock> | ||||
most_recent_block GUARDED_BY(cs_most_recent_block); | most_recent_block GUARDED_BY(cs_most_recent_block); | ||||
static std::shared_ptr<const CBlockHeaderAndShortTxIDs> | static std::shared_ptr<const CBlockHeaderAndShortTxIDs> | ||||
most_recent_compact_block GUARDED_BY(cs_most_recent_block); | most_recent_compact_block GUARDED_BY(cs_most_recent_block); | ||||
static uint256 most_recent_block_hash GUARDED_BY(cs_most_recent_block); | static uint256 most_recent_block_hash GUARDED_BY(cs_most_recent_block); | ||||
/** | |||||
* Maintain state about the best-seen block and fast-announce a compact block | |||||
* to compatible peers. | |||||
*/ | |||||
void PeerLogicValidation::NewPoWValidBlock( | void PeerLogicValidation::NewPoWValidBlock( | ||||
const CBlockIndex *pindex, const std::shared_ptr<const CBlock> &pblock) { | const CBlockIndex *pindex, const std::shared_ptr<const CBlock> &pblock) { | ||||
std::shared_ptr<const CBlockHeaderAndShortTxIDs> pcmpctblock = | std::shared_ptr<const CBlockHeaderAndShortTxIDs> pcmpctblock = | ||||
std::make_shared<const CBlockHeaderAndShortTxIDs>(*pblock); | std::make_shared<const CBlockHeaderAndShortTxIDs>(*pblock); | ||||
const CNetMsgMaker msgMaker(PROTOCOL_VERSION); | const CNetMsgMaker msgMaker(PROTOCOL_VERSION); | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
Show All 32 Lines | connman->ForEachNode([this, &pcmpctblock, pindex, &msgMaker, | ||||
hashBlock.ToString(), pnode->GetId()); | hashBlock.ToString(), pnode->GetId()); | ||||
connman->PushMessage( | connman->PushMessage( | ||||
pnode, msgMaker.Make(NetMsgType::CMPCTBLOCK, *pcmpctblock)); | pnode, msgMaker.Make(NetMsgType::CMPCTBLOCK, *pcmpctblock)); | ||||
state.pindexBestHeaderSent = pindex; | state.pindexBestHeaderSent = pindex; | ||||
} | } | ||||
}); | }); | ||||
} | } | ||||
/** | |||||
* Update our best height and announce any block hashes which weren't previously | |||||
* in chainActive to our peers. | |||||
*/ | |||||
void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, | void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, | ||||
const CBlockIndex *pindexFork, | const CBlockIndex *pindexFork, | ||||
bool fInitialDownload) { | bool fInitialDownload) { | ||||
const int nNewHeight = pindexNew->nHeight; | const int nNewHeight = pindexNew->nHeight; | ||||
connman->SetBestHeight(nNewHeight); | connman->SetBestHeight(nNewHeight); | ||||
SetServiceFlagsIBDCache(!fInitialDownload); | SetServiceFlagsIBDCache(!fInitialDownload); | ||||
if (!fInitialDownload) { | if (!fInitialDownload) { | ||||
Show All 22 Lines | if (!fInitialDownload) { | ||||
} | } | ||||
}); | }); | ||||
connman->WakeMessageHandler(); | connman->WakeMessageHandler(); | ||||
} | } | ||||
nTimeBestReceived = GetTime(); | nTimeBestReceived = GetTime(); | ||||
} | } | ||||
/** | |||||
* Handle invalid block rejection and consequent peer banning, maintain which | |||||
* peers announce compact blocks. | |||||
*/ | |||||
void PeerLogicValidation::BlockChecked(const CBlock &block, | void PeerLogicValidation::BlockChecked(const CBlock &block, | ||||
const CValidationState &state) { | const CValidationState &state) { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
const uint256 hash(block.GetHash()); | const uint256 hash(block.GetHash()); | ||||
std::map<uint256, std::pair<NodeId, bool>>::iterator it = | std::map<uint256, std::pair<NodeId, bool>>::iterator it = | ||||
mapBlockSource.find(hash); | mapBlockSource.find(hash); | ||||
▲ Show 20 Lines • Show All 3,255 Lines • Show Last 20 Lines |