1#!/usr/bin/env python3 2# Copyright (c) 2020 The Bitcoin Core developers 3# Distributed under the MIT software license, see the accompanying 4# file COPYING or http://www.opensource.org/licenses/mit-license.php. 5""" 6Test addrv2 relay 7""" 8 9import time 10 11from test_framework.messages import ( 12 CAddress, 13 msg_addrv2, 14 NODE_NETWORK, 15 NODE_WITNESS, 16) 17from test_framework.p2p import P2PInterface 18from test_framework.test_framework import BitcoinTestFramework 19from test_framework.util import assert_equal 20 21I2P_ADDR = "c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p" 22 23ADDRS = [] 24for i in range(10): 25 addr = CAddress() 26 addr.time = int(time.time()) + i 27 addr.nServices = NODE_NETWORK | NODE_WITNESS 28 # Add one I2P address at an arbitrary position. 29 if i == 5: 30 addr.net = addr.NET_I2P 31 addr.ip = I2P_ADDR 32 else: 33 addr.ip = f"123.123.123.{i % 256}" 34 addr.port = 8333 + i 35 ADDRS.append(addr) 36 37 38class AddrReceiver(P2PInterface): 39 addrv2_received_and_checked = False 40 41 def __init__(self): 42 super().__init__(support_addrv2 = True) 43 44 def on_addrv2(self, message): 45 expected_set = set((addr.ip, addr.port) for addr in ADDRS) 46 received_set = set((addr.ip, addr.port) for addr in message.addrs) 47 if expected_set == received_set: 48 self.addrv2_received_and_checked = True 49 50 def wait_for_addrv2(self): 51 self.wait_until(lambda: "addrv2" in self.last_message) 52 53 54class AddrTest(BitcoinTestFramework): 55 def set_test_params(self): 56 self.setup_clean_chain = True 57 self.num_nodes = 1 58 self.extra_args = [["-whitelist=addr@127.0.0.1"]] 59 60 def run_test(self): 61 self.log.info('Create connection that sends addrv2 messages') 62 addr_source = self.nodes[0].add_p2p_connection(P2PInterface()) 63 msg = msg_addrv2() 64 65 self.log.info('Send too-large addrv2 message') 66 msg.addrs = ADDRS * 101 67 with self.nodes[0].assert_debug_log(['addrv2 message size = 1010']): 68 addr_source.send_and_ping(msg) 69 70 self.log.info('Check that addrv2 message content is relayed and added to addrman') 71 addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver()) 72 msg.addrs = ADDRS 73 with self.nodes[0].assert_debug_log([ 74 # The I2P address is not added to node's own addrman because it has no 75 # I2P reachability (thus 10 - 1 = 9). 76 'Added 9 addresses from 127.0.0.1: 0 tried', 77 'received: addrv2 (159 bytes) peer=0', 78 'sending addrv2 (159 bytes) peer=1', 79 ]): 80 addr_source.send_and_ping(msg) 81 self.nodes[0].setmocktime(int(time.time()) + 30 * 60) 82 addr_receiver.wait_for_addrv2() 83 84 assert addr_receiver.addrv2_received_and_checked 85 assert_equal(len(self.nodes[0].getnodeaddresses(count=0, network="i2p")), 0) 86 87 88if __name__ == '__main__': 89 AddrTest().main() 90