|
|
|
@ -5084,6 +5084,13 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5084,6 +5084,13 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// If we already know the last header in the message, then it contains
|
|
|
|
|
// no new information for us. In this case, we do not request
|
|
|
|
|
// more headers later. This prevents multiple chains of redundant
|
|
|
|
|
// getheader requests from running in parallel if triggered by incoming
|
|
|
|
|
// blocks while the node is still in initial headers sync.
|
|
|
|
|
const bool hasNewHeaders = (mapBlockIndex.count(headers.back().GetHash()) == 0); |
|
|
|
|
|
|
|
|
|
CBlockIndex *pindexLast = NULL; |
|
|
|
|
BOOST_FOREACH(const CBlockHeader& header, headers) { |
|
|
|
|
CValidationState state; |
|
|
|
@ -5104,7 +5111,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5104,7 +5111,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
if (pindexLast) |
|
|
|
|
UpdateBlockAvailability(pfrom->GetId(), pindexLast->GetBlockHash()); |
|
|
|
|
|
|
|
|
|
if (nCount == MAX_HEADERS_RESULTS && pindexLast) { |
|
|
|
|
if (nCount == MAX_HEADERS_RESULTS && pindexLast && hasNewHeaders) { |
|
|
|
|
// Headers message had its maximum size; the peer may have more headers.
|
|
|
|
|
// TODO: optimize: if pindexLast is an ancestor of chainActive.Tip or pindexBestHeader, continue
|
|
|
|
|
// from there instead.
|
|
|
|
|