Skip to content

Commit

Permalink
Update ping when broadcasting our masternode data
Browse files Browse the repository at this point in the history
  • Loading branch information
galpHub committed Jan 11, 2021
1 parent 22e0fe6 commit e6f3533
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 16 deletions.
48 changes: 32 additions & 16 deletions divi/qa/rpc-tests/remotestart.py
Expand Up @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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]:
Expand Down
1 change: 1 addition & 0 deletions divi/qa/rpc-tests/test_runner.py
Expand Up @@ -97,6 +97,7 @@
'rest.py',
'rpcbind_test.py',
'remotestart.py',
'remotestart.py --outdated_ping',
'smartfees.py',
'sync.py',
'txn_doublespend.py',
Expand Down
10 changes: 10 additions & 0 deletions divi/src/activemasternode.cpp
Expand Up @@ -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;
}
2 changes: 2 additions & 0 deletions divi/src/activemasternode.h
Expand Up @@ -19,6 +19,7 @@
#define ACTIVE_MASTERNODE_STARTED 4

class CMasternodeBroadcast;
class CMasternodePing;
class CMasternodeConfig;
class CMasternodePaymentWinner;
class CMasternodeMan;
Expand Down Expand Up @@ -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;
Expand Down
15 changes: 15 additions & 0 deletions divi/src/rpcmasternode.cpp
Expand Up @@ -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;
Expand Down

0 comments on commit e6f3533

Please sign in to comment.