neobytes/src/masternode-sync.cpp

159 lines
5.2 KiB
C++
Raw Normal View History

2015-07-15 04:44:58 +02:00
// Copyright (c) 2014-2015 The Dash developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "main.h"
#include "masternode-sync.h"
#include "masternode.h"
#include "masternodeman.h"
2015-07-15 04:44:58 +02:00
#include "util.h"
#include "addrman.h"
class CMasternodeSync;
CMasternodeSync masternodeSync;
CMasternodeSync::CMasternodeSync()
{
lastMasternodeList = 0;
lastMasternodeWinner = 0;
lastBudgetItem = 0;
RequestedMasternodeAssets = MASTERNODE_SYNC_INITIAL;
2015-07-15 04:44:58 +02:00
RequestedMasternodeAttempt = 0;
}
bool CMasternodeSync::IsSynced()
{
return (RequestedMasternodeAssets == MASTERNODE_SYNC_FINISHED);
2015-07-15 04:44:58 +02:00
}
void CMasternodeSync::AddedMasternodeList()
{
lastMasternodeList = GetTime();
}
void CMasternodeSync::AddedMasternodeWinner()
{
lastMasternodeWinner = GetTime();
}
void CMasternodeSync::AddedBudgetItem()
{
lastBudgetItem = GetTime();
}
void CMasternodeSync::GetNextAsset()
{
switch(RequestedMasternodeAssets)
{
case(MASTERNODE_SYNC_INITIAL):
RequestedMasternodeAssets = MASTERNODE_SYNC_SPORKS;
break;
case(MASTERNODE_SYNC_SPORKS):
2015-07-15 04:44:58 +02:00
RequestedMasternodeAssets = MASTERNODE_SYNC_LIST;
break;
case(MASTERNODE_SYNC_LIST):
RequestedMasternodeAssets = MASTERNODE_SYNC_MNW;
break;
case(MASTERNODE_SYNC_MNW):
RequestedMasternodeAssets = MASTERNODE_SYNC_BUDGET;
break;
case(MASTERNODE_SYNC_BUDGET):
RequestedMasternodeAssets = MASTERNODE_SYNC_FINISHED;
2015-07-15 04:44:58 +02:00
break;
}
RequestedMasternodeAttempt = 0;
2015-07-15 04:44:58 +02:00
}
void CMasternodeSync::Process()
2015-07-15 04:44:58 +02:00
{
static int c = 0;
2015-07-15 04:44:58 +02:00
if(IsSynced()) return;
if(c++ % MASTERNODE_SYNC_TIMEOUT != 0) return;
if(fDebug) LogPrintf("CMasternodeSync::Process() - RequestedMasternodeAssets %d c %d\n", RequestedMasternodeAssets, c);
2015-07-15 04:44:58 +02:00
//request full mn list only if Masternodes.dat was updated quite a long time ago
if(RequestedMasternodeAssets == MASTERNODE_SYNC_INITIAL) GetNextAsset();
2015-07-15 04:44:58 +02:00
CBlockIndex* pindexPrev = chainActive.Tip();
if(pindexPrev == NULL) return;
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
{
if (pnode->nVersion >= MIN_POOL_PEER_PROTO_VERSION)
2015-07-15 04:44:58 +02:00
{
if(RequestedMasternodeAssets == MASTERNODE_SYNC_SPORKS){
if(pnode->HasFulfilledRequest("getspork")) continue;
pnode->FulfilledRequest("getspork");
if(RequestedMasternodeAttempt <= 2){
pnode->PushMessage("getsporks"); //get current network sporks
if(RequestedMasternodeAttempt == 2) GetNextAsset();
RequestedMasternodeAttempt++;
}
return;
}
2015-07-15 04:44:58 +02:00
if(IsInitialBlockDownload()) return;
2015-07-15 04:44:58 +02:00
if(RequestedMasternodeAssets == MASTERNODE_SYNC_LIST){
if(lastMasternodeList > 0 && lastMasternodeList < GetTime() - MASTERNODE_SYNC_TIMEOUT){ //hasn't received a new item in the last five seconds, so we'll move to the
GetNextAsset();
2015-07-15 04:44:58 +02:00
return;
}
if(pnode->HasFulfilledRequest("mnsync")) continue;
pnode->FulfilledRequest("mnsync");
2015-07-15 04:44:58 +02:00
if((lastMasternodeList == 0 || lastMasternodeList > GetTime() - MASTERNODE_SYNC_TIMEOUT)
&& RequestedMasternodeAttempt <= 2){
mnodeman.DsegUpdate(pnode);
RequestedMasternodeAttempt++;
}
return;
}
2015-07-15 04:44:58 +02:00
if(RequestedMasternodeAssets == MASTERNODE_SYNC_MNW){
if(lastMasternodeWinner > 0 && lastMasternodeWinner < GetTime() - MASTERNODE_SYNC_TIMEOUT){ //hasn't received a new item in the last five seconds, so we'll move to the
GetNextAsset();
2015-07-15 04:44:58 +02:00
return;
}
if(pnode->HasFulfilledRequest("mnwsync")) continue;
pnode->FulfilledRequest("mnwsync");
if((lastMasternodeWinner == 0 || lastMasternodeWinner > GetTime() - MASTERNODE_SYNC_TIMEOUT)
&& RequestedMasternodeAttempt <= 2){
pnode->PushMessage("mnget"); //sync payees
RequestedMasternodeAttempt++;
}
return;
}
if(RequestedMasternodeAssets == MASTERNODE_SYNC_BUDGET){
if(lastBudgetItem > 0 && lastBudgetItem < GetTime() - MASTERNODE_SYNC_TIMEOUT){ //hasn't received a new item in the last five seconds, so we'll move to the
GetNextAsset();
2015-07-15 04:44:58 +02:00
return;
}
if(pnode->HasFulfilledRequest("busync")) continue;
pnode->FulfilledRequest("busync");
if((lastBudgetItem == 0 || lastBudgetItem > GetTime() - MASTERNODE_SYNC_TIMEOUT)
&& RequestedMasternodeAttempt <= 2){
uint256 n = 0;
pnode->PushMessage("mnvs", n); //sync masternode votes
RequestedMasternodeAttempt++;
}
return;
2015-07-15 04:44:58 +02:00
}
2015-07-15 04:44:58 +02:00
}
}
}