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) {
|
void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
|
||||||
const int nNewHeight = pindexNew->nHeight;
|
const int nNewHeight = pindexNew->nHeight;
|
||||||
connman->SetBestHeight(nNewHeight);
|
connman->SetBestHeight(nNewHeight);
|
||||||
|
|
|
@ -24,6 +24,7 @@ public:
|
||||||
virtual void SyncTransaction(const CTransaction& tx, const CBlockIndex* pindex, int nPosInBlock);
|
virtual void SyncTransaction(const CTransaction& tx, const CBlockIndex* pindex, int nPosInBlock);
|
||||||
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload);
|
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload);
|
||||||
virtual void BlockChecked(const CBlock& block, const CValidationState& state);
|
virtual void BlockChecked(const CBlock& block, const CValidationState& state);
|
||||||
|
virtual void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& pblock);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CNodeStateStats {
|
struct CNodeStateStats {
|
||||||
|
|
Loading…
Reference in a new issue