@ -19,7 +19,7 @@ from test_framework.p2p import (
p2p_lock ,
p2p_lock ,
)
)
from test_framework . test_framework import BitcoinTestFramework
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 random
import time
import time
@ -83,6 +83,10 @@ class AddrTest(BitcoinTestFramework):
def run_test ( self ) :
def run_test ( self ) :
self . oversized_addr_test ( )
self . oversized_addr_test ( )
self . relay_tests ( )
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 . getaddr_tests ( )
self . blocksonly_mode_tests ( )
self . blocksonly_mode_tests ( )
self . rate_limit_tests ( )
self . rate_limit_tests ( )
@ -195,6 +199,49 @@ class AddrTest(BitcoinTestFramework):
self . nodes [ 0 ] . disconnect_p2ps ( )
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 ) :
def getaddr_tests ( self ) :
# In the previous tests, the node answered GETADDR requests with an
# In the previous tests, the node answered GETADDR requests with an
# empty addrman. Due to GETADDR response caching (see
# empty addrman. Due to GETADDR response caching (see