mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
Get our "best three" peers to announce blocks using cmpctblocks
This commit is contained in:
parent
927f8eede0
commit
2f34a2e476
29
src/main.cpp
29
src/main.cpp
@ -204,6 +204,9 @@ namespace {
|
||||
};
|
||||
map<uint256, pair<NodeId, list<QueuedBlock>::iterator> > mapBlocksInFlight;
|
||||
|
||||
/** Stack of nodes which we have set to announce using compact blocks */
|
||||
list<NodeId> lNodesAnnouncingHeaderAndIDs;
|
||||
|
||||
/** Number of preferable block download peers. */
|
||||
int nPreferredDownload = 0;
|
||||
|
||||
@ -456,6 +459,28 @@ void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) {
|
||||
}
|
||||
}
|
||||
|
||||
void MaybeSetPeerAsAnnouncingHeaderAndIDs(const CNodeState* nodestate, CNode* pfrom) {
|
||||
if (nodestate->fProvidesHeaderAndIDs) {
|
||||
BOOST_FOREACH(const NodeId nodeid, lNodesAnnouncingHeaderAndIDs)
|
||||
if (nodeid == pfrom->GetId())
|
||||
return;
|
||||
bool fAnnounceUsingCMPCTBLOCK = false;
|
||||
uint64_t nCMPCTBLOCKVersion = 1;
|
||||
if (lNodesAnnouncingHeaderAndIDs.size() >= 3) {
|
||||
// As per BIP152, we only get 3 of our peers to announce
|
||||
// blocks using compact encodings.
|
||||
CNode* pnodeStop = FindNode(lNodesAnnouncingHeaderAndIDs.front());
|
||||
if (pnodeStop) {
|
||||
pnodeStop->PushMessage(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion);
|
||||
lNodesAnnouncingHeaderAndIDs.pop_front();
|
||||
}
|
||||
}
|
||||
fAnnounceUsingCMPCTBLOCK = true;
|
||||
pfrom->PushMessage(NetMsgType::SENDCMPCT, fAnnounceUsingCMPCTBLOCK, nCMPCTBLOCKVersion);
|
||||
lNodesAnnouncingHeaderAndIDs.push_back(pfrom->GetId());
|
||||
}
|
||||
}
|
||||
|
||||
// Requires cs_main
|
||||
bool CanDirectFetch(const Consensus::Params &consensusParams)
|
||||
{
|
||||
@ -5531,6 +5556,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
||||
}
|
||||
if (vGetData.size() > 0) {
|
||||
if (nodestate->fProvidesHeaderAndIDs && vGetData.size() == 1 && mapBlocksInFlight.size() == 1 && pindexLast->pprev->IsValid(BLOCK_VALID_CHAIN)) {
|
||||
// We seem to be rather well-synced, so it appears pfrom was the first to provide us
|
||||
// with this block! Let's get them to announce using compact blocks in the future.
|
||||
MaybeSetPeerAsAnnouncingHeaderAndIDs(nodestate, pfrom);
|
||||
// In any case, we want to download using a compact block, not a regular one
|
||||
vGetData[0] = CInv(MSG_CMPCT_BLOCK, vGetData[0].hash);
|
||||
}
|
||||
pfrom->PushMessage(NetMsgType::GETDATA, vGetData);
|
||||
|
Loading…
Reference in New Issue
Block a user