Skip to content

Commit 6457c31

Browse files
committed
net_processing: make all Misbehaving increments = 100
This removes the need to actually track misbehavior score (see further commit), because any Misbehaving node will immediately hit the discouragement threshold.
1 parent 5120ab1 commit 6457c31

File tree

7 files changed

+28
-23
lines changed

7 files changed

+28
-23
lines changed

src/net_processing.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1949,8 +1949,7 @@ bool PeerManagerImpl::MaybePunishNodeForBlock(NodeId nodeid, const BlockValidati
19491949
return true;
19501950
// Conflicting (but not necessarily invalid) data or different policy:
19511951
case BlockValidationResult::BLOCK_MISSING_PREV:
1952-
// TODO: Handle this much more gracefully (10 DoS points is super arbitrary)
1953-
if (peer) Misbehaving(*peer, 10, message);
1952+
if (peer) Misbehaving(*peer, 100, message);
19541953
return true;
19551954
case BlockValidationResult::BLOCK_RECENT_CONSENSUS_CHANGE:
19561955
case BlockValidationResult::BLOCK_TIME_FUTURE:
@@ -2690,7 +2689,7 @@ bool PeerManagerImpl::CheckHeadersPoW(const std::vector<CBlockHeader>& headers,
26902689

26912690
// Are these headers connected to each other?
26922691
if (!CheckHeadersAreContinuous(headers)) {
2693-
Misbehaving(peer, 20, "non-continuous headers sequence");
2692+
Misbehaving(peer, 100, "non-continuous headers sequence");
26942693
return false;
26952694
}
26962695
return true;
@@ -4107,7 +4106,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
41074106

41084107
if (vAddr.size() > MAX_ADDR_TO_SEND)
41094108
{
4110-
Misbehaving(*peer, 20, strprintf("%s message size = %u", msg_type, vAddr.size()));
4109+
Misbehaving(*peer, 100, strprintf("%s message size = %u", msg_type, vAddr.size()));
41114110
return;
41124111
}
41134112

@@ -4189,7 +4188,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
41894188
vRecv >> vInv;
41904189
if (vInv.size() > MAX_INV_SZ)
41914190
{
4192-
Misbehaving(*peer, 20, strprintf("inv message size = %u", vInv.size()));
4191+
Misbehaving(*peer, 100, strprintf("inv message size = %u", vInv.size()));
41934192
return;
41944193
}
41954194

@@ -4281,7 +4280,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
42814280
vRecv >> vInv;
42824281
if (vInv.size() > MAX_INV_SZ)
42834282
{
4284-
Misbehaving(*peer, 20, strprintf("getdata message size = %u", vInv.size()));
4283+
Misbehaving(*peer, 100, strprintf("getdata message size = %u", vInv.size()));
42854284
return;
42864285
}
42874286

@@ -4966,7 +4965,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
49664965
// Bypass the normal CBlock deserialization, as we don't want to risk deserializing 2000 full blocks.
49674966
unsigned int nCount = ReadCompactSize(vRecv);
49684967
if (nCount > MAX_HEADERS_RESULTS) {
4969-
Misbehaving(*peer, 20, strprintf("headers message size = %u", nCount));
4968+
Misbehaving(*peer, 100, strprintf("headers message size = %u", nCount));
49704969
return;
49714970
}
49724971
headers.resize(nCount);

src/test/denialofservice_tests.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,15 +350,14 @@ BOOST_AUTO_TEST_CASE(peer_discouragement)
350350
peerLogic->InitializeNode(*nodes[1], NODE_NETWORK);
351351
nodes[1]->fSuccessfullyConnected = true;
352352
connman->AddTestNode(*nodes[1]);
353-
peerLogic->UnitTestMisbehaving(nodes[1]->GetId(), DISCOURAGEMENT_THRESHOLD - 1);
354353
BOOST_CHECK(peerLogic->SendMessages(nodes[1]));
355354
// [0] is still discouraged/disconnected.
356355
BOOST_CHECK(banman->IsDiscouraged(addr[0]));
357356
BOOST_CHECK(nodes[0]->fDisconnect);
358357
// [1] is not discouraged/disconnected yet.
359358
BOOST_CHECK(!banman->IsDiscouraged(addr[1]));
360359
BOOST_CHECK(!nodes[1]->fDisconnect);
361-
peerLogic->UnitTestMisbehaving(nodes[1]->GetId(), 1); // [1] reaches discouragement threshold
360+
peerLogic->UnitTestMisbehaving(nodes[1]->GetId(), DISCOURAGEMENT_THRESHOLD); // [1] reaches discouragement threshold
362361
BOOST_CHECK(peerLogic->SendMessages(nodes[1]));
363362
// Expect both [0] and [1] to be discouraged/disconnected now.
364363
BOOST_CHECK(banman->IsDiscouraged(addr[0]));

test/functional/p2p_addr_relay.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ def oversized_addr_test(self):
142142

143143
msg = self.setup_addr_msg(1010)
144144
with self.nodes[0].assert_debug_log(['addr message size = 1010']):
145-
addr_source.send_and_ping(msg)
145+
addr_source.send_message(msg)
146+
addr_source.wait_for_disconnect()
146147

147148
self.nodes[0].disconnect_p2ps()
148149

test/functional/p2p_addrv2_relay.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,6 @@ def run_test(self):
8686
addr_source = self.nodes[0].add_p2p_connection(P2PInterface())
8787
msg = msg_addrv2()
8888

89-
self.log.info('Send too-large addrv2 message')
90-
msg.addrs = ADDRS * 101
91-
with self.nodes[0].assert_debug_log(['addrv2 message size = 1010']):
92-
addr_source.send_and_ping(msg)
93-
9489
self.log.info('Check that addrv2 message content is relayed and added to addrman')
9590
addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver())
9691
msg.addrs = ADDRS
@@ -106,6 +101,13 @@ def run_test(self):
106101
assert addr_receiver.addrv2_received_and_checked
107102
assert_equal(len(self.nodes[0].getnodeaddresses(count=0, network="i2p")), 0)
108103

104+
self.log.info('Send too-large addrv2 message')
105+
msg.addrs = ADDRS * 101
106+
with self.nodes[0].assert_debug_log(['addrv2 message size = 1010']):
107+
addr_source.send_message(msg)
108+
addr_source.wait_for_disconnect()
109+
110+
109111

110112
if __name__ == '__main__':
111113
AddrTest().main()

test/functional/p2p_invalid_messages.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,9 @@ def test_oversized_msg(self, msg, size):
261261
msg_type = msg.msgtype.decode('ascii')
262262
self.log.info("Test {} message of size {} is logged as misbehaving".format(msg_type, size))
263263
with self.nodes[0].assert_debug_log(['Misbehaving', '{} message size = {}'.format(msg_type, size)]):
264-
self.nodes[0].add_p2p_connection(P2PInterface()).send_and_ping(msg)
264+
conn = self.nodes[0].add_p2p_connection(P2PInterface())
265+
conn.send_message(msg)
266+
conn.wait_for_disconnect()
265267
self.nodes[0].disconnect_p2ps()
266268

267269
def test_oversized_inv_msg(self):
@@ -322,7 +324,8 @@ def test_noncontinuous_headers_msg(self):
322324
# delete arbitrary block header somewhere in the middle to break link
323325
del block_headers[random.randrange(1, len(block_headers)-1)]
324326
with self.nodes[0].assert_debug_log(expected_msgs=MISBEHAVING_NONCONTINUOUS_HEADERS_MSGS):
325-
peer.send_and_ping(msg_headers(block_headers))
327+
peer.send_message(msg_headers(block_headers))
328+
peer.wait_for_disconnect()
326329
self.nodes[0].disconnect_p2ps()
327330

328331
def test_resource_exhaustion(self):

test/functional/p2p_mutated_blocks.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,10 @@ def self_transfer_requested():
104104
block_missing_prev.hashPrevBlock = 123
105105
block_missing_prev.solve()
106106

107-
# Attacker gets a DoS score of 10, not immediately disconnected, so we do it 10 times to get to 100
108-
for _ in range(10):
109-
assert_equal(len(self.nodes[0].getpeerinfo()), 2)
110-
with self.nodes[0].assert_debug_log(expected_msgs=["AcceptBlock FAILED (prev-blk-not-found)"]):
111-
attacker.send_message(msg_block(block_missing_prev))
107+
# Check that non-connecting block causes disconnect
108+
assert_equal(len(self.nodes[0].getpeerinfo()), 2)
109+
with self.nodes[0].assert_debug_log(expected_msgs=["AcceptBlock FAILED (prev-blk-not-found)"]):
110+
attacker.send_message(msg_block(block_missing_prev))
112111
attacker.wait_for_disconnect(timeout=5)
113112

114113

test/functional/p2p_unrequested_blocks.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,11 @@ def run_test(self):
170170
tip = next_block
171171

172172
# Now send the block at height 5 and check that it wasn't accepted (missing header)
173-
test_node.send_and_ping(msg_block(all_blocks[1]))
173+
test_node.send_message(msg_block(all_blocks[1]))
174+
test_node.wait_for_disconnect()
174175
assert_raises_rpc_error(-5, "Block not found", self.nodes[0].getblock, all_blocks[1].hash)
175176
assert_raises_rpc_error(-5, "Block not found", self.nodes[0].getblockheader, all_blocks[1].hash)
177+
test_node = self.nodes[0].add_p2p_connection(P2PInterface())
176178

177179
# The block at height 5 should be accepted if we provide the missing header, though
178180
headers_message = msg_headers()

0 commit comments

Comments
 (0)