15
15
from test_framework .messages import (
16
16
msg_getaddr ,
17
17
msg_ping ,
18
- msg_verack ,
19
18
msg_version ,
20
19
)
21
20
from test_framework .mininode import mininode_lock , P2PInterface
29
28
DISCOURAGEMENT_THRESHOLD = 100
30
29
31
30
32
- class CLazyNode (P2PInterface ):
31
+ class LazyPeer (P2PInterface ):
33
32
def __init__ (self ):
34
33
super ().__init__ ()
35
34
self .unexpected_msg = False
@@ -42,6 +41,7 @@ def bad_message(self, message):
42
41
def on_open (self ):
43
42
self .ever_connected = True
44
43
44
+ # Does not respond to "version" with "verack"
45
45
def on_version (self , message ): self .bad_message (message )
46
46
def on_verack (self , message ): self .bad_message (message )
47
47
def on_inv (self , message ): self .bad_message (message )
@@ -64,21 +64,8 @@ def on_getblocktxn(self, message): self.bad_message(message)
64
64
def on_blocktxn (self , message ): self .bad_message (message )
65
65
66
66
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 ):
82
69
def __init__ (self ):
83
70
self .version_received = False
84
71
super ().__init__ ()
@@ -97,6 +84,7 @@ class P2PVersionStore(P2PInterface):
97
84
version_received = None
98
85
99
86
def on_version (self , msg ):
87
+ # Responds with an appropriate verack
100
88
super ().on_version (msg )
101
89
self .version_received = msg
102
90
@@ -106,39 +94,45 @@ def set_test_params(self):
106
94
self .num_nodes = 1
107
95
108
96
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 )
113
107
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.
116
110
for _ in range (DISCOURAGEMENT_THRESHOLD ):
117
- no_version_disconnect_node .send_message (msg_verack ())
111
+ no_version_disconnect_peer .send_message (msg_ping ())
118
112
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
120
114
# verack, since we never sent one
121
- no_verack_idlenode .wait_for_verack ()
115
+ no_verack_idle_peer .wait_for_verack ()
122
116
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 )
126
120
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 )
129
123
130
124
#Give the node enough time to possibly leak out a message
131
125
time .sleep (5 )
132
126
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
135
129
136
130
self .nodes [0 ].disconnect_p2ps ()
137
131
138
132
# 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
142
136
143
137
self .log .info ('Check that the version message does not leak the local address of the node' )
144
138
p2p_version_store = self .nodes [0 ].add_p2p_connection (P2PVersionStore ())
@@ -151,13 +145,13 @@ def run_test(self):
151
145
assert_equal (ver .nStartingHeight , 201 )
152
146
assert_equal (ver .nRelay , 1 )
153
147
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 )
156
150
old_version_msg = msg_version ()
157
151
old_version_msg .nVersion = 31799
158
152
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 ()
161
155
162
156
163
157
if __name__ == '__main__' :
0 commit comments