|
|
|
@ -6019,22 +6019,27 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -6019,22 +6019,27 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
BOOST_FOREACH(const CBlockHeader& header, headers) { |
|
|
|
|
CValidationState state; |
|
|
|
|
if (pindexLast != NULL && header.hashPrevBlock != pindexLast->GetBlockHash()) { |
|
|
|
|
uint256 hashLastBlock; |
|
|
|
|
for (const CBlockHeader& header : headers) { |
|
|
|
|
if (!hashLastBlock.IsNull() && header.hashPrevBlock != hashLastBlock) { |
|
|
|
|
Misbehaving(pfrom->GetId(), 20); |
|
|
|
|
return error("non-continuous headers sequence"); |
|
|
|
|
} |
|
|
|
|
if (!AcceptBlockHeader(header, state, chainparams, &pindexLast)) { |
|
|
|
|
int nDoS; |
|
|
|
|
if (state.IsInvalid(nDoS)) { |
|
|
|
|
if (nDoS > 0) |
|
|
|
|
Misbehaving(pfrom->GetId(), nDoS); |
|
|
|
|
return error("invalid header received"); |
|
|
|
|
hashLastBlock = header.GetHash(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
CValidationState state; |
|
|
|
|
if (!ProcessNewBlockHeaders(headers, state, chainparams, &pindexLast)) { |
|
|
|
|
int nDoS; |
|
|
|
|
if (state.IsInvalid(nDoS)) { |
|
|
|
|
if (nDoS > 0) { |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), nDoS); |
|
|
|
|
} |
|
|
|
|
return error("invalid header received"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
@ -6110,8 +6115,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -6110,8 +6115,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
NotifyHeaderTip(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if (strCommand == NetMsgType::BLOCK && !fImporting && !fReindex) // Ignore blocks received while importing
|
|
|
|
|