2323 assert_raises_rpc_error ,
2424 bytes_to_hex_str ,
2525 create_new_dmn ,
26+ connect_nodes ,
2627 hex_str_to_bytes ,
28+ is_coin_locked_by ,
2729 spend_mn_collateral ,
2830)
2931
@@ -39,14 +41,13 @@ def set_test_params(self):
3941 self .extra_args = [["-nuparams=v5_shield:1" , "-nuparams=v6_evo:130" ]] * self .num_nodes
4042 self .extra_args [0 ].append ("-sporkkey=932HEevBSujW2ud7RfB1YF91AFygbBRQj3de3LyaCRqNzKKgWXi" )
4143
42- def add_new_dmn (self , mns , strType , op_keys = None , from_out = None , lock = True ):
44+ def add_new_dmn (self , mns , strType , op_keys = None , from_out = None ):
4345 mns .append (self .register_new_dmn (2 + len (mns ),
4446 self .minerPos ,
4547 self .controllerPos ,
4648 strType ,
4749 outpoint = from_out ,
48- op_addr_and_key = op_keys ,
49- fLock = lock ))
50+ op_addr_and_key = op_keys ))
5051
5152 def check_mn_list (self , mns ):
5253 for i in range (self .num_nodes ):
@@ -61,12 +62,21 @@ def get_last_paid_mn(self):
6162 return next (x ['proTxHash' ] for x in self .nodes [0 ].listmasternodes ()
6263 if x ['dmnstate' ]['lastPaidHeight' ] == self .nodes [0 ].getblockcount ())
6364
64- def create_block (self , mn_payee_script , height , prevhash ):
65- coinbase = create_coinbase (height )
65+ def create_block (self , mn_payee_script , prev_block ):
66+ coinbase = create_coinbase (prev_block [ " height" ] + 1 )
6667 coinbase .vout [0 ].nValue -= 3 * COIN
6768 coinbase .vout .append (CTxOut (int (3 * COIN ), hex_str_to_bytes (mn_payee_script )))
6869 coinbase .rehash ()
69- return create_block (int (prevhash , 16 ), coinbase , nVersion = 10 )
70+ return create_block (int (prev_block ["hash" ], 16 ),
71+ coinbase ,
72+ hashFinalSaplingRoot = int (prev_block ["finalsaplingroot" ], 16 ),
73+ nVersion = 10 )
74+
75+ def restart_controller (self ):
76+ self .restart_node (self .controllerPos , extra_args = self .extra_args [self .controllerPos ])
77+ self .connect_to_all (self .controllerPos )
78+ connect_nodes (self .nodes [self .controllerPos ], self .minerPos )
79+ self .sync_all ()
7080
7181 def wait_until_mnsync_completed (self ):
7282 SYNC_FINISHED = [999 ] * self .num_nodes
@@ -111,11 +121,14 @@ def run_test(self):
111121 assert_raises_rpc_error (- 1 , "Evo upgrade is not active yet" , self .add_new_dmn , mns , "fund" )
112122 # Can create the raw proReg
113123 dmn = create_new_dmn (2 , controller , dummy_add , None )
114- tx , sig = self .protx_register_ext (miner , controller , dmn , None , False , False )
124+ tx , sig = self .protx_register_ext (miner , controller , dmn , None , False )
115125 # but cannot send it
116126 assert_raises_rpc_error (- 1 , "Evo upgrade is not active yet" , miner .protx_register_submit , tx , sig )
117127 self .log .info ("Done. Now mine blocks till enforcement..." )
118128
129+ # Check that no coin has been locked by the controller yet
130+ assert_equal (len (controller .listlockunspent ()), 0 )
131+
119132 # DIP3 activates at block 130.
120133 miner .generate (130 - miner .getblockcount ())
121134 self .sync_blocks ()
@@ -162,6 +175,17 @@ def run_test(self):
162175 ["Ready" ] * (self .num_nodes - 2 ))
163176 self .log .info ("All masternodes ready." )
164177
178+ # Restart the controller and check that the collaterals are still locked
179+ self .log .info ("Restarting controller..." )
180+ self .restart_controller ()
181+ time .sleep (1 )
182+ for mn in mns :
183+ if not is_coin_locked_by (controller , mn .collateral ):
184+ raise Exception (
185+ "Collateral %s of mn with idx=%d is not locked" % (mn .collateral , mn .idx )
186+ )
187+ self .log .info ("Collaterals still locked." )
188+
165189 # Test collateral spending
166190 dmn = mns .pop (randrange (len (mns ))) # pop one at random
167191 self .log .info ("Spending collateral of mn with idx=%d..." % dmn .idx )
@@ -179,8 +203,7 @@ def run_test(self):
179203 dmn2_keys = [dmn2 .operator , dmn2 .operator_key ]
180204 self .log .info ("Reactivating node %d reusing the collateral of node %d..." % (dmn .idx , dmn2 .idx ))
181205 mns .append (self .register_new_dmn (dmn .idx , self .minerPos , self .controllerPos , "external" ,
182- outpoint = dmn2 .collateral , op_addr_and_key = dmn_keys ,
183- fLock = False ))
206+ outpoint = dmn2 .collateral , op_addr_and_key = dmn_keys ))
184207 miner .generate (1 )
185208 self .sync_blocks ()
186209 self .check_mn_list (mns )
@@ -196,20 +219,20 @@ def run_test(self):
196219 self .log .info ("Trying duplicate operator key..." )
197220 dmn2b = create_new_dmn (dmn2 .idx , controller , dummy_add , dmn_keys )
198221 assert_raises_rpc_error (- 1 , "bad-protx-dup-operator-key" ,
199- self .protx_register_fund , miner , controller , dmn2b , dummy_add , False )
222+ self .protx_register_fund , miner , controller , dmn2b , dummy_add )
200223
201224 # Now try with duplicate owner key
202225 self .log .info ("Trying duplicate owner key..." )
203226 dmn2c = create_new_dmn (dmn2 .idx , controller , dummy_add , dmn2_keys )
204227 dmn2c .owner = mns [randrange (len (mns ))].owner
205228 assert_raises_rpc_error (- 1 , "bad-protx-dup-owner-key" ,
206- self .protx_register_fund , miner , controller , dmn2c , dummy_add , False )
229+ self .protx_register_fund , miner , controller , dmn2c , dummy_add )
207230
208231 # Finally, register it properly. This time setting 10% of the reward for the operator
209232 op_rew = {"reward" : 10.00 , "address" : self .nodes [dmn2 .idx ].getnewaddress ()}
210233 self .log .info ("Reactivating the node with a new registration (with operator reward)..." )
211234 dmn2c = create_new_dmn (dmn2 .idx , controller , dummy_add , dmn2_keys )
212- self .protx_register_fund (miner , controller , dmn2c , dummy_add , True , op_rew )
235+ self .protx_register_fund (miner , controller , dmn2c , dummy_add , op_rew )
213236 mns .append (dmn2c )
214237 time .sleep (1 )
215238 self .sync_mempools ([miner , controller ])
@@ -244,7 +267,7 @@ def run_test(self):
244267 self .wait_until_mnsync_completed () # just to be sure
245268 self .log .info ("Testing invalid masternode payment..." )
246269 mn_payee_script = miner .validateaddress (miner .getnewaddress ())['scriptPubKey' ]
247- block = self .create_block (mn_payee_script , miner .getblockcount (), miner .getbestblockhash ())
270+ block = self .create_block (mn_payee_script , miner .getblock ( miner .getbestblockhash (), True ))
248271 block .solve ()
249272 assert_equal (miner .submitblock (bytes_to_hex_str (block .serialize ())), "bad-cb-payee" )
250273
0 commit comments