From 1c6b787e0319c44f0e0bede3f4a77ac7c2089db2 Mon Sep 17 00:00:00 2001 From: gzhao408 Date: Wed, 3 Jun 2020 16:28:43 -0700 Subject: [PATCH 1/3] [netprocessing] disconnect node that sends filterclear -nodes not serving bloomfilters should disconnect peers that send filterclear, just like filteradd and filterload -nodes that want to enable/disable txrelay should use feefilter --- src/net_processing.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index d48745aef25..8e8a84e4e27 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3490,13 +3490,15 @@ bool ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRec } if (msg_type == NetMsgType::FILTERCLEAR) { + if (!(pfrom.GetLocalServices() & NODE_BLOOM)) { + pfrom.fDisconnect = true; + return true; + } if (pfrom.m_tx_relay == nullptr) { return true; } LOCK(pfrom.m_tx_relay->cs_filter); - if (pfrom.GetLocalServices() & NODE_BLOOM) { - pfrom.m_tx_relay->pfilter = nullptr; - } + pfrom.m_tx_relay->pfilter = nullptr; pfrom.m_tx_relay->fRelayTxes = true; return true; } From ff8c430c6589ea72b9e169455cf6437c8623cc52 Mon Sep 17 00:00:00 2001 From: gzhao408 Date: Fri, 12 Jun 2020 09:30:42 -0700 Subject: [PATCH 2/3] [test] test disconnect for filterclear --- test/functional/p2p_nobloomfilter_messages.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/functional/p2p_nobloomfilter_messages.py b/test/functional/p2p_nobloomfilter_messages.py index 41af74ebb87..8478a752e7f 100755 --- a/test/functional/p2p_nobloomfilter_messages.py +++ b/test/functional/p2p_nobloomfilter_messages.py @@ -8,9 +8,10 @@ Test that, when bloom filters are not enabled, nodes are disconnected if: 1. They send a p2p mempool message 2. They send a p2p filterload message 3. They send a p2p filteradd message +4. They send a p2p filterclear message """ -from test_framework.messages import msg_mempool, msg_filteradd, msg_filterload +from test_framework.messages import msg_mempool, msg_filteradd, msg_filterload, msg_filterclear from test_framework.mininode import P2PInterface from test_framework.test_framework import BitcoinTestFramework from test_framework.util import assert_equal @@ -39,5 +40,8 @@ class P2PNobloomfilterMessages(BitcoinTestFramework): self.log.info("Test that node is disconnected if it sends filteradd message") self.test_message_causes_disconnect(msg_filteradd(data=b'\xcc')) + self.log.info("Test that peer is disconnected if it sends a filterclear message") + self.test_message_causes_disconnect(msg_filterclear()) + if __name__ == '__main__': P2PNobloomfilterMessages().main() From 3a10d935ac8ebabdfd336569d943f042ff84b13e Mon Sep 17 00:00:00 2001 From: gzhao408 Date: Fri, 12 Jun 2020 13:21:18 -0700 Subject: [PATCH 3/3] [p2p/refactor] move disconnect logic and remove misbehaving -Increasing the banscore and/or banning is too harsh, just disconnecting is enough. -Return true from ProcessMessage because we already log receipt of filterclear and disconnect. --- src/net_processing.cpp | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 8e8a84e4e27..aa5c9668e3b 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -2215,20 +2215,6 @@ bool ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRec } - if (!(pfrom.GetLocalServices() & NODE_BLOOM) && - (msg_type == NetMsgType::FILTERLOAD || - msg_type == NetMsgType::FILTERADD)) - { - if (pfrom.nVersion >= NO_BLOOM_VERSION) { - LOCK(cs_main); - Misbehaving(pfrom.GetId(), 100); - return false; - } else { - pfrom.fDisconnect = true; - return false; - } - } - if (msg_type == NetMsgType::VERSION) { // Each connection can only send one version message if (pfrom.nVersion != 0) @@ -3447,6 +3433,10 @@ bool ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRec } if (msg_type == NetMsgType::FILTERLOAD) { + if (!(pfrom.GetLocalServices() & NODE_BLOOM)) { + pfrom.fDisconnect = true; + return true; + } CBloomFilter filter; vRecv >> filter; @@ -3466,6 +3456,10 @@ bool ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRec } if (msg_type == NetMsgType::FILTERADD) { + if (!(pfrom.GetLocalServices() & NODE_BLOOM)) { + pfrom.fDisconnect = true; + return true; + } std::vector vData; vRecv >> vData;