88#
99
1010from decimal import Decimal
11+ from typing import List
1112
1213from test_framework .blocktools import create_block_with_mnpayments
1314from 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+ )
1519from test_framework .util import assert_equal , force_finish_mnsync , p2p_port , softfork_active
1620
17- class Masternode (object ):
18- pass
19-
2021class 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 ):
0 commit comments