mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 12:32:48 +01:00
Allow to pass list of online masternodes to mine_quorum
This commit is contained in:
parent
dfe9daabd9
commit
908eb8372b
@ -771,10 +771,10 @@ class DashTestFramework(BitcoinTestFramework):
|
|||||||
return all(node.spork('show') == sporks for node in self.nodes[1:])
|
return all(node.spork('show') == sporks for node in self.nodes[1:])
|
||||||
wait_until(check_sporks_same, timeout=timeout, sleep=0.5)
|
wait_until(check_sporks_same, timeout=timeout, sleep=0.5)
|
||||||
|
|
||||||
def wait_for_quorum_connections(self, expected_connections=2, timeout = 60, wait_proc=None):
|
def wait_for_quorum_connections(self, expected_connections, nodes, timeout = 60, wait_proc=None):
|
||||||
def check_quorum_connections():
|
def check_quorum_connections():
|
||||||
all_ok = True
|
all_ok = True
|
||||||
for node in self.nodes:
|
for node in nodes:
|
||||||
s = node.quorum("dkgstatus")
|
s = node.quorum("dkgstatus")
|
||||||
if s["session"] == {}:
|
if s["session"] == {}:
|
||||||
continue
|
continue
|
||||||
@ -797,11 +797,11 @@ class DashTestFramework(BitcoinTestFramework):
|
|||||||
return all_ok
|
return all_ok
|
||||||
wait_until(check_quorum_connections, timeout=timeout, sleep=1)
|
wait_until(check_quorum_connections, timeout=timeout, sleep=1)
|
||||||
|
|
||||||
def wait_for_quorum_phase(self, quorum_hash, phase, expected_member_count, check_received_messages, check_received_messages_count, timeout=30, sleep=0.1):
|
def wait_for_quorum_phase(self, quorum_hash, phase, expected_member_count, check_received_messages, check_received_messages_count, mninfos, timeout=30, sleep=0.1):
|
||||||
def check_dkg_session():
|
def check_dkg_session():
|
||||||
all_ok = True
|
all_ok = True
|
||||||
member_count = 0
|
member_count = 0
|
||||||
for mn in self.mninfo:
|
for mn in mninfos:
|
||||||
s = mn.node.quorum("dkgstatus")["session"]
|
s = mn.node.quorum("dkgstatus")["session"]
|
||||||
if "llmq_test" not in s:
|
if "llmq_test" not in s:
|
||||||
continue
|
continue
|
||||||
@ -825,10 +825,10 @@ class DashTestFramework(BitcoinTestFramework):
|
|||||||
return all_ok
|
return all_ok
|
||||||
wait_until(check_dkg_session, timeout=timeout, sleep=sleep)
|
wait_until(check_dkg_session, timeout=timeout, sleep=sleep)
|
||||||
|
|
||||||
def wait_for_quorum_commitment(self, quorum_hash, timeout = 15):
|
def wait_for_quorum_commitment(self, quorum_hash, nodes, timeout = 15):
|
||||||
def check_dkg_comitments():
|
def check_dkg_comitments():
|
||||||
all_ok = True
|
all_ok = True
|
||||||
for node in self.nodes:
|
for node in nodes:
|
||||||
s = node.quorum("dkgstatus")
|
s = node.quorum("dkgstatus")
|
||||||
if "minableCommitments" not in s:
|
if "minableCommitments" not in s:
|
||||||
all_ok = False
|
all_ok = False
|
||||||
@ -844,92 +844,96 @@ class DashTestFramework(BitcoinTestFramework):
|
|||||||
return all_ok
|
return all_ok
|
||||||
wait_until(check_dkg_comitments, timeout=timeout, sleep=0.1)
|
wait_until(check_dkg_comitments, timeout=timeout, sleep=0.1)
|
||||||
|
|
||||||
def mine_quorum(self, expected_members=None, expected_connections=2, expected_contributions=None, expected_complaints=0, expected_justifications=0, expected_commitments=None):
|
def mine_quorum(self, expected_members=None, expected_connections=2, expected_contributions=None, expected_complaints=0, expected_justifications=0, expected_commitments=None, mninfos=None):
|
||||||
if expected_members is None:
|
if expected_members is None:
|
||||||
expected_members = self.llmq_size
|
expected_members = self.llmq_size
|
||||||
if expected_contributions is None:
|
if expected_contributions is None:
|
||||||
expected_contributions = self.llmq_size
|
expected_contributions = self.llmq_size
|
||||||
if expected_commitments is None:
|
if expected_commitments is None:
|
||||||
expected_commitments = self.llmq_size
|
expected_commitments = self.llmq_size
|
||||||
|
if mninfos is None:
|
||||||
|
mninfos = self.mninfo
|
||||||
|
|
||||||
self.log.info("Mining quorum: expected_members=%d, expected_contributions=%d, expected_complaints=%d, expected_justifications=%d, "
|
self.log.info("Mining quorum: expected_members=%d, expected_contributions=%d, expected_complaints=%d, expected_justifications=%d, "
|
||||||
"expected_commitments=%d" % (expected_members, expected_contributions, expected_complaints,
|
"expected_commitments=%d" % (expected_members, expected_contributions, expected_complaints,
|
||||||
expected_justifications, expected_commitments))
|
expected_justifications, expected_commitments))
|
||||||
|
|
||||||
|
nodes = [self.nodes[0]] + [mn.node for mn in mninfos]
|
||||||
|
|
||||||
quorums = self.nodes[0].quorum("list")
|
quorums = self.nodes[0].quorum("list")
|
||||||
|
|
||||||
# move forward to next DKG
|
# move forward to next DKG
|
||||||
skip_count = 24 - (self.nodes[0].getblockcount() % 24)
|
skip_count = 24 - (self.nodes[0].getblockcount() % 24)
|
||||||
if skip_count != 0:
|
if skip_count != 0:
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
set_node_times(self.nodes, self.mocktime)
|
set_node_times(nodes, self.mocktime)
|
||||||
self.nodes[0].generate(skip_count)
|
self.nodes[0].generate(skip_count)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(nodes)
|
||||||
|
|
||||||
q = self.nodes[0].getbestblockhash()
|
q = self.nodes[0].getbestblockhash()
|
||||||
|
|
||||||
self.log.info("Waiting for phase 1 (init)")
|
self.log.info("Waiting for phase 1 (init)")
|
||||||
def bump_time():
|
def bump_time():
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
set_node_times(self.nodes, self.mocktime)
|
set_node_times(nodes, self.mocktime)
|
||||||
self.wait_for_quorum_phase(q, 1, expected_members, None, 0)
|
self.wait_for_quorum_phase(q, 1, expected_members, None, 0, mninfos)
|
||||||
self.wait_for_quorum_connections(expected_connections=expected_connections, wait_proc=bump_time)
|
self.wait_for_quorum_connections(expected_connections, nodes, wait_proc=bump_time)
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
set_node_times(self.nodes, self.mocktime)
|
set_node_times(nodes, self.mocktime)
|
||||||
self.nodes[0].generate(2)
|
self.nodes[0].generate(2)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(nodes)
|
||||||
|
|
||||||
self.log.info("Waiting for phase 2 (contribute)")
|
self.log.info("Waiting for phase 2 (contribute)")
|
||||||
self.wait_for_quorum_phase(q, 2, expected_members, "receivedContributions", expected_contributions)
|
self.wait_for_quorum_phase(q, 2, expected_members, "receivedContributions", expected_contributions, mninfos)
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
set_node_times(self.nodes, self.mocktime)
|
set_node_times(nodes, self.mocktime)
|
||||||
self.nodes[0].generate(2)
|
self.nodes[0].generate(2)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(nodes)
|
||||||
|
|
||||||
self.log.info("Waiting for phase 3 (complain)")
|
self.log.info("Waiting for phase 3 (complain)")
|
||||||
self.wait_for_quorum_phase(q, 3, expected_members, "receivedComplaints", expected_complaints)
|
self.wait_for_quorum_phase(q, 3, expected_members, "receivedComplaints", expected_complaints, mninfos)
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
set_node_times(self.nodes, self.mocktime)
|
set_node_times(nodes, self.mocktime)
|
||||||
self.nodes[0].generate(2)
|
self.nodes[0].generate(2)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(nodes)
|
||||||
|
|
||||||
self.log.info("Waiting for phase 4 (justify)")
|
self.log.info("Waiting for phase 4 (justify)")
|
||||||
self.wait_for_quorum_phase(q, 4, expected_members, "receivedJustifications", expected_justifications)
|
self.wait_for_quorum_phase(q, 4, expected_members, "receivedJustifications", expected_justifications, mninfos)
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
set_node_times(self.nodes, self.mocktime)
|
set_node_times(nodes, self.mocktime)
|
||||||
self.nodes[0].generate(2)
|
self.nodes[0].generate(2)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(nodes)
|
||||||
|
|
||||||
self.log.info("Waiting for phase 5 (commit)")
|
self.log.info("Waiting for phase 5 (commit)")
|
||||||
self.wait_for_quorum_phase(q, 5, expected_members, "receivedPrematureCommitments", expected_commitments)
|
self.wait_for_quorum_phase(q, 5, expected_members, "receivedPrematureCommitments", expected_commitments, mninfos)
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
set_node_times(self.nodes, self.mocktime)
|
set_node_times(nodes, self.mocktime)
|
||||||
self.nodes[0].generate(2)
|
self.nodes[0].generate(2)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(nodes)
|
||||||
|
|
||||||
self.log.info("Waiting for phase 6 (mining)")
|
self.log.info("Waiting for phase 6 (mining)")
|
||||||
self.wait_for_quorum_phase(q, 6, expected_members, None, 0)
|
self.wait_for_quorum_phase(q, 6, expected_members, None, 0, mninfos)
|
||||||
|
|
||||||
self.log.info("Waiting final commitment")
|
self.log.info("Waiting final commitment")
|
||||||
self.wait_for_quorum_commitment(q)
|
self.wait_for_quorum_commitment(q, nodes)
|
||||||
|
|
||||||
self.log.info("Mining final commitment")
|
self.log.info("Mining final commitment")
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
set_node_times(self.nodes, self.mocktime)
|
set_node_times(nodes, self.mocktime)
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
while quorums == self.nodes[0].quorum("list"):
|
while quorums == self.nodes[0].quorum("list"):
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
set_node_times(self.nodes, self.mocktime)
|
set_node_times(nodes, self.mocktime)
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(nodes)
|
||||||
new_quorum = self.nodes[0].quorum("list", 1)["llmq_test"][0]
|
new_quorum = self.nodes[0].quorum("list", 1)["llmq_test"][0]
|
||||||
quorum_info = self.nodes[0].quorum("info", 100, new_quorum)
|
quorum_info = self.nodes[0].quorum("info", 100, new_quorum)
|
||||||
|
|
||||||
# Mine 8 (SIGN_HEIGHT_OFFSET) more blocks to make sure that the new quorum gets eligable for signing sessions
|
# Mine 8 (SIGN_HEIGHT_OFFSET) more blocks to make sure that the new quorum gets eligable for signing sessions
|
||||||
self.nodes[0].generate(8)
|
self.nodes[0].generate(8)
|
||||||
|
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(nodes)
|
||||||
|
|
||||||
self.log.info("New quorum: height=%d, quorumHash=%s, minedBlock=%s" % (quorum_info["height"], new_quorum, quorum_info["minedBlock"]))
|
self.log.info("New quorum: height=%d, quorumHash=%s, minedBlock=%s" % (quorum_info["height"], new_quorum, quorum_info["minedBlock"]))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user