Changeset View
Changeset View
Standalone View
Standalone View
test/functional/abc_p2p_avalanche_quorum.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2020-2022 The Bitcoin developers | # Copyright (c) 2020-2022 The Bitcoin developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
"""Test the quorum detection of avalanche.""" | """Test the quorum detection of avalanche.""" | ||||
from test_framework.avatools import ( | from test_framework.avatools import ( | ||||
AvaP2PInterface, | HelloAvaP2PInterface, | ||||
build_msg_avaproofs, | build_msg_avaproofs, | ||||
gen_proof, | gen_proof, | ||||
get_ava_p2p_interface, | get_ava_p2p_interface, | ||||
) | ) | ||||
from test_framework.key import ECPubKey | from test_framework.key import ECPubKey | ||||
from test_framework.messages import ( | from test_framework.messages import ( | ||||
NODE_AVALANCHE, | NODE_AVALANCHE, | ||||
NODE_NETWORK, | NODE_NETWORK, | ||||
AvalancheVote, | AvalancheVote, | ||||
AvalancheVoteError, | AvalancheVoteError, | ||||
) | ) | ||||
from test_framework.p2p import p2p_lock | from test_framework.p2p import 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 | ||||
class AvalancheQuorumTest(BitcoinTestFramework): | class AvalancheQuorumTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
self.num_nodes = 3 | self.num_nodes = 3 | ||||
self.min_avaproofs_node_count = 8 | self.min_avaproofs_node_count = 8 | ||||
self.extra_args = [[ | self.extra_args = [[ | ||||
'-enableavalanche=1', | '-enableavalanche=1', | ||||
'-enableavalanchepeerdiscovery=1', | |||||
'-avaproofstakeutxoconfirmations=1', | '-avaproofstakeutxoconfirmations=1', | ||||
'-avacooldown=0', | '-avacooldown=0', | ||||
'-avatimeout=0', | '-avatimeout=0', | ||||
'-avaminquorumstake=100000000', | '-avaminquorumstake=100000000', | ||||
'-avaminquorumconnectedstakeratio=0.8', | '-avaminquorumconnectedstakeratio=0.8', | ||||
'-minimumchainwork=0', | '-minimumchainwork=0', | ||||
]] * self.num_nodes | ]] * self.num_nodes | ||||
self.extra_args[0] = self.extra_args[0] + \ | self.extra_args[0] = self.extra_args[0] + \ | ||||
▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
r = response.response | r = response.response | ||||
assert pubkey.verify_schnorr(response.sig, r.get_hash()) | assert pubkey.verify_schnorr(response.sig, r.get_hash()) | ||||
assert_equal(len(r.votes), 1) | assert_equal(len(r.votes), 1) | ||||
actual = repr(r.votes[0]) | actual = repr(r.votes[0]) | ||||
expected = repr(AvalancheVote(expected, block)) | expected = repr(AvalancheVote(expected, block)) | ||||
assert_equal(actual, expected) | assert_equal(actual, expected) | ||||
def addavalanchenode(node, peer): | |||||
pubkey = peer['key'].get_pubkey().get_bytes().hex() | |||||
assert node.addavalanchenode( | |||||
peer['node'].nodeid, | |||||
pubkey, | |||||
peer['proof'].serialize().hex(), | |||||
) is True | |||||
p2p_idx = 0 | p2p_idx = 0 | ||||
def get_ava_outbound(node, peer, empty_avaproof): | def get_ava_outbound(node, peer, empty_avaproof): | ||||
nonlocal p2p_idx | nonlocal p2p_idx | ||||
avapeer = AvaP2PInterface() | avapeer = HelloAvaP2PInterface() | ||||
avapeer.proof = peer['proof'] | |||||
avapeer.master_privkey = peer['key'] | |||||
node.add_outbound_p2p_connection( | node.add_outbound_p2p_connection( | ||||
avapeer, | avapeer, | ||||
p2p_idx=p2p_idx, | p2p_idx=p2p_idx, | ||||
connection_type="avalanche", | connection_type="avalanche", | ||||
services=NODE_NETWORK | NODE_AVALANCHE, | services=NODE_NETWORK | NODE_AVALANCHE, | ||||
) | ) | ||||
p2p_idx += 1 | p2p_idx += 1 | ||||
avapeer.nodeid = node.getpeerinfo()[-1]['id'] | avapeer.nodeid = node.getpeerinfo()[-1]['id'] | ||||
peer['node'] = avapeer | peer['node'] = avapeer | ||||
addavalanchenode(node, peer) | |||||
# There is no compact proof request if the node is in IBD state | # There is no compact proof request if the node is in IBD state | ||||
if not node.getblockchaininfo()['initialblockdownload']: | if not node.getblockchaininfo()['initialblockdownload']: | ||||
avapeer.wait_until( | avapeer.wait_until( | ||||
lambda: avapeer.last_message.get("getavaproofs")) | lambda: avapeer.last_message.get("getavaproofs")) | ||||
if empty_avaproof: | if empty_avaproof: | ||||
avapeer.send_message(build_msg_avaproofs([])) | avapeer.send_message(build_msg_avaproofs([])) | ||||
▲ Show 20 Lines • Show All 91 Lines • Show Last 20 Lines |