|
|
|
@ -752,6 +752,39 @@ void PeerLogicValidation::SyncTransaction(const CTransaction& tx, const CBlockIn
@@ -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); |
|
|
|
|