mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-19 05:45:05 +01:00
[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.
This commit is contained in:
parent
c061599e40
commit
0980ca78cd
@ -19,7 +19,7 @@ from test_framework.p2p import (
|
||||
p2p_lock,
|
||||
)
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_equal
|
||||
from test_framework.util import assert_equal, assert_greater_than
|
||||
import random
|
||||
import time
|
||||
|
||||
@ -83,6 +83,10 @@ class AddrTest(BitcoinTestFramework):
|
||||
def run_test(self):
|
||||
self.oversized_addr_test()
|
||||
self.relay_tests()
|
||||
self.inbound_blackhole_tests()
|
||||
|
||||
# This test populates the addrman, which can impact the node's behavior
|
||||
# in subsequent tests
|
||||
self.getaddr_tests()
|
||||
self.blocksonly_mode_tests()
|
||||
self.rate_limit_tests()
|
||||
@ -195,6 +199,49 @@ class AddrTest(BitcoinTestFramework):
|
||||
|
||||
self.nodes[0].disconnect_p2ps()
|
||||
|
||||
def sum_addr_messages(self, msgs_dict):
|
||||
return sum(bytes_received for (msg, bytes_received) in msgs_dict.items() if msg in ['addr', 'addrv2', 'getaddr'])
|
||||
|
||||
def inbound_blackhole_tests(self):
|
||||
self.log.info('Check that we only relay addresses to inbound peers who have previously sent us addr related messages')
|
||||
|
||||
addr_source = self.nodes[0].add_p2p_connection(P2PInterface())
|
||||
receiver_peer = self.nodes[0].add_p2p_connection(AddrReceiver())
|
||||
blackhole_peer = self.nodes[0].add_p2p_connection(AddrReceiver(send_getaddr=False))
|
||||
initial_addrs_received = receiver_peer.num_ipv4_received
|
||||
|
||||
# addr_source sends 2 addresses to node0
|
||||
msg = self.setup_addr_msg(2)
|
||||
addr_source.send_and_ping(msg)
|
||||
self.mocktime += 30 * 60
|
||||
self.nodes[0].setmocktime(self.mocktime)
|
||||
receiver_peer.sync_with_ping()
|
||||
blackhole_peer.sync_with_ping()
|
||||
|
||||
peerinfo = self.nodes[0].getpeerinfo()
|
||||
|
||||
# Confirm node received addr-related messages from receiver peer
|
||||
assert_greater_than(self.sum_addr_messages(peerinfo[1]['bytesrecv_per_msg']), 0)
|
||||
# And that peer received addresses
|
||||
assert_equal(receiver_peer.num_ipv4_received - initial_addrs_received, 2)
|
||||
|
||||
# Confirm node has not received addr-related messages from blackhole peer
|
||||
assert_equal(self.sum_addr_messages(peerinfo[2]['bytesrecv_per_msg']), 0)
|
||||
# And that peer did not receive addresses
|
||||
assert_equal(blackhole_peer.num_ipv4_received, 0)
|
||||
|
||||
self.log.info("After blackhole peer sends addr message, it becomes eligible for addr gossip")
|
||||
blackhole_peer.send_and_ping(msg_addr())
|
||||
msg = self.setup_addr_msg(2)
|
||||
self.send_addr_msg(addr_source, msg, [receiver_peer, blackhole_peer])
|
||||
|
||||
# Confirm node has now received addr-related messages from blackhole peer
|
||||
assert_greater_than(self.sum_addr_messages(peerinfo[1]['bytesrecv_per_msg']), 0)
|
||||
# And that peer received addresses
|
||||
assert_equal(blackhole_peer.num_ipv4_received, 2)
|
||||
|
||||
self.nodes[0].disconnect_p2ps()
|
||||
|
||||
def getaddr_tests(self):
|
||||
# In the previous tests, the node answered GETADDR requests with an
|
||||
# empty addrman. Due to GETADDR response caching (see
|
||||
|
Loading…
Reference in New Issue
Block a user