mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
fix: GetHeadersLimit is used for getheaders(2) and headers(2), refactor it to accept compressed
instead of msg_type
This commit is contained in:
parent
b224f3f6ca
commit
a6bbaacfaa
@ -1039,9 +1039,9 @@ static bool IsLimitedPeer(const Peer& peer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Get maximum number of headers that can be included in one batch */
|
/** Get maximum number of headers that can be included in one batch */
|
||||||
static uint16_t GetHeadersLimit(const CNode& pfrom, const std::string& msg_type)
|
static uint16_t GetHeadersLimit(const CNode& pfrom, bool compressed)
|
||||||
{
|
{
|
||||||
if (pfrom.GetCommonVersion() >= INCREASE_MAX_HEADERS2_VERSION && msg_type == NetMsgType::GETHEADERS2) {
|
if (pfrom.GetCommonVersion() >= INCREASE_MAX_HEADERS2_VERSION && compressed) {
|
||||||
return MAX_HEADERS_COMPRESSED_RESULT;
|
return MAX_HEADERS_COMPRESSED_RESULT;
|
||||||
}
|
}
|
||||||
return MAX_HEADERS_UNCOMPRESSED_RESULT;
|
return MAX_HEADERS_UNCOMPRESSED_RESULT;
|
||||||
@ -2961,8 +2961,9 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, Peer& peer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Consider fetching more headers.
|
// Consider fetching more headers.
|
||||||
std::string msg_type = UsesCompressedHeaders(peer) ? NetMsgType::GETHEADERS2 : NetMsgType::GETHEADERS;
|
const bool uses_compressed = UsesCompressedHeaders(peer);
|
||||||
if (nCount == GetHeadersLimit(pfrom, msg_type)) {
|
const std::string msg_type = uses_compressed ? NetMsgType::GETHEADERS2 : NetMsgType::GETHEADERS;
|
||||||
|
if (nCount == GetHeadersLimit(pfrom, uses_compressed)) {
|
||||||
// Headers message had its maximum size; the peer may have more headers.
|
// Headers message had its maximum size; the peer may have more headers.
|
||||||
if (MaybeSendGetHeaders(pfrom, msg_type, m_chainman.ActiveChain().GetLocator(pindexLast), peer)) {
|
if (MaybeSendGetHeaders(pfrom, msg_type, m_chainman.ActiveChain().GetLocator(pindexLast), peer)) {
|
||||||
LogPrint(BCLog::NET, "more %s (%d) to end to peer=%d (startheight:%d)\n",
|
LogPrint(BCLog::NET, "more %s (%d) to end to peer=%d (startheight:%d)\n",
|
||||||
@ -2970,7 +2971,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, Peer& peer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdatePeerStateForReceivedHeaders(pfrom, pindexLast, received_new_header, nCount == GetHeadersLimit(pfrom, msg_type));
|
UpdatePeerStateForReceivedHeaders(pfrom, pindexLast, received_new_header, nCount == GetHeadersLimit(pfrom, uses_compressed));
|
||||||
|
|
||||||
// Consider immediately downloading blocks.
|
// Consider immediately downloading blocks.
|
||||||
HeadersDirectFetchBlocks(pfrom, peer, pindexLast);
|
HeadersDirectFetchBlocks(pfrom, peer, pindexLast);
|
||||||
@ -4064,8 +4065,8 @@ void PeerManagerImpl::ProcessMessage(
|
|||||||
pindex = m_chainman.ActiveChain().Next(pindex);
|
pindex = m_chainman.ActiveChain().Next(pindex);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto send_headers = [this /* for m_connman */, &hashStop, &pindex, &nodestate, &pfrom, &msgMaker](auto msg_type, auto& v_headers, auto callback) {
|
const auto send_headers = [this /* for m_connman */, &hashStop, &pindex, &nodestate, &pfrom, &msgMaker](auto msg_type_internal, auto& v_headers, auto callback) {
|
||||||
int nLimit = GetHeadersLimit(pfrom, msg_type);
|
int nLimit = GetHeadersLimit(pfrom, msg_type_internal == NetMsgType::HEADERS2);
|
||||||
for (; pindex; pindex = m_chainman.ActiveChain().Next(pindex)) {
|
for (; pindex; pindex = m_chainman.ActiveChain().Next(pindex)) {
|
||||||
v_headers.push_back(callback(pindex));
|
v_headers.push_back(callback(pindex));
|
||||||
|
|
||||||
@ -4085,7 +4086,7 @@ void PeerManagerImpl::ProcessMessage(
|
|||||||
// will re-announce the new block via headers (or compact blocks again)
|
// will re-announce the new block via headers (or compact blocks again)
|
||||||
// in the SendMessages logic.
|
// in the SendMessages logic.
|
||||||
nodestate->pindexBestHeaderSent = pindex ? pindex : m_chainman.ActiveChain().Tip();
|
nodestate->pindexBestHeaderSent = pindex ? pindex : m_chainman.ActiveChain().Tip();
|
||||||
m_connman.PushMessage(&pfrom, msgMaker.Make(msg_type, v_headers));
|
m_connman.PushMessage(&pfrom, msgMaker.Make(msg_type_internal, v_headers));
|
||||||
};
|
};
|
||||||
|
|
||||||
LogPrint(BCLog::NET, "%s %d to %s from peer=%d\n", msg_type, (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom.GetId());
|
LogPrint(BCLog::NET, "%s %d to %s from peer=%d\n", msg_type, (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom.GetId());
|
||||||
@ -4573,7 +4574,7 @@ void PeerManagerImpl::ProcessMessage(
|
|||||||
|
|
||||||
// Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
|
// Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
|
||||||
unsigned int nCount = ReadCompactSize(vRecv);
|
unsigned int nCount = ReadCompactSize(vRecv);
|
||||||
if (nCount > GetHeadersLimit(pfrom, msg_type)) {
|
if (nCount > GetHeadersLimit(pfrom, msg_type == NetMsgType::HEADERS2)) {
|
||||||
Misbehaving(pfrom.GetId(), 20, strprintf("headers message size = %u", nCount));
|
Misbehaving(pfrom.GetId(), 20, strprintf("headers message size = %u", nCount));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user