|
|
@ -204,6 +204,9 @@ namespace { |
|
|
|
}; |
|
|
|
}; |
|
|
|
map<uint256, pair<NodeId, list<QueuedBlock>::iterator> > mapBlocksInFlight; |
|
|
|
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. */ |
|
|
|
/** Number of preferable block download peers. */ |
|
|
|
int nPreferredDownload = 0; |
|
|
|
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
|
|
|
|
// Requires cs_main
|
|
|
|
bool CanDirectFetch(const Consensus::Params &consensusParams) |
|
|
|
bool CanDirectFetch(const Consensus::Params &consensusParams) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -5531,6 +5556,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, |
|
|
|
} |
|
|
|
} |
|
|
|
if (vGetData.size() > 0) { |
|
|
|
if (vGetData.size() > 0) { |
|
|
|
if (nodestate->fProvidesHeaderAndIDs && vGetData.size() == 1 && mapBlocksInFlight.size() == 1 && pindexLast->pprev->IsValid(BLOCK_VALID_CHAIN)) { |
|
|
|
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); |
|
|
|
vGetData[0] = CInv(MSG_CMPCT_BLOCK, vGetData[0].hash); |
|
|
|
} |
|
|
|
} |
|
|
|
pfrom->PushMessage(NetMsgType::GETDATA, vGetData); |
|
|
|
pfrom->PushMessage(NetMsgType::GETDATA, vGetData); |
|
|
|