diff --git a/test/functional/abc_p2p_compactproofs.py b/test/functional/abc_p2p_compactproofs.py new file mode 100644 --- /dev/null +++ b/test/functional/abc_p2p_compactproofs.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +# Copyright (c) 2022 The Bitcoin developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +""" +Test proof inventory relaying +""" + +from test_framework.avatools import ( + AvaP2PInterface, + gen_proof, + get_proof_ids, + wait_for_proof, +) +from test_framework.messages import msg_getavaproofs +from test_framework.p2p import p2p_lock +from test_framework.siphash import siphash256 +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import assert_equal + + +class CompactProofsTest(BitcoinTestFramework): + def set_test_params(self): + self.num_nodes = 1 + self.extra_args = [[ + '-enableavalanche=1', + '-avacooldown=0', + '-whitelist=noban@127.0.0.1', + ]] * self.num_nodes + + def test_respond_getavaproofs(self): + self.log.info("Check the node responds to getavaproofs messages") + + node = self.nodes[0] + + def received_avaproofs(peer): + with p2p_lock: + return peer.last_message.get("avaproofs") + + def send_getavaproof_check_shortid_len(peer, expected_len): + peer.send_message(msg_getavaproofs()) + self.wait_until(lambda: received_avaproofs(peer)) + + avaproofs = received_avaproofs(peer) + assert_equal(len(avaproofs.shortids), expected_len) + + # Initially the node has 0 peer + assert_equal(len(get_proof_ids(node)), 0) + + peer = node.add_p2p_connection(AvaP2PInterface()) + send_getavaproof_check_shortid_len(peer, 0) + + # Add some proofs + sending_peer = node.add_p2p_connection(AvaP2PInterface()) + for _ in range(50): + _, proof = gen_proof(node) + sending_peer.send_avaproof(proof) + wait_for_proof(node, f"{proof.proofid:0{64}x}") + + proofids = get_proof_ids(node) + assert_equal(len(proofids), 50) + + receiving_peer = node.add_p2p_connection(AvaP2PInterface()) + send_getavaproof_check_shortid_len(receiving_peer, len(proofids)) + + avaproofs = received_avaproofs(receiving_peer) + expected_shortids = [ + siphash256( + avaproofs.key0, + avaproofs.key1, + proofid) & 0x0000ffffffffffff for proofid in sorted(proofids)] + assert_equal(expected_shortids, avaproofs.shortids) + + # Don't expect any prefilled proof for now + assert_equal(len(avaproofs.prefilled_proofs), 0) + + def run_test(self): + self.test_respond_getavaproofs() + + +if __name__ == '__main__': + CompactProofsTest().main() diff --git a/test/functional/abc_p2p_proof_inventory.py b/test/functional/abc_p2p_proof_inventory.py --- a/test/functional/abc_p2p_proof_inventory.py +++ b/test/functional/abc_p2p_proof_inventory.py @@ -10,7 +10,6 @@ from test_framework.address import ADDRESS_ECREG_UNSPENDABLE from test_framework.avatools import ( - AvaP2PInterface, avalanche_proof_from_hex, gen_proof, get_proof_ids, @@ -22,11 +21,9 @@ MSG_TYPE_MASK, CInv, msg_avaproof, - msg_getavaproofs, msg_getdata, ) from test_framework.p2p import P2PInterface, p2p_lock -from test_framework.siphash import siphash256 from test_framework.test_framework import BitcoinTestFramework from test_framework.util import assert_equal, assert_greater_than from test_framework.wallet_util import bytes_to_wif @@ -190,53 +187,6 @@ node0.sendavalancheproof(proof.serialize().hex()) self.sync_proofs() - def test_respond_getavaproofs(self): - self.log.info("Check the node responds to getavaproofs messages") - - self.restart_node(0) - node = self.nodes[0] - - def received_avaproofs(peer): - with p2p_lock: - return peer.last_message.get("avaproofs") - - def send_getavaproof_check_shortid_len(peer, expected_len): - peer.send_message(msg_getavaproofs()) - self.wait_until(lambda: received_avaproofs(peer)) - - avaproofs = received_avaproofs(peer) - assert_equal(len(avaproofs.shortids), expected_len) - - # Initially the node has 0 peer - assert_equal(len(get_proof_ids(node)), 0) - - peer = node.add_p2p_connection(AvaP2PInterface()) - send_getavaproof_check_shortid_len(peer, 0) - - # Add some proofs - sending_peer = node.add_p2p_connection(AvaP2PInterface()) - for _ in range(50): - _, proof = gen_proof(node) - sending_peer.send_avaproof(proof) - wait_for_proof(node, f"{proof.proofid:0{64}x}") - - proofids = get_proof_ids(node) - assert_equal(len(proofids), 50) - - receiving_peer = node.add_p2p_connection(AvaP2PInterface()) - send_getavaproof_check_shortid_len(receiving_peer, len(proofids)) - - avaproofs = received_avaproofs(receiving_peer) - expected_shortids = [ - siphash256( - avaproofs.key0, - avaproofs.key1, - proofid) & 0x0000ffffffffffff for proofid in sorted(proofids)] - assert_equal(expected_shortids, avaproofs.shortids) - - # Don't expect any prefilled proof for now - assert_equal(len(avaproofs.prefilled_proofs), 0) - def test_unbroadcast(self): self.log.info("Test broadcasting proofs") @@ -340,7 +290,6 @@ self.test_receive_proof() self.test_proof_relay() self.test_manually_sent_proof() - self.test_respond_getavaproofs() # Run these tests last because they need to disconnect the nodes self.test_unbroadcast() diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -132,6 +132,7 @@ "abc_p2p_avalanche_peer_discovery.py": [["--nolegacyavaproof"]], "abc_p2p_avalanche_proof_voting.py": [["--nolegacyavaproof"]], "abc_p2p_avalanche_voting.py": [["--nolegacyavaproof"]], + "abc_p2p_compactproofs.py": [["--nolegacyavaproof"]], "abc_p2p_getavaaddr.py": [["--nolegacyavaproof"]], "abc_p2p_proof_inventory.py": [["--nolegacyavaproof"]], "abc_rpc_addavalanchenode.py": [["--nolegacyavaproof"]],