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"
2015-07-17 11:17:15 +02:00
# 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 ;
2015-07-17 12:26:24 +02:00
RequestedMasternodeAssets = MASTERNODE_SYNC_INITIAL ;
2015-07-15 04:44:58 +02:00
RequestedMasternodeAttempt = 0 ;
}
bool CMasternodeSync : : IsSynced ( )
{
2015-07-17 12:26:24 +02:00
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 )
{
2015-07-17 12:26:24 +02:00
case ( MASTERNODE_SYNC_INITIAL ) :
RequestedMasternodeAssets = MASTERNODE_SYNC_SPORKS ;
2015-07-17 05:03:42 +02:00
break ;
2015-07-17 12:26:24 +02:00
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 ) :
2015-07-17 12:26:24 +02:00
RequestedMasternodeAssets = MASTERNODE_SYNC_FINISHED ;
2015-07-15 04:44:58 +02:00
break ;
}
2015-07-17 11:17:15 +02:00
RequestedMasternodeAttempt = 0 ;
2015-07-15 04:44:58 +02:00
}
2015-07-17 11:17:15 +02:00
void CMasternodeSync : : Process ( )
2015-07-15 04:44:58 +02:00
{
2015-07-17 11:17:15 +02:00
static int c = 0 ;
2015-07-15 04:44:58 +02:00
if ( IsSynced ( ) ) return ;
2015-07-17 11:17:15 +02:00
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
2015-07-17 12:26:24 +02:00
if ( RequestedMasternodeAssets = = MASTERNODE_SYNC_INITIAL ) GetNextAsset ( ) ;
2015-07-15 04:44:58 +02:00
CBlockIndex * pindexPrev = chainActive . Tip ( ) ;
if ( pindexPrev = = NULL ) return ;
2015-07-17 11:17:15 +02:00
LOCK ( cs_vNodes ) ;
BOOST_FOREACH ( CNode * pnode , vNodes )
{
if ( pnode - > nVersion > = MIN_POOL_PEER_PROTO_VERSION )
2015-07-15 04:44:58 +02:00
{
2015-07-17 05:03:42 +02:00
2015-07-17 12:26:24 +02:00
if ( RequestedMasternodeAssets = = MASTERNODE_SYNC_SPORKS ) {
2015-07-17 11:17:15 +02:00
if ( pnode - > HasFulfilledRequest ( " getspork " ) ) continue ;
pnode - > FulfilledRequest ( " getspork " ) ;
2015-07-17 05:03:42 +02:00
2015-07-17 11:17:15 +02:00
if ( RequestedMasternodeAttempt < = 2 ) {
pnode - > PushMessage ( " getsporks " ) ; //get current network sporks
if ( RequestedMasternodeAttempt = = 2 ) GetNextAsset ( ) ;
RequestedMasternodeAttempt + + ;
}
return ;
}
2015-07-15 04:44:58 +02:00
2015-07-17 11:17:15 +02:00
if ( IsInitialBlockDownload ( ) ) return ;
2015-07-15 04:44:58 +02:00
2015-07-17 11:17:15 +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 ;
}
2015-07-17 11:17:15 +02:00
if ( pnode - > HasFulfilledRequest ( " mnsync " ) ) continue ;
pnode - > FulfilledRequest ( " mnsync " ) ;
2015-07-15 04:44:58 +02:00
2015-07-17 11:17:15 +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
2015-07-17 11:17:15 +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 ;
}
2015-07-17 11:17:15 +02:00
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 ;
}
2015-07-17 11:17:15 +02:00
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-17 11:17:15 +02:00
2015-07-15 04:44:58 +02:00
}
}
2015-07-17 11:17:15 +02:00
}