Skip to content

Commit 70d7ddb

Browse files
committed
Merge #19727: test: Remove unused classes from p2p_leak.py
ed5cd12 test: Distinguish between nodes(bitcoind) and peers(mininodes) in p2p_leak.py (Dhruv Mehta) f6f082b test: remove `CNodeNoVersionIdle` from p2p_leak.py (Dhruv Mehta) 45cf55c test: remove `CNodeNoVersionMisbehavior` from p2p_leak.py (Dhruv Mehta) Pull request description: - Removes `CNodeNoVersionMisbehavior` per recommendation at bitcoin/bitcoin#19657 (comment) - Removes `CNodeNoVersionIdle` because it is similarly unnecessary - As someone new to the codebase, I found it easier to understand it if `no_version_disconnect_node` tries to overwhelm the peer with any message that is not version/verack. - Per recommendation at bitcoin/bitcoin#19727 (review), made a clear distinction between nodes(bitcoind) and peers(mininode interface implementations) ACKs for top commit: jnewbery: tested ACK ed5cd12 amitiuttarwar: utACK ed5cd12 Tree-SHA512: 310a24c91fd837e7f65177edb55fe6142fb3559fae7867c5cdd9c9a23b1a02202b935ca9a82633fa7649f3de2fa221f6da906a7b5e499fc20f7254085033757d
2 parents 44f66d2 + ed5cd12 commit 70d7ddb

File tree

1 file changed

+34
-40
lines changed

1 file changed

+34
-40
lines changed

test/functional/p2p_leak.py

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from test_framework.messages import (
1616
msg_getaddr,
1717
msg_ping,
18-
msg_verack,
1918
msg_version,
2019
)
2120
from test_framework.mininode import mininode_lock, P2PInterface
@@ -29,7 +28,7 @@
2928
DISCOURAGEMENT_THRESHOLD = 100
3029

3130

32-
class CLazyNode(P2PInterface):
31+
class LazyPeer(P2PInterface):
3332
def __init__(self):
3433
super().__init__()
3534
self.unexpected_msg = False
@@ -42,6 +41,7 @@ def bad_message(self, message):
4241
def on_open(self):
4342
self.ever_connected = True
4443

44+
# Does not respond to "version" with "verack"
4545
def on_version(self, message): self.bad_message(message)
4646
def on_verack(self, message): self.bad_message(message)
4747
def on_inv(self, message): self.bad_message(message)
@@ -64,21 +64,8 @@ def on_getblocktxn(self, message): self.bad_message(message)
6464
def on_blocktxn(self, message): self.bad_message(message)
6565

6666

67-
# Node that never sends a version. We'll use this to send a bunch of messages
68-
# anyway, and eventually get disconnected.
69-
class CNodeNoVersionMisbehavior(CLazyNode):
70-
pass
71-
72-
73-
# Node that never sends a version. This one just sits idle and hopes to receive
74-
# any message (it shouldn't!)
75-
class CNodeNoVersionIdle(CLazyNode):
76-
def __init__(self):
77-
super().__init__()
78-
79-
80-
# Node that sends a version but not a verack.
81-
class CNodeNoVerackIdle(CLazyNode):
67+
# Peer that sends a version but not a verack.
68+
class NoVerackIdlePeer(LazyPeer):
8269
def __init__(self):
8370
self.version_received = False
8471
super().__init__()
@@ -97,6 +84,7 @@ class P2PVersionStore(P2PInterface):
9784
version_received = None
9885

9986
def on_version(self, msg):
87+
# Responds with an appropriate verack
10088
super().on_version(msg)
10189
self.version_received = msg
10290

@@ -106,39 +94,45 @@ def set_test_params(self):
10694
self.num_nodes = 1
10795

10896
def run_test(self):
109-
no_version_disconnect_node = self.nodes[0].add_p2p_connection(
110-
CNodeNoVersionMisbehavior(), send_version=False, wait_for_verack=False)
111-
no_version_idlenode = self.nodes[0].add_p2p_connection(CNodeNoVersionIdle(), send_version=False, wait_for_verack=False)
112-
no_verack_idlenode = self.nodes[0].add_p2p_connection(CNodeNoVerackIdle(), wait_for_verack=False)
97+
# Peer that never sends a version. We will send a bunch of messages
98+
# from this peer anyway and verify eventual disconnection.
99+
no_version_disconnect_peer = self.nodes[0].add_p2p_connection(
100+
LazyPeer(), send_version=False, wait_for_verack=False)
101+
102+
# Another peer that never sends a version, nor any other messages. It shouldn't receive anything from the node.
103+
no_version_idle_peer = self.nodes[0].add_p2p_connection(LazyPeer(), send_version=False, wait_for_verack=False)
104+
105+
# Peer that sends a version but not a verack.
106+
no_verack_idle_peer = self.nodes[0].add_p2p_connection(NoVerackIdlePeer(), wait_for_verack=False)
113107

114-
# Send enough veracks without a message to reach the peer discouragement
115-
# threshold. This should get us disconnected.
108+
# Send enough ping messages (any non-version message will do) prior to sending
109+
# version to reach the peer discouragement threshold. This should get us disconnected.
116110
for _ in range(DISCOURAGEMENT_THRESHOLD):
117-
no_version_disconnect_node.send_message(msg_verack())
111+
no_version_disconnect_peer.send_message(msg_ping())
118112

119-
# Wait until we got the verack in response to the version. Though, don't wait for the other node to receive the
113+
# Wait until we got the verack in response to the version. Though, don't wait for the node to receive the
120114
# verack, since we never sent one
121-
no_verack_idlenode.wait_for_verack()
115+
no_verack_idle_peer.wait_for_verack()
122116

123-
wait_until(lambda: no_version_disconnect_node.ever_connected, timeout=10, lock=mininode_lock)
124-
wait_until(lambda: no_version_idlenode.ever_connected, timeout=10, lock=mininode_lock)
125-
wait_until(lambda: no_verack_idlenode.version_received, timeout=10, lock=mininode_lock)
117+
wait_until(lambda: no_version_disconnect_peer.ever_connected, timeout=10, lock=mininode_lock)
118+
wait_until(lambda: no_version_idle_peer.ever_connected, timeout=10, lock=mininode_lock)
119+
wait_until(lambda: no_verack_idle_peer.version_received, timeout=10, lock=mininode_lock)
126120

127-
# Mine a block and make sure that it's not sent to the connected nodes
128-
self.nodes[0].generatetoaddress(1, self.nodes[0].get_deterministic_priv_key().address)
121+
# Mine a block and make sure that it's not sent to the connected peers
122+
self.nodes[0].generate(nblocks=1)
129123

130124
#Give the node enough time to possibly leak out a message
131125
time.sleep(5)
132126

133-
# Expect this node to be disconnected for misbehavior
134-
assert not no_version_disconnect_node.is_connected
127+
# Expect this peer to be disconnected for misbehavior
128+
assert not no_version_disconnect_peer.is_connected
135129

136130
self.nodes[0].disconnect_p2ps()
137131

138132
# Make sure no unexpected messages came in
139-
assert no_version_disconnect_node.unexpected_msg == False
140-
assert no_version_idlenode.unexpected_msg == False
141-
assert no_verack_idlenode.unexpected_msg == False
133+
assert no_version_disconnect_peer.unexpected_msg == False
134+
assert no_version_idle_peer.unexpected_msg == False
135+
assert no_verack_idle_peer.unexpected_msg == False
142136

143137
self.log.info('Check that the version message does not leak the local address of the node')
144138
p2p_version_store = self.nodes[0].add_p2p_connection(P2PVersionStore())
@@ -151,13 +145,13 @@ def run_test(self):
151145
assert_equal(ver.nStartingHeight, 201)
152146
assert_equal(ver.nRelay, 1)
153147

154-
self.log.info('Check that old nodes are disconnected')
155-
p2p_old_node = self.nodes[0].add_p2p_connection(P2PInterface(), send_version=False, wait_for_verack=False)
148+
self.log.info('Check that old peers are disconnected')
149+
p2p_old_peer = self.nodes[0].add_p2p_connection(P2PInterface(), send_version=False, wait_for_verack=False)
156150
old_version_msg = msg_version()
157151
old_version_msg.nVersion = 31799
158152
with self.nodes[0].assert_debug_log(['peer=4 using obsolete version 31799; disconnecting']):
159-
p2p_old_node.send_message(old_version_msg)
160-
p2p_old_node.wait_for_disconnect()
153+
p2p_old_peer.send_message(old_version_msg)
154+
p2p_old_peer.wait_for_disconnect()
161155

162156

163157
if __name__ == '__main__':

0 commit comments

Comments
 (0)