diff --git a/divi/qa/rpc-tests/remotestart.py b/divi/qa/rpc-tests/remotestart.py index e09870c7e..04fa1e997 100755 --- a/divi/qa/rpc-tests/remotestart.py +++ b/divi/qa/rpc-tests/remotestart.py @@ -29,10 +29,30 @@ def __init__ (self): super ().__init__ () self.base_args = ["-debug"] + def add_options(self, parser): + parser.add_option("--outdated_ping", dest="outdated_ping", default=False, action="store_true", + help="Test outdated ping recovery") def setup_chain (self): for i in range (7): initialize_datadir (self.options.tmpdir, i) + def connect_all_nodes(self): + connect_nodes (self.nodes[1], 2) + connect_nodes (self.nodes[2], 1) + connect_nodes (self.nodes[1], 4) + connect_nodes (self.nodes[1], 5) + connect_nodes (self.nodes[1], 6) + connect_nodes (self.nodes[2], 4) + connect_nodes (self.nodes[2], 5) + connect_nodes (self.nodes[2], 6) + connect_nodes (self.nodes[3], 4) + connect_nodes (self.nodes[3], 5) + connect_nodes (self.nodes[3], 6) + connect_nodes (self.nodes[4], 5) + connect_nodes (self.nodes[4], 6) + connect_nodes (self.nodes[5], 6) + connect_nodes (self.nodes[0], 3) + def setup_network (self, config_line=None, extra_args=[]): # Initially we just start the funding and mining nodes @@ -50,21 +70,7 @@ def setup_network (self, config_line=None, extra_args=[]): assert self.time < time.time () set_node_times (self.nodes, self.time) - connect_nodes (self.nodes[1], 2) - connect_nodes (self.nodes[2], 1) - connect_nodes (self.nodes[1], 4) - connect_nodes (self.nodes[1], 5) - connect_nodes (self.nodes[1], 6) - connect_nodes (self.nodes[2], 4) - connect_nodes (self.nodes[2], 5) - connect_nodes (self.nodes[2], 6) - connect_nodes (self.nodes[3], 4) - connect_nodes (self.nodes[3], 5) - connect_nodes (self.nodes[3], 6) - connect_nodes (self.nodes[4], 5) - connect_nodes (self.nodes[4], 6) - connect_nodes (self.nodes[5], 6) - connect_nodes (self.nodes[0], 3) + self.connect_all_nodes() self.is_network_split = False @@ -195,12 +201,22 @@ def start_masternodes (self): # Activate the masternodes. We do not need to keep the # cold node online. + if self.options.outdated_ping: + # Broadcasting nodes perceive the ping as being out of date but not + # the broadcast itself + self.time += 2*60*60 + set_node_times(self.nodes[1:3],self.time) + self.connect_all_nodes() + for i in range(1,3): copyOfSig = str(self.sigs[i-1]) copyOfData = str(self.setup[i-1].broadcast_data) self.stop_node(i) self.start_node (i,True) - result = self.nodes[0].broadcaststartmasternode(copyOfData, copyOfSig) + if self.options.outdated_ping: + result = self.nodes[i].broadcaststartmasternode(copyOfData, copyOfSig) + else: + result = self.nodes[0].broadcaststartmasternode(copyOfData, copyOfSig) assert_equal(result["status"], "success") self.attempt_mnsync() for i in [1, 2]: diff --git a/divi/qa/rpc-tests/test_runner.py b/divi/qa/rpc-tests/test_runner.py index 1d8e9fcbc..d2e931694 100755 --- a/divi/qa/rpc-tests/test_runner.py +++ b/divi/qa/rpc-tests/test_runner.py @@ -97,6 +97,7 @@ 'rest.py', 'rpcbind_test.py', 'remotestart.py', + 'remotestart.py --outdated_ping', 'smartfees.py', 'sync.py', 'txn_doublespend.py', diff --git a/divi/src/activemasternode.cpp b/divi/src/activemasternode.cpp index 411502322..87ac38872 100644 --- a/divi/src/activemasternode.cpp +++ b/divi/src/activemasternode.cpp @@ -240,4 +240,14 @@ bool CActiveMasternode::IsOurBroadcast(const CMasternodeBroadcast& mnb, bool che return fMasterNode_ && (checkConfig && vin== CTxIn())? IsThisMasternodeCollateral(mnb.vin) : mnb.vin.prevout == vin.prevout && mnb.pubKeyMasternode == pubKeyMasternode; +} +bool CActiveMasternode::UpdatePing(CMasternodePing& mnp) const +{ + CMasternodePing updatedPing(mnp.vin); + if(updatedPing.SignAndVerify(masternodeKey_,pubKeyMasternode,true)) + { + CMasternodePing().swap(mnp,updatedPing); + return true; + } + return false; } \ No newline at end of file diff --git a/divi/src/activemasternode.h b/divi/src/activemasternode.h index e6fe65ace..a65cebbc9 100644 --- a/divi/src/activemasternode.h +++ b/divi/src/activemasternode.h @@ -19,6 +19,7 @@ #define ACTIVE_MASTERNODE_STARTED 4 class CMasternodeBroadcast; +class CMasternodePing; class CMasternodeConfig; class CMasternodePaymentWinner; class CMasternodeMan; @@ -61,6 +62,7 @@ class CActiveMasternode bool EnableHotColdMasterNode(CTxIn& vin, CService& addr); bool SignMasternodeWinner(CMasternodePaymentWinner& winner) const; bool IsOurBroadcast(const CMasternodeBroadcast& mnb, bool checkConfig = false) const; + bool UpdatePing(CMasternodePing& mnp) const; }; extern CActiveMasternode activeMasternode; diff --git a/divi/src/rpcmasternode.cpp b/divi/src/rpcmasternode.cpp index 324b90ff8..d50b117c3 100644 --- a/divi/src/rpcmasternode.cpp +++ b/divi/src/rpcmasternode.cpp @@ -486,6 +486,21 @@ Value broadcaststartmasternode(const Array& params, bool fHelp) if(params.size()==2) { mnb.signature = ParseHex(params[1].get_str()); + if(activeMasternode.IsOurBroadcast(mnb,true)) + { + if(activeMasternode.UpdatePing(mnb.lastPing)) + { + LogPrint("masternode","Ping updated successfully!\n"); + } + else + { + LogPrint("masternode","Ping not updated! Failure to sign!\n"); + } + } + else + { + LogPrint("masternode","This broadcast does not belong to us!\n"); + } } Object result;