masternode-sync.cpp 6.21 KB
Newer Older
1
2
3
4
5
6
// 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"
UdjinM6's avatar
UdjinM6 committed
7
#include "masternode-payments.h"
8
#include "masternode.h"
UdjinM6's avatar
UdjinM6 committed
9
#include "masternodeman.h"
10
11
12
13
14
15
16
17
18
19
20
#include "util.h"
#include "addrman.h"

class CMasternodeSync;
CMasternodeSync masternodeSync;

CMasternodeSync::CMasternodeSync()
{
    lastMasternodeList = 0;
    lastMasternodeWinner = 0;
    lastBudgetItem = 0;
21
    RequestedMasternodeAssets = MASTERNODE_SYNC_INITIAL;
22
23
24
25
26
    RequestedMasternodeAttempt = 0;
}

bool CMasternodeSync::IsSynced()
{
27
    return (RequestedMasternodeAssets == MASTERNODE_SYNC_FINISHED);
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
}

void CMasternodeSync::AddedMasternodeList()
{
    lastMasternodeList = GetTime();
}

void CMasternodeSync::AddedMasternodeWinner()
{
    lastMasternodeWinner = GetTime();
}

void CMasternodeSync::AddedBudgetItem()
{
    lastBudgetItem = GetTime();
}

void CMasternodeSync::GetNextAsset()
{
    switch(RequestedMasternodeAssets)
    {
49
        case(MASTERNODE_SYNC_INITIAL):
UdjinM6's avatar
UdjinM6 committed
50
51
52
            lastMasternodeList = 0;
            lastMasternodeWinner = 0;
            lastBudgetItem = 0;
53
            RequestedMasternodeAssets = MASTERNODE_SYNC_SPORKS;
Evan Duffield's avatar
Evan Duffield committed
54
            break;
55
        case(MASTERNODE_SYNC_SPORKS):
56
57
58
59
60
61
62
63
64
            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):
65
            LogPrintf("CMasternodeSync::GetNextAsset - Sync has finished\n");
66
            RequestedMasternodeAssets = MASTERNODE_SYNC_FINISHED;
67
68
            break;
    }
UdjinM6's avatar
UdjinM6 committed
69
    RequestedMasternodeAttempt = 0;
70
71
}

UdjinM6's avatar
UdjinM6 committed
72
void CMasternodeSync::Process()
73
{
UdjinM6's avatar
UdjinM6 committed
74
75
76
77
78
79
    static int tick = 0;

    if(tick++ % MASTERNODE_SYNC_TIMEOUT != 0) return;

    CBlockIndex* pindexPrev = chainActive.Tip();
    if(pindexPrev == NULL) return;
UdjinM6's avatar
UdjinM6 committed
80

81
82
83
84
85
86
    if(IsSynced()) {
        /* 
            Resync if we lose all masternodes from sleep/wake or failure to sync originally
        */
        if(mnodeman.CountEnabled() == 0) {
            RequestedMasternodeAssets = MASTERNODE_SYNC_INITIAL;
UdjinM6's avatar
UdjinM6 committed
87
88
        } else
            return;
89
    }
90

UdjinM6's avatar
UdjinM6 committed
91
    if(fDebug) LogPrintf("CMasternodeSync::Process() - tick %d RequestedMasternodeAssets %d\n", tick, RequestedMasternodeAssets);
UdjinM6's avatar
UdjinM6 committed
92

93
    if(RequestedMasternodeAssets == MASTERNODE_SYNC_INITIAL) GetNextAsset();
94

UdjinM6's avatar
UdjinM6 committed
95
96
97
    LOCK(cs_vNodes);
    BOOST_FOREACH(CNode* pnode, vNodes)
    {
Evan Duffield's avatar
Evan Duffield committed
98

UdjinM6's avatar
UdjinM6 committed
99
        //set to synced
100
        if(Params().NetworkID() == CBaseChainParams::REGTEST && tick >= 10) {
UdjinM6's avatar
UdjinM6 committed
101
102
103
104
            LogPrintf("CMasternodeSync::Process - Sync has finished\n");
            RequestedMasternodeAssets = MASTERNODE_SYNC_FINISHED;
            RequestedMasternodeAttempt = 0;
        }
Evan Duffield's avatar
Evan Duffield committed
105

UdjinM6's avatar
UdjinM6 committed
106
107
108
109
110
111
112
113
        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++;
UdjinM6's avatar
UdjinM6 committed
114
            }
UdjinM6's avatar
UdjinM6 committed
115
116
117
            return;
        }

UdjinM6's avatar
UdjinM6 committed
118
        //don't begin syncing until we're almost at a recent block
119
        if(pindexPrev->nHeight + 4 < pindexBestHeader->nHeight && pindexPrev->nTime + 600 < GetTime()) return;
120

121
        if (pnode->nVersion >= masternodePayments.GetMinMasternodePaymentsProto()) {
122

UdjinM6's avatar
UdjinM6 committed
123
124
            if(RequestedMasternodeAssets == MASTERNODE_SYNC_LIST) {
                if(fDebug) LogPrintf("CMasternodeSync::Process() - lastMasternodeList %lld (GetTime() - MASTERNODE_SYNC_TIMEOUT) %lld\n", lastMasternodeList, GetTime() - MASTERNODE_SYNC_TIMEOUT);
UdjinM6's avatar
UdjinM6 committed
125
126
                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();
127
128
129
                    return;
                }

UdjinM6's avatar
UdjinM6 committed
130
131
                if(pnode->HasFulfilledRequest("mnsync")) continue;
                pnode->FulfilledRequest("mnsync");
132

UdjinM6's avatar
UdjinM6 committed
133
134
135
136
137
138
139
                if((lastMasternodeList == 0 || lastMasternodeList > GetTime() - MASTERNODE_SYNC_TIMEOUT)
                        && RequestedMasternodeAttempt <= 2){
                    mnodeman.DsegUpdate(pnode);
                    RequestedMasternodeAttempt++;
                }
                return;
            }
140

UdjinM6's avatar
UdjinM6 committed
141
            if(RequestedMasternodeAssets == MASTERNODE_SYNC_MNW) {
UdjinM6's avatar
UdjinM6 committed
142
143
                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();
144
145
                    return;
                }
UdjinM6's avatar
UdjinM6 committed
146
147
148
149
150
151
152
153
154
155
156

                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;
            }
UdjinM6's avatar
UdjinM6 committed
157
158
159
        }

        if (pnode->nVersion >= MIN_BUDGET_PEER_PROTO_VERSION) {
UdjinM6's avatar
UdjinM6 committed
160
161
162
163

            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();
164
165
166
                    return;
                }

UdjinM6's avatar
UdjinM6 committed
167
168
169
170
171
172
173
174
175
176
177
                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;
178
            }
UdjinM6's avatar
UdjinM6 committed
179

180
181
        }
    }
UdjinM6's avatar
UdjinM6 committed
182
}