Skip to content

Commit dfca0ee

Browse files
committed
refactor: use MasternodeInfo in feature_dip3_deterministicmns.py
Harmonize with the rest of the codebase
1 parent cd7ffcf commit dfca0ee

File tree

2 files changed

+54
-55
lines changed

2 files changed

+54
-55
lines changed

test/functional/feature_dip3_deterministicmns.py

Lines changed: 51 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@
88
#
99

1010
from decimal import Decimal
11+
from typing import List
1112

1213
from test_framework.blocktools import create_block_with_mnpayments
1314
from test_framework.messages import tx_from_hex
14-
from test_framework.test_framework import BitcoinTestFramework
15+
from test_framework.test_framework import (
16+
BitcoinTestFramework,
17+
MasternodeInfo,
18+
)
1519
from test_framework.util import assert_equal, force_finish_mnsync, p2p_port, softfork_active
1620

17-
class Masternode(object):
18-
pass
19-
2021
class DIP3Test(BitcoinTestFramework):
2122
def set_test_params(self):
2223
self.num_initial_mn = 11 # Should be >= 11 to make sure quorums are not always the same MNs
@@ -56,11 +57,11 @@ def run_test(self):
5657
self.log.info("testing rejection of ProTx before dip3 activation")
5758
assert self.nodes[0].getblockchaininfo()['blocks'] < 135
5859

59-
mns = []
60+
mns: List[MasternodeInfo] = []
6061

6162
# prepare mn which should still be accepted later when dip3 activates
6263
self.log.info("creating collateral for mn-before-dip3")
63-
before_dip3_mn = self.prepare_mn(self.nodes[0], 1, 'mn-before-dip3')
64+
before_dip3_mn: MasternodeInfo = self.prepare_mn(self.nodes[0], 1, 'mn-before-dip3')
6465
self.create_mn_collateral(self.nodes[0], before_dip3_mn)
6566
mns.append(before_dip3_mn)
6667

@@ -82,7 +83,7 @@ def run_test(self):
8283

8384
self.log.info("registering MNs")
8485
for i in range(self.num_initial_mn):
85-
mn = self.prepare_mn(self.nodes[0], i + 2, "mn-%d" % i)
86+
mn: MasternodeInfo = self.prepare_mn(self.nodes[0], i + 2, "mn-%d" % i)
8687
mns.append(mn)
8788

8889
# start a few MNs before they are registered and a few after they are registered
@@ -93,12 +94,12 @@ def run_test(self):
9394
# let a few of the protx MNs refer to the existing collaterals
9495
fund = (i % 2) == 0
9596
if fund:
96-
self.log.info("register_fund %s" % mn.alias)
97+
self.log.info(f"register_fund {mn.friendlyName}")
9798
self.register_fund_mn(self.nodes[0], mn)
9899
else:
99-
self.log.info("create_collateral %s" % mn.alias)
100+
self.log.info(f"create_collateral {mn.friendlyName}")
100101
self.create_mn_collateral(self.nodes[0], mn)
101-
self.log.info("register %s" % mn.alias)
102+
self.log.info(f"register {mn.friendlyName}")
102103
self.register_mn(self.nodes[0], mn)
103104

104105
self.generate(self.nodes[0], 1, sync_fun=self.no_op)
@@ -117,7 +118,7 @@ def run_test(self):
117118
old_tip = self.nodes[0].getblockcount()
118119
old_listdiff = self.nodes[0].protx("listdiff", 1, old_tip)
119120
for i in range(spend_mns_count):
120-
old_protx_hash = mns[i].protx_hash
121+
old_protx_hash = mns[i].proTxHash
121122
old_collateral_address = mns[i].collateral_address
122123
old_blockhash = self.nodes[0].getbestblockhash()
123124
old_rpc_info = self.nodes[0].protx("info", old_protx_hash)
@@ -187,7 +188,7 @@ def run_test(self):
187188
mn = mns[i]
188189
# a few of these will actually refer to old ProRegTx internal collaterals,
189190
# which should work the same as external collaterals
190-
new_mn = self.prepare_mn(self.nodes[0], mn.idx, mn.alias)
191+
new_mn: MasternodeInfo = self.prepare_mn(self.nodes[0], mn.nodeIdx, mn.friendlyName)
191192
new_mn.collateral_address = mn.collateral_address
192193
new_mn.collateral_txid = mn.collateral_txid
193194
new_mn.collateral_vout = mn.collateral_vout
@@ -196,46 +197,42 @@ def run_test(self):
196197
mns[i] = new_mn
197198
self.generate(self.nodes[0], 1)
198199
self.assert_mnlists(mns)
199-
self.log.info("restarting MN %s" % new_mn.alias)
200-
self.stop_node(new_mn.idx)
200+
self.log.info(f"restarting MN {mn.friendlyName}")
201+
self.stop_node(new_mn.nodeIdx)
201202
self.start_mn(new_mn)
202203
self.sync_all()
203204

204205
self.log.info("testing masternode status updates")
205206
# change voting address and see if changes are reflected in `masternode status` rpc output
206207
mn = mns[0]
207208
node = self.nodes[0]
208-
old_dmnState = mn.node.masternode("status")["dmnState"]
209+
old_dmnState = mn.get_node(self).masternode("status")["dmnState"]
209210
old_voting_address = old_dmnState["votingAddress"]
210211
new_voting_address = node.getnewaddress()
211212
assert old_voting_address != new_voting_address
212213
# also check if funds from payout address are used when no fee source address is specified
213214
node.sendtoaddress(mn.rewards_address, 0.001)
214-
node.protx('update_registrar' if softfork_active(node, 'v19') else 'update_registrar_legacy', mn.protx_hash, "", new_voting_address, "")
215+
node.protx('update_registrar' if softfork_active(node, 'v19') else 'update_registrar_legacy', mn.proTxHash, "", new_voting_address, "")
215216
self.generate(node, 1)
216-
new_dmnState = mn.node.masternode("status")["dmnState"]
217+
new_dmnState = mn.get_node(self).masternode("status")["dmnState"]
217218
new_voting_address_from_rpc = new_dmnState["votingAddress"]
218219
assert new_voting_address_from_rpc == new_voting_address
219220
# make sure payoutAddress is the same as before
220221
assert old_dmnState["payoutAddress"] == new_dmnState["payoutAddress"]
221222

222-
def prepare_mn(self, node, idx, alias):
223-
mn = Masternode()
224-
mn.idx = idx
225-
mn.alias = alias
226-
mn.p2p_port = p2p_port(mn.idx)
227-
mn.operator_reward = (mn.idx % self.num_initial_mn)
228-
223+
def prepare_mn(self, node, idx, alias) -> MasternodeInfo:
229224
blsKey = node.bls('generate') if softfork_active(node, 'v19') else node.bls('generate', True)
230-
mn.fundsAddr = node.getnewaddress()
231-
mn.ownerAddr = node.getnewaddress()
232-
mn.operatorAddr = blsKey['public']
233-
mn.votingAddr = mn.ownerAddr
234-
mn.blsMnkey = blsKey['secret']
235-
225+
fundsAddr = node.getnewaddress()
226+
ownerAddr = node.getnewaddress()
227+
operator_reward = (idx % self.num_initial_mn)
228+
229+
# proTxHash, rewards_address, collateral_address, collateral_address, collateral_txid, collateral_vout are set later
230+
mn = MasternodeInfo("", fundsAddr, ownerAddr, ownerAddr, "", operator_reward, blsKey['public'], blsKey['secret'], "", "", None,
231+
p2p_port(idx), False)
232+
mn.set_node(idx, alias)
236233
return mn
237234

238-
def create_mn_collateral(self, node, mn):
235+
def create_mn_collateral(self, node, mn: MasternodeInfo):
239236
mn.collateral_address = node.getnewaddress()
240237
mn.collateral_txid = node.sendtoaddress(mn.collateral_address, 1000)
241238
mn.collateral_vout = None
@@ -249,13 +246,13 @@ def create_mn_collateral(self, node, mn):
249246
assert mn.collateral_vout is not None
250247

251248
# register a protx MN and also fund it (using collateral inside ProRegTx)
252-
def register_fund_mn(self, node, mn):
249+
def register_fund_mn(self, node, mn: MasternodeInfo):
253250
node.sendtoaddress(mn.fundsAddr, 1000.001)
254251
mn.collateral_address = node.getnewaddress()
255252
mn.rewards_address = node.getnewaddress()
256253

257-
mn.protx_hash = node.protx('register_fund' if softfork_active(node, 'v19') else 'register_fund_legacy', mn.collateral_address, '127.0.0.1:%d' % mn.p2p_port, mn.ownerAddr, mn.operatorAddr, mn.votingAddr, mn.operator_reward, mn.rewards_address, mn.fundsAddr)
258-
mn.collateral_txid = mn.protx_hash
254+
mn.proTxHash = node.protx('register_fund' if softfork_active(node, 'v19') else 'register_fund_legacy', mn.collateral_address, '127.0.0.1:%d' % mn.nodePort, mn.ownerAddr, mn.pubKeyOperator, mn.votingAddr, mn.operator_reward, mn.rewards_address, mn.fundsAddr)
255+
mn.collateral_txid = mn.proTxHash
259256
mn.collateral_vout = None
260257

261258
rawtx = node.getrawtransaction(mn.collateral_txid, 1)
@@ -266,45 +263,45 @@ def register_fund_mn(self, node, mn):
266263
assert mn.collateral_vout is not None
267264

268265
# create a protx MN which refers to an existing collateral
269-
def register_mn(self, node, mn):
266+
def register_mn(self, node, mn: MasternodeInfo):
270267
node.sendtoaddress(mn.fundsAddr, 0.001)
271268
mn.rewards_address = node.getnewaddress()
272269

273-
mn.protx_hash = node.protx('register' if softfork_active(node, 'v19') else 'register_legacy', mn.collateral_txid, mn.collateral_vout, '127.0.0.1:%d' % mn.p2p_port, mn.ownerAddr, mn.operatorAddr, mn.votingAddr, mn.operator_reward, mn.rewards_address, mn.fundsAddr)
270+
mn.proTxHash = node.protx('register' if softfork_active(node, 'v19') else 'register_legacy', mn.collateral_txid, mn.collateral_vout, '127.0.0.1:%d' % mn.nodePort, mn.ownerAddr, mn.pubKeyOperator, mn.votingAddr, mn.operator_reward, mn.rewards_address, mn.fundsAddr)
274271
self.generate(node, 1, sync_fun=self.no_op)
275272

276-
def start_mn(self, mn):
277-
if len(self.nodes) <= mn.idx:
278-
self.add_nodes(mn.idx - len(self.nodes) + 1)
279-
assert len(self.nodes) == mn.idx + 1
280-
self.start_node(mn.idx, extra_args = self.extra_args + ['-masternodeblsprivkey=%s' % mn.blsMnkey])
281-
force_finish_mnsync(self.nodes[mn.idx])
282-
mn.node = self.nodes[mn.idx]
283-
self.connect_nodes(mn.idx, 0)
273+
def start_mn(self, mn: MasternodeInfo):
274+
assert mn.nodeIdx is not None, "nodeIdx must be set before starting masternode"
275+
if len(self.nodes) <= mn.nodeIdx:
276+
self.add_nodes(mn.nodeIdx - len(self.nodes) + 1)
277+
assert len(self.nodes) == mn.nodeIdx + 1
278+
self.start_node(mn.nodeIdx, extra_args = self.extra_args + ['-masternodeblsprivkey=%s' % mn.keyOperator])
279+
force_finish_mnsync(mn.get_node(self))
280+
self.connect_nodes(mn.nodeIdx, 0)
284281
self.sync_all()
285282

286-
def spend_mn_collateral(self, mn, with_dummy_input_output=False):
283+
def spend_mn_collateral(self, mn: MasternodeInfo, with_dummy_input_output=False):
287284
return self.spend_input(mn.collateral_txid, mn.collateral_vout, 1000, with_dummy_input_output)
288285

289-
def update_mn_payee(self, mn, payee):
286+
def update_mn_payee(self, mn: MasternodeInfo, payee):
290287
self.nodes[0].sendtoaddress(mn.fundsAddr, 0.001)
291-
self.nodes[0].protx('update_registrar' if softfork_active(self.nodes[0], 'v19') else 'update_registrar_legacy', mn.protx_hash, '', '', payee, mn.fundsAddr)
288+
self.nodes[0].protx('update_registrar' if softfork_active(self.nodes[0], 'v19') else 'update_registrar_legacy', mn.proTxHash, '', '', payee, mn.fundsAddr)
292289
self.generate(self.nodes[0], 1)
293-
info = self.nodes[0].protx('info', mn.protx_hash)
290+
info = self.nodes[0].protx('info', mn.proTxHash)
294291
assert info['state']['payoutAddress'] == payee
295292

296-
def test_protx_update_service(self, mn):
293+
def test_protx_update_service(self, mn: MasternodeInfo):
297294
self.nodes[0].sendtoaddress(mn.fundsAddr, 0.001)
298-
self.nodes[0].protx('update_service', mn.protx_hash, '127.0.0.2:%d' % mn.p2p_port, mn.blsMnkey, "", mn.fundsAddr)
295+
self.nodes[0].protx('update_service', mn.proTxHash, '127.0.0.2:%d' % mn.nodePort, mn.keyOperator, "", mn.fundsAddr)
299296
self.generate(self.nodes[0], 1)
300297
for node in self.nodes:
301-
protx_info = node.protx('info', mn.protx_hash)
298+
protx_info = node.protx('info', mn.proTxHash)
302299
mn_list = node.masternode('list')
303-
assert_equal(protx_info['state']['service'], '127.0.0.2:%d' % mn.p2p_port)
304-
assert_equal(mn_list['%s-%d' % (mn.collateral_txid, mn.collateral_vout)]['address'], '127.0.0.2:%d' % mn.p2p_port)
300+
assert_equal(protx_info['state']['service'], '127.0.0.2:%d' % mn.nodePort)
301+
assert_equal(mn_list['%s-%d' % (mn.collateral_txid, mn.collateral_vout)]['address'], '127.0.0.2:%d' % mn.nodePort)
305302

306303
# undo
307-
self.nodes[0].protx('update_service', mn.protx_hash, '127.0.0.1:%d' % mn.p2p_port, mn.blsMnkey, "", mn.fundsAddr)
304+
self.nodes[0].protx('update_service', mn.proTxHash, '127.0.0.1:%d' % mn.nodePort, mn.keyOperator, "", mn.fundsAddr)
308305
self.generate(self.nodes[0], 1, sync_fun=self.no_op)
309306

310307
def assert_mnlists(self, mns):

test/functional/test_framework/test_framework.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1151,9 +1151,11 @@ def __init__(self, proTxHash, fundsAddr, ownerAddr, votingAddr, rewards_address,
11511151
self.nodePort = nodePort
11521152
self.evo = evo
11531153
self.nodeIdx = None
1154+
self.friendlyName=None
11541155

1155-
def set_node(self, nodeIdx):
1156+
def set_node(self, nodeIdx, friendlyName=None):
11561157
self.nodeIdx = nodeIdx
1158+
self.friendlyName = friendlyName or f"mn-{'evo' if self.evo else 'reg'}-{self.nodeIdx}"
11571159

11581160
def get_node(self, test: BitcoinTestFramework) -> TestNode:
11591161
if self.nodeIdx is None:

0 commit comments

Comments
 (0)