|
19 | 19 | p2p_lock,
|
20 | 20 | )
|
21 | 21 | from test_framework.test_framework import BitcoinTestFramework
|
22 |
| -from test_framework.util import assert_equal |
| 22 | +from test_framework.util import assert_equal, assert_greater_than |
23 | 23 | import random
|
24 | 24 | import time
|
25 | 25 |
|
@@ -83,6 +83,10 @@ def set_test_params(self):
|
83 | 83 | def run_test(self):
|
84 | 84 | self.oversized_addr_test()
|
85 | 85 | self.relay_tests()
|
| 86 | + self.inbound_blackhole_tests() |
| 87 | + |
| 88 | + # This test populates the addrman, which can impact the node's behavior |
| 89 | + # in subsequent tests |
86 | 90 | self.getaddr_tests()
|
87 | 91 | self.blocksonly_mode_tests()
|
88 | 92 | self.rate_limit_tests()
|
@@ -195,6 +199,49 @@ def relay_tests(self):
|
195 | 199 |
|
196 | 200 | self.nodes[0].disconnect_p2ps()
|
197 | 201 |
|
| 202 | + def sum_addr_messages(self, msgs_dict): |
| 203 | + return sum(bytes_received for (msg, bytes_received) in msgs_dict.items() if msg in ['addr', 'addrv2', 'getaddr']) |
| 204 | + |
| 205 | + def inbound_blackhole_tests(self): |
| 206 | + self.log.info('Check that we only relay addresses to inbound peers who have previously sent us addr related messages') |
| 207 | + |
| 208 | + addr_source = self.nodes[0].add_p2p_connection(P2PInterface()) |
| 209 | + receiver_peer = self.nodes[0].add_p2p_connection(AddrReceiver()) |
| 210 | + blackhole_peer = self.nodes[0].add_p2p_connection(AddrReceiver(send_getaddr=False)) |
| 211 | + initial_addrs_received = receiver_peer.num_ipv4_received |
| 212 | + |
| 213 | + # addr_source sends 2 addresses to node0 |
| 214 | + msg = self.setup_addr_msg(2) |
| 215 | + addr_source.send_and_ping(msg) |
| 216 | + self.mocktime += 30 * 60 |
| 217 | + self.nodes[0].setmocktime(self.mocktime) |
| 218 | + receiver_peer.sync_with_ping() |
| 219 | + blackhole_peer.sync_with_ping() |
| 220 | + |
| 221 | + peerinfo = self.nodes[0].getpeerinfo() |
| 222 | + |
| 223 | + # Confirm node received addr-related messages from receiver peer |
| 224 | + assert_greater_than(self.sum_addr_messages(peerinfo[1]['bytesrecv_per_msg']), 0) |
| 225 | + # And that peer received addresses |
| 226 | + assert_equal(receiver_peer.num_ipv4_received - initial_addrs_received, 2) |
| 227 | + |
| 228 | + # Confirm node has not received addr-related messages from blackhole peer |
| 229 | + assert_equal(self.sum_addr_messages(peerinfo[2]['bytesrecv_per_msg']), 0) |
| 230 | + # And that peer did not receive addresses |
| 231 | + assert_equal(blackhole_peer.num_ipv4_received, 0) |
| 232 | + |
| 233 | + self.log.info("After blackhole peer sends addr message, it becomes eligible for addr gossip") |
| 234 | + blackhole_peer.send_and_ping(msg_addr()) |
| 235 | + msg = self.setup_addr_msg(2) |
| 236 | + self.send_addr_msg(addr_source, msg, [receiver_peer, blackhole_peer]) |
| 237 | + |
| 238 | + # Confirm node has now received addr-related messages from blackhole peer |
| 239 | + assert_greater_than(self.sum_addr_messages(peerinfo[1]['bytesrecv_per_msg']), 0) |
| 240 | + # And that peer received addresses |
| 241 | + assert_equal(blackhole_peer.num_ipv4_received, 2) |
| 242 | + |
| 243 | + self.nodes[0].disconnect_p2ps() |
| 244 | + |
198 | 245 | def getaddr_tests(self):
|
199 | 246 | # In the previous tests, the node answered GETADDR requests with an
|
200 | 247 | # empty addrman. Due to GETADDR response caching (see
|
|
0 commit comments