@@ -54,6 +54,8 @@ def disconnect_all(self):
5454 def register_masternode (self , from_node , dmn , collateral_addr ):
5555 dmn .proTx = from_node .protx_register_fund (collateral_addr , dmn .ipport , dmn .owner ,
5656 dmn .operator , dmn .voting , dmn .payee )
57+ dmn .collateral = COutPoint (int (dmn .proTx , 16 ),
58+ get_collateral_vout (from_node .getrawtransaction (dmn .proTx , True )))
5759
5860 def run_test (self ):
5961 self .disable_mocktime ()
@@ -179,7 +181,21 @@ def run_test(self):
179181 proupserv2_txid = nodeA .protx_update_service (mnsA [2 ].proTx , "127.0.0.1:2000" )
180182 proupserv3_txid = nodeA .protx_update_service (pre_split_mn .proTx , "127.0.0.1:1001" )
181183
182- # Now nodeA has 4 proReg txes in its mempool, and 3 proUpServ txes
184+ # Send valid proUpReg tx to the mempool
185+ operator_to_reuse = nodeA .getnewaddress ()
186+ proupreg1_txid = nodeA .protx_update_registrar (mnsA [3 ].proTx , operator_to_reuse , "" , "" )
187+
188+ # Try sending another one, reusing the operator key used by another mempool proTx
189+ self .log .info ("Testing proUpReg in-mempool duplicate-operator-key rejection..." )
190+ assert_raises_rpc_error (- 26 , "protx-dup" , nodeA .protx_update_registrar ,
191+ mnsA [4 ].proTx , mempool_dmn1 .operator , "" , "" )
192+
193+ # Now send other two valid proUpServ txes to the mempool, without mining them
194+ new_voting_address = nodeA .getnewaddress ()
195+ proupreg2_txid = nodeA .protx_update_registrar (mnsA [4 ].proTx , "" , new_voting_address , "" )
196+ proupreg3_txid = nodeA .protx_update_registrar (pre_split_mn .proTx , "" , new_voting_address , "" )
197+
198+ # Now nodeA has 4 proReg txes in its mempool, 3 proUpServ txes, and 3 proUpReg txes
183199 mempoolA = nodeA .getrawmempool ()
184200 assert mempool_dmn1 .proTx in mempoolA
185201 assert mempool_dmn2 .proTx in mempoolA
@@ -188,6 +204,9 @@ def run_test(self):
188204 assert proupserv1_txid in mempoolA
189205 assert proupserv2_txid in mempoolA
190206 assert proupserv3_txid in mempoolA
207+ assert proupreg1_txid in mempoolA
208+ assert proupreg2_txid in mempoolA
209+ assert proupreg3_txid in mempoolA
191210
192211 assert_equal (nodeA .getblockcount (), 208 )
193212
@@ -230,13 +249,22 @@ def run_test(self):
230249 self .register_masternode (nodeB , dmn , collateral_addr )
231250 mnsB .append (dmn )
232251 nodeB .generate (1 )
252+ self .check_mn_list_on_node (1 , mnsB )
233253
234254 # Register one masternode reusing the IP of the proUpServ mempool tx on chainA
235- dmn1000 = create_new_dmn (0 , nodeB , collateral_addr , None )
255+ dmn1000 = create_new_dmn (free_idx , nodeB , collateral_addr , None )
256+ free_idx += 1
236257 dmn1000 .ipport = "127.0.0.1:1000"
237258 mnsB .append (dmn1000 )
238259 self .register_masternode (nodeB , dmn1000 , collateral_addr )
239260
261+ # Register one masternode reusing the operator-key of the proUpReg mempool tx on chainA
262+ dmnop = create_new_dmn (free_idx , nodeB , collateral_addr , None )
263+ free_idx += 1
264+ dmnop .operator = operator_to_reuse
265+ mnsB .append (dmnop )
266+ self .register_masternode (nodeB , dmnop , collateral_addr )
267+
240268 # Then mine 10 more blocks on chain B
241269 nodeB .generate (10 )
242270 self .check_mn_list_on_node (1 , mnsB )
@@ -275,6 +303,13 @@ def run_test(self):
275303 assert proupserv1_txid not in mempoolA
276304 assert proupserv2_txid not in mempoolA
277305 assert proupserv3_txid in mempoolA
306+ # The first mempool proUpReg tx has been removed as the operator key is
307+ # now used by a newly connected masternode.
308+ # The second mempool proUpReg tx has been removed as it was meant to update
309+ # a masternode that is not in the deterministic list anymore.
310+ assert proupreg1_txid not in mempoolA
311+ assert proupreg2_txid not in mempoolA
312+ assert proupreg3_txid in mempoolA
278313 # The mempool contains also all the ProReg from the disconnected blocks,
279314 # except the ones re-registered and replayed on chain B.
280315 for mn in mnsA :
@@ -291,8 +326,10 @@ def run_test(self):
291326 mnsB .append (mempool_dmn2 )
292327 mnsB .append (mempool_dmn3 )
293328 # proupserv3 has changed the IP of the pre_split masternode
329+ # and proupreg3 has changed its voting address
294330 mnsB .remove (pre_split_mn )
295331 pre_split_mn .ipport = "127.0.0.1:1001"
332+ pre_split_mn .voting = new_voting_address
296333 mnsB .append (pre_split_mn )
297334 # the ProReg txes, that were added back to the mempool from the
298335 # disconnected blocks, have been mined again
0 commit comments