Skip to content

Commit 0980ca7

Browse files
committed
[test] Test that we intentionally select addr relay peers.
This test checks that we only relay addresses with inbound peers who have sent us an addr related message. Uses a combination of GETADDR and ADDR to verify when peers are eligible.
1 parent c061599 commit 0980ca7

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

test/functional/p2p_addr_relay.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
p2p_lock,
2020
)
2121
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
2323
import random
2424
import time
2525

@@ -83,6 +83,10 @@ def set_test_params(self):
8383
def run_test(self):
8484
self.oversized_addr_test()
8585
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
8690
self.getaddr_tests()
8791
self.blocksonly_mode_tests()
8892
self.rate_limit_tests()
@@ -195,6 +199,49 @@ def relay_tests(self):
195199

196200
self.nodes[0].disconnect_p2ps()
197201

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+
198245
def getaddr_tests(self):
199246
# In the previous tests, the node answered GETADDR requests with an
200247
# empty addrman. Due to GETADDR response caching (see

0 commit comments

Comments
 (0)