|
|
@ -4803,10 +4803,16 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam |
|
|
|
pfrom->PushMessage(NetMsgType::BLOCK, block); |
|
|
|
pfrom->PushMessage(NetMsgType::BLOCK, block); |
|
|
|
else if (inv.type == MSG_FILTERED_BLOCK) |
|
|
|
else if (inv.type == MSG_FILTERED_BLOCK) |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(pfrom->cs_filter); |
|
|
|
bool send = false; |
|
|
|
if (pfrom->pfilter) |
|
|
|
CMerkleBlock merkleBlock; |
|
|
|
{ |
|
|
|
{ |
|
|
|
CMerkleBlock merkleBlock(block, *pfrom->pfilter); |
|
|
|
LOCK(pfrom->cs_filter); |
|
|
|
|
|
|
|
if (pfrom->pfilter) { |
|
|
|
|
|
|
|
send = true; |
|
|
|
|
|
|
|
merkleBlock = CMerkleBlock(block, *pfrom->pfilter); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (send) { |
|
|
|
pfrom->PushMessage(NetMsgType::MERKLEBLOCK, merkleBlock); |
|
|
|
pfrom->PushMessage(NetMsgType::MERKLEBLOCK, merkleBlock); |
|
|
|
// CMerkleBlock just contains hashes, so also push any transactions in the block the client did not see
|
|
|
|
// CMerkleBlock just contains hashes, so also push any transactions in the block the client did not see
|
|
|
|
// This avoids hurting performance by pointlessly requiring a round-trip
|
|
|
|
// This avoids hurting performance by pointlessly requiring a round-trip
|
|
|
@ -6074,8 +6080,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, |
|
|
|
CBloomFilter filter; |
|
|
|
CBloomFilter filter; |
|
|
|
vRecv >> filter; |
|
|
|
vRecv >> filter; |
|
|
|
|
|
|
|
|
|
|
|
LOCK(pfrom->cs_filter); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!filter.IsWithinSizeConstraints()) |
|
|
|
if (!filter.IsWithinSizeConstraints()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// There is no excuse for sending a too-large filter
|
|
|
|
// There is no excuse for sending a too-large filter
|
|
|
@ -6084,12 +6088,13 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
LOCK(pfrom->cs_filter); |
|
|
|
delete pfrom->pfilter; |
|
|
|
delete pfrom->pfilter; |
|
|
|
pfrom->pfilter = new CBloomFilter(filter); |
|
|
|
pfrom->pfilter = new CBloomFilter(filter); |
|
|
|
pfrom->pfilter->UpdateEmptyFull(); |
|
|
|
pfrom->pfilter->UpdateEmptyFull(); |
|
|
|
} |
|
|
|
|
|
|
|
pfrom->fRelayTxes = true; |
|
|
|
pfrom->fRelayTxes = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else if (strCommand == NetMsgType::FILTERADD) |
|
|
|
else if (strCommand == NetMsgType::FILTERADD) |
|
|
@ -6099,21 +6104,22 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, |
|
|
|
|
|
|
|
|
|
|
|
// Nodes must NEVER send a data item > 520 bytes (the max size for a script data object,
|
|
|
|
// Nodes must NEVER send a data item > 520 bytes (the max size for a script data object,
|
|
|
|
// and thus, the maximum size any matched object can have) in a filteradd message
|
|
|
|
// and thus, the maximum size any matched object can have) in a filteradd message
|
|
|
|
if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) |
|
|
|
bool bad = false; |
|
|
|
{ |
|
|
|
if (vData.size() > MAX_SCRIPT_ELEMENT_SIZE) { |
|
|
|
LOCK(cs_main); |
|
|
|
bad = true; |
|
|
|
Misbehaving(pfrom->GetId(), 100); |
|
|
|
|
|
|
|
} else { |
|
|
|
} else { |
|
|
|
LOCK(pfrom->cs_filter); |
|
|
|
LOCK(pfrom->cs_filter); |
|
|
|
if (pfrom->pfilter) |
|
|
|
if (pfrom->pfilter) { |
|
|
|
pfrom->pfilter->insert(vData); |
|
|
|
pfrom->pfilter->insert(vData); |
|
|
|
else |
|
|
|
} else { |
|
|
|
{ |
|
|
|
bad = true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (bad) { |
|
|
|
LOCK(cs_main); |
|
|
|
LOCK(cs_main); |
|
|
|
Misbehaving(pfrom->GetId(), 100); |
|
|
|
Misbehaving(pfrom->GetId(), 100); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else if (strCommand == NetMsgType::FILTERCLEAR) |
|
|
|
else if (strCommand == NetMsgType::FILTERCLEAR) |
|
|
|