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 21ADDRS = [] 22for i in range(10): 23 addr = CAddress() 24 addr.time = int(time.time()) + i 25 addr.nServices = NODE_NETWORK | NODE_WITNESS 26 addr.ip = "123.123.123.{}".format(i % 256) 27 addr.port = 8333 + i 28 ADDRS.append(addr) 29 30 31class AddrReceiver(P2PInterface): 32 addrv2_received_and_checked = False 33 34 def __init__(self): 35 super().__init__(support_addrv2 = True) 36 37 def on_addrv2(self, message): 38 for addr in message.addrs: 39 assert_equal(addr.nServices, 9) 40 assert addr.ip.startswith('123.123.123.') 41 assert (8333 <= addr.port < 8343) 42 self.addrv2_received_and_checked = True 43 44 def wait_for_addrv2(self): 45 self.wait_until(lambda: "addrv2" in self.last_message) 46 47 48class AddrTest(BitcoinTestFramework): 49 def set_test_params(self): 50 self.setup_clean_chain = True 51 self.num_nodes = 1 52 53 def run_test(self): 54 self.log.info('Create connection that sends addrv2 messages') 55 addr_source = self.nodes[0].add_p2p_connection(P2PInterface()) 56 msg = msg_addrv2() 57 58 self.log.info('Send too-large addrv2 message') 59 msg.addrs = ADDRS * 101 60 with self.nodes[0].assert_debug_log(['addrv2 message size = 1010']): 61 addr_source.send_and_ping(msg) 62 63 self.log.info('Check that addrv2 message content is relayed and added to addrman') 64 addr_receiver = self.nodes[0].add_p2p_connection(AddrReceiver()) 65 msg.addrs = ADDRS 66 with self.nodes[0].assert_debug_log([ 67 'Added 10 addresses from 127.0.0.1: 0 tried', 68 'received: addrv2 (131 bytes) peer=0', 69 'sending addrv2 (131 bytes) peer=1', 70 ]): 71 addr_source.send_and_ping(msg) 72 self.nodes[0].setmocktime(int(time.time()) + 30 * 60) 73 addr_receiver.wait_for_addrv2() 74 75 assert addr_receiver.addrv2_received_and_checked 76 77 78if __name__ == '__main__': 79 AddrTest().main() 80