|
|
|
@ -2922,14 +2922,15 @@ static void NotifyHeaderTip() {
@@ -2922,14 +2922,15 @@ static void NotifyHeaderTip() {
|
|
|
|
|
*/ |
|
|
|
|
bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, const CBlock *pblock) { |
|
|
|
|
CBlockIndex *pindexMostWork = NULL; |
|
|
|
|
CBlockIndex *pindexNewTip = NULL; |
|
|
|
|
do { |
|
|
|
|
boost::this_thread::interruption_point(); |
|
|
|
|
if (ShutdownRequested()) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
CBlockIndex *pindexNewTip = NULL; |
|
|
|
|
const CBlockIndex *pindexFork; |
|
|
|
|
bool fInitialDownload; |
|
|
|
|
int nNewHeight; |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
CBlockIndex *pindexOldTip = chainActive.Tip(); |
|
|
|
@ -2952,6 +2953,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
@@ -2952,6 +2953,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
|
|
|
|
|
pindexNewTip = chainActive.Tip(); |
|
|
|
|
pindexFork = chainActive.FindFork(pindexOldTip); |
|
|
|
|
fInitialDownload = IsInitialBlockDownload(); |
|
|
|
|
nNewHeight = chainActive.Height(); |
|
|
|
|
} |
|
|
|
|
// When we reach this point, we switched to a new tip (stored in pindexNewTip).
|
|
|
|
|
|
|
|
|
@ -2980,7 +2982,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
@@ -2980,7 +2982,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
|
|
|
|
|
{ |
|
|
|
|
LOCK(cs_vNodes); |
|
|
|
|
BOOST_FOREACH(CNode* pnode, vNodes) { |
|
|
|
|
if (chainActive.Height() > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) { |
|
|
|
|
if (nNewHeight > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) { |
|
|
|
|
BOOST_REVERSE_FOREACH(const uint256& hash, vHashes) { |
|
|
|
|
pnode->PushBlockHash(hash); |
|
|
|
|
} |
|
|
|
@ -2993,7 +2995,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
@@ -2993,7 +2995,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} while(pindexMostWork != chainActive.Tip()); |
|
|
|
|
} while (pindexNewTip != pindexMostWork); |
|
|
|
|
CheckBlockIndex(chainparams.GetConsensus()); |
|
|
|
|
|
|
|
|
|
// Write changes periodically to disk, after relay.
|
|
|
|
@ -4569,6 +4571,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -4569,6 +4571,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
strCommand == NetMsgType::FILTERCLEAR)) |
|
|
|
|
{ |
|
|
|
|
if (pfrom->nVersion >= NO_BLOOM_VERSION) { |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 100); |
|
|
|
|
return false; |
|
|
|
|
} else { |
|
|
|
@ -4584,6 +4587,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -4584,6 +4587,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
if (pfrom->nVersion != 0) |
|
|
|
|
{ |
|
|
|
|
pfrom->PushMessage(NetMsgType::REJECT, strCommand, REJECT_DUPLICATE, string("Duplicate version message")); |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 1); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
@ -4643,7 +4647,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -4643,7 +4647,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
pfrom->fClient = !(pfrom->nServices & NODE_NETWORK); |
|
|
|
|
|
|
|
|
|
// Potentially mark this peer as a preferred download peer.
|
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
UpdatePreferredDownload(pfrom, State(pfrom->GetId())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Change version
|
|
|
|
|
pfrom->PushMessage(NetMsgType::VERACK); |
|
|
|
@ -4701,6 +4708,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -4701,6 +4708,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
else if (pfrom->nVersion == 0) |
|
|
|
|
{ |
|
|
|
|
// Must have a version message before anything else
|
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 1); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
@ -4736,6 +4744,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -4736,6 +4744,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
return true; |
|
|
|
|
if (vAddr.size() > 1000) |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 20); |
|
|
|
|
return error("message addr size() = %u", vAddr.size()); |
|
|
|
|
} |
|
|
|
@ -4803,6 +4812,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -4803,6 +4812,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
vRecv >> vInv; |
|
|
|
|
if (vInv.size() > MAX_INV_SZ) |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 20); |
|
|
|
|
return error("message inv size() = %u", vInv.size()); |
|
|
|
|
} |
|
|
|
@ -4878,6 +4888,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -4878,6 +4888,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
vRecv >> vInv; |
|
|
|
|
if (vInv.size() > MAX_INV_SZ) |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 20); |
|
|
|
|
return error("message getdata size() = %u", vInv.size()); |
|
|
|
|
} |
|
|
|
@ -5129,6 +5140,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5129,6 +5140,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
// Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
|
|
|
|
|
unsigned int nCount = ReadCompactSize(vRecv); |
|
|
|
|
if (nCount > MAX_HEADERS_RESULTS) { |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 20); |
|
|
|
|
return error("headers message size = %u", nCount); |
|
|
|
|
} |
|
|
|
@ -5390,8 +5402,11 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5390,8 +5402,11 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
LOCK(pfrom->cs_filter); |
|
|
|
|
|
|
|
|
|
if (!filter.IsWithinSizeConstraints()) |
|
|
|
|
{ |
|
|
|
|
// There is no excuse for sending a too-large filter
|
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 100); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
delete pfrom->pfilter; |
|
|
|
@ -5411,13 +5426,17 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
@@ -5411,13 +5426,17 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|
|
|
|
// and thus, the maximum size any matched object can have) in a filteradd message
|
|
|
|
|
if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 100); |
|
|
|
|
} else { |
|
|
|
|
LOCK(pfrom->cs_filter); |
|
|
|
|
if (pfrom->pfilter) |
|
|
|
|
pfrom->pfilter->insert(vData); |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
LOCK(cs_main); |
|
|
|
|
Misbehaving(pfrom->GetId(), 100); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|