|
|
|
@ -401,6 +401,12 @@ void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* When a peer sends us a valid block, instruct it to announce blocks to us
|
|
|
|
|
* using CMPCTBLOCK if possible by adding its nodeid to the end of
|
|
|
|
|
* lNodesAnnouncingHeaderAndIDs, and keeping that list under a certain size by
|
|
|
|
|
* removing the first element if necessary.
|
|
|
|
|
*/
|
|
|
|
|
void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid, CConnman* connman) {
|
|
|
|
|
AssertLockHeld(cs_main);
|
|
|
|
|
CNodeState* nodestate = State(nodeid);
|
|
|
|
@ -749,7 +755,11 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans)
|
|
|
|
|
return nEvicted;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Requires cs_main.
|
|
|
|
|
/**
|
|
|
|
|
* Mark a misbehaving peer to be banned depending upon the value of `-banscore`.
|
|
|
|
|
*
|
|
|
|
|
* Requires cs_main.
|
|
|
|
|
*/
|
|
|
|
|
void Misbehaving(NodeId pnode, int howmuch, const std::string& message)
|
|
|
|
|
{
|
|
|
|
|
if (howmuch == 0)
|
|
|
|
@ -808,6 +818,10 @@ PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn, CScheduler &schedu
|
|
|
|
|
scheduler.scheduleEvery(std::bind(&PeerLogicValidation::CheckForStaleTipAndEvictPeers, this, consensusParams), 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(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex, const std::vector<CTransactionRef>& vtxConflicted) {
|
|
|
|
|
LOCK(g_cs_orphans);
|
|
|
|
|
|
|
|
|
@ -828,7 +842,7 @@ void PeerLogicValidation::BlockConnected(const std::shared_ptr<const CBlock>& pb
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Erase orphan transactions include or precluded by this block
|
|
|
|
|
// Erase orphan transactions included or precluded by this block
|
|
|
|
|
if (vOrphanErase.size()) {
|
|
|
|
|
int nErased = 0;
|
|
|
|
|
for (uint256 &orphanHash : vOrphanErase) {
|
|
|
|
@ -847,6 +861,10 @@ static std::shared_ptr<const CBlockHeaderAndShortTxIDs> most_recent_compact_bloc
|
|
|
|
|
static uint256 most_recent_block_hash;
|
|
|
|
|
static bool fWitnessesPresentInMostRecentCompactBlock;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Maintain state about the best-seen block and fast-announce a compact block
|
|
|
|
|
* to compatible peers.
|
|
|
|
|
*/
|
|
|
|
|
void PeerLogicValidation::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock) {
|
|
|
|
|
std::shared_ptr<const CBlockHeaderAndShortTxIDs> pcmpctblock = std::make_shared<const CBlockHeaderAndShortTxIDs> (*pblock, true);
|
|
|
|
|
const CNetMsgMaker msgMaker(PROTOCOL_VERSION);
|
|
|
|
@ -888,6 +906,10 @@ void PeerLogicValidation::NewPoWValidBlock(const CBlockIndex *pindex, const std:
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update our best height and announce any block hashes which weren't previously
|
|
|
|
|
* in chainActive to our peers.
|
|
|
|
|
*/
|
|
|
|
|
void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
|
|
|
|
|
const int nNewHeight = pindexNew->nHeight;
|
|
|
|
|
connman->SetBestHeight(nNewHeight);
|
|
|
|
@ -920,6 +942,10 @@ void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CB
|
|
|
|
|
nTimeBestReceived = GetTime();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Handle invalid block rejection and consequent peer banning, maintain which
|
|
|
|
|
* peers announce compact blocks.
|
|
|
|
|
*/
|
|
|
|
|
void PeerLogicValidation::BlockChecked(const CBlock& block, const CValidationState& state) {
|
|
|
|
|
LOCK(cs_main);
|
|
|
|
|
|
|
|
|
|