Relay compact block messages prior to full block connection
This commit is contained in:
parent
6987219577
commit
c802092142
2 changed files with 34 additions and 0 deletions
|
@ -752,6 +752,39 @@ void PeerLogicValidation::SyncTransaction(const CTransaction& tx, const CBlockIn
|
|||
}
|
||||
}
|
||||
|
||||
void PeerLogicValidation::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock) {
|
||||
CBlockHeaderAndShortTxIDs cmpctblock(*pblock, true);
|
||||
CNetMsgMaker msgMaker(PROTOCOL_VERSION);
|
||||
|
||||
LOCK(cs_main);
|
||||
|
||||
static int nHighestFastAnnounce = 0;
|
||||
if (pindex->nHeight <= nHighestFastAnnounce)
|
||||
return;
|
||||
nHighestFastAnnounce = pindex->nHeight;
|
||||
|
||||
bool fWitnessEnabled = IsWitnessEnabled(pindex->pprev, Params().GetConsensus());
|
||||
uint256 hashBlock(pblock->GetHash());
|
||||
|
||||
connman->ForEachNode([this, &cmpctblock, pindex, &msgMaker, fWitnessEnabled, &hashBlock](CNode* pnode) {
|
||||
// TODO: Avoid the repeated-serialization here
|
||||
if (pnode->nVersion < INVALID_CB_NO_BAN_VERSION || pnode->fDisconnect)
|
||||
return;
|
||||
ProcessBlockAvailability(pnode->GetId());
|
||||
CNodeState &state = *State(pnode->GetId());
|
||||
// If the peer has, or we announced to them the previous block already,
|
||||
// but we don't think they have this one, go ahead and announce it
|
||||
if (state.fPreferHeaderAndIDs && (!fWitnessEnabled || state.fWantsCmpctWitness) &&
|
||||
!PeerHasHeader(&state, pindex) && PeerHasHeader(&state, pindex->pprev)) {
|
||||
|
||||
LogPrint("net", "%s sending header-and-ids %s to peer %d\n", "PeerLogicValidation::NewPoWValidBlock",
|
||||
hashBlock.ToString(), pnode->id);
|
||||
connman->PushMessage(pnode, msgMaker.Make(NetMsgType::CMPCTBLOCK, cmpctblock));
|
||||
state.pindexBestHeaderSent = pindex;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
|
||||
const int nNewHeight = pindexNew->nHeight;
|
||||
connman->SetBestHeight(nNewHeight);
|
||||
|
|
|
@ -24,6 +24,7 @@ public:
|
|||
virtual void SyncTransaction(const CTransaction& tx, const CBlockIndex* pindex, int nPosInBlock);
|
||||
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload);
|
||||
virtual void BlockChecked(const CBlock& block, const CValidationState& state);
|
||||
virtual void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock);
|
||||
};
|
||||
|
||||
struct CNodeStateStats {
|
||||
|
|
Loading…
Reference in a new issue