Changeset View
Changeset View
Standalone View
Standalone View
test/functional/abc_p2p_avalanche_proof_voting.py
Show All 23 Lines | |||||
QUORUM_NODE_COUNT = 16 | QUORUM_NODE_COUNT = 16 | ||||
class AvalancheProofVotingTest(BitcoinTestFramework): | class AvalancheProofVotingTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
self.conflicting_proof_cooldown = 100 | self.conflicting_proof_cooldown = 100 | ||||
self.peer_replacement_cooldown = 2000 | |||||
self.extra_args = [ | self.extra_args = [ | ||||
['-enableavalanche=1', '-enableavalancheproofreplacement=1', | ['-enableavalanche=1', '-enableavalancheproofreplacement=1', | ||||
f'-avalancheconflictingproofcooldown={self.conflicting_proof_cooldown}', '-avacooldown=0'], | f'-avalancheconflictingproofcooldown={self.conflicting_proof_cooldown}', f'-avalanchepeerreplacementcooldown={self.peer_replacement_cooldown}', '-avacooldown=0'], | ||||
] | ] | ||||
self.supports_cli = False | self.supports_cli = False | ||||
def run_test(self): | def run_test(self): | ||||
node = self.nodes[0] | node = self.nodes[0] | ||||
privkey = ECKey() | privkey = ECKey() | ||||
privkey.set(bytes.fromhex( | privkey.set(bytes.fromhex( | ||||
▲ Show 20 Lines • Show All 168 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
node.setmocktime(mock_time) | node.setmocktime(mock_time) | ||||
send_and_check_for_polling(proof_seq30) | send_and_check_for_polling(proof_seq30) | ||||
# Let the quorum vote for it | # Let the quorum vote for it | ||||
self.wait_until(lambda: accept_proof(proofid_seq30)) | self.wait_until(lambda: accept_proof(proofid_seq30)) | ||||
assert proofid_seq40 not in get_proof_ids(node) | assert proofid_seq40 not in get_proof_ids(node) | ||||
self.log.info("Test proof rejection") | self.log.info("Test the peer replacement rate limit") | ||||
# Wait until proof_seq30 is finalized | |||||
with node.assert_debug_log([f"Avalanche accepted proof {proofid_seq30:0{64}x}, status 3"]): | |||||
self.wait_until(lambda: not can_find_proof_in_poll( | |||||
proofid_seq30, response=AvalancheVoteError.ACCEPTED)) | |||||
# Not enough | |||||
assert self.conflicting_proof_cooldown < self.peer_replacement_cooldown | |||||
mock_time += self.conflicting_proof_cooldown | mock_time += self.conflicting_proof_cooldown | ||||
node.setmocktime(mock_time) | node.setmocktime(mock_time) | ||||
peer = get_ava_p2p_interface(node) | peer = get_ava_p2p_interface(node) | ||||
with node.assert_debug_log(["Not polling the avalanche proof (cooldown-not-elapsed)"]): | |||||
send_proof(peer, proof_seq50) | |||||
mock_time += self.peer_replacement_cooldown | |||||
node.setmocktime(mock_time) | |||||
self.log.info("Test proof rejection") | |||||
send_proof(peer, proof_seq50) | send_proof(peer, proof_seq50) | ||||
self.wait_until(lambda: proofid_seq50 in get_proof_ids(node)) | self.wait_until(lambda: proofid_seq50 in get_proof_ids(node)) | ||||
assert proofid_seq40 not in get_proof_ids(node) | assert proofid_seq40 not in get_proof_ids(node) | ||||
def reject_proof(proofid): | def reject_proof(proofid): | ||||
self.wait_until( | self.wait_until( | ||||
lambda: can_find_proof_in_poll( | lambda: can_find_proof_in_poll( | ||||
proofid, response=AvalancheVoteError.INVALID)) | proofid, response=AvalancheVoteError.INVALID)) | ||||
Show All 31 Lines |