14
14
15
15
/* * Masternode manager */
16
16
CMasternodeMan mnodeman;
17
- // who's asked for the masternode list and the last time
18
- std::map<CNetAddr, int64_t > askedForMasternodeList;
19
- // which masternodes we've asked for
20
- std::map<COutPoint, int64_t > askedForMasternodeListEntry;
21
17
22
18
struct CompareValueOnly
23
19
{
@@ -133,54 +129,6 @@ void DumpMasternodes()
133
129
134
130
CMasternodeMan::CMasternodeMan () {}
135
131
136
- CMasternode *CMasternodeMan::Find (const CTxIn &vin)
137
- {
138
- LOCK (cs);
139
-
140
- BOOST_FOREACH (CMasternode& mn, vMasternodes)
141
- {
142
- if (mn.vin == vin)
143
- return &mn;
144
- }
145
- return NULL ;
146
- }
147
-
148
- CMasternode *CMasternodeMan::FindRandom ()
149
- {
150
- LOCK (cs);
151
-
152
- if (size () == 0 ) return NULL ;
153
-
154
- return &vMasternodes[GetRandInt (vMasternodes.size ())];
155
- }
156
-
157
-
158
- CMasternode *CMasternodeMan::FindNotInVec (const std::vector<CTxIn> &vVins)
159
- {
160
- LOCK (cs);
161
-
162
- BOOST_FOREACH (CMasternode &mn, vMasternodes)
163
- {
164
- mn.Check ();
165
- UpdateLastTimeChanged ();
166
- if (!mn.IsEnabled ()) continue ;
167
-
168
- bool found = false ;
169
- BOOST_FOREACH (const CTxIn& vin, vVins)
170
- if (mn.vin == vin)
171
- {
172
- found = true ;
173
- break ;
174
- }
175
-
176
- if (found) continue ;
177
-
178
- return &mn;
179
- }
180
-
181
- return NULL ;
182
- }
183
-
184
132
bool CMasternodeMan::Add (CMasternode &mn)
185
133
{
186
134
LOCK (cs);
@@ -193,7 +141,6 @@ bool CMasternodeMan::Add(CMasternode &mn)
193
141
if (pmn == NULL )
194
142
{
195
143
vMasternodes.push_back (mn);
196
- UpdateLastTimeChanged ();
197
144
return true ;
198
145
}
199
146
@@ -204,7 +151,6 @@ void CMasternodeMan::Check()
204
151
{
205
152
LOCK (cs);
206
153
207
- UpdateLastTimeChanged ();
208
154
BOOST_FOREACH (CMasternode& mn, vMasternodes)
209
155
mn.Check ();
210
156
}
@@ -214,7 +160,6 @@ void CMasternodeMan::CheckAndRemove()
214
160
LOCK (cs);
215
161
216
162
Check ();
217
- UpdateLastTimeChanged ();
218
163
219
164
// remove inactive
220
165
vector<CMasternode>::iterator it = vMasternodes.begin ();
@@ -226,35 +171,119 @@ void CMasternodeMan::CheckAndRemove()
226
171
++it;
227
172
}
228
173
}
174
+
175
+ // check who's asked for the masternode list
176
+ map<CNetAddr, int64_t >::iterator it1 = mAskedUsForMasternodeList .begin ();
177
+ while (it1 != mAskedUsForMasternodeList .end ()){
178
+ if ((*it1).second < GetTime ())
179
+ it1 = mAskedUsForMasternodeList .erase (it1);
180
+ else ++it1;
181
+ }
182
+
183
+ // check who we asked for the masternode list
184
+ it1 = mWeAskedForMasternodeList .begin ();
185
+ while (it1 != mWeAskedForMasternodeList .end ()){
186
+ if ((*it1).second < GetTime ())
187
+ it1 = mWeAskedForMasternodeList .erase (it1);
188
+ else ++it1;
189
+ }
190
+
191
+ // check which masternodes we've asked for
192
+ map<COutPoint, int64_t >::iterator it2 = mWeAskedForMasternodeListEntry .begin ();
193
+ while (it2 != mWeAskedForMasternodeListEntry .end ()){
194
+ if ((*it2).second < GetTime ())
195
+ it2 = mWeAskedForMasternodeListEntry .erase (it2);
196
+ else ++it2;
197
+ }
198
+
229
199
}
230
200
231
- int CMasternodeMan::CountMasternodesAboveProtocol ( int protocolVersion )
201
+ int CMasternodeMan::CountEnabled ( )
232
202
{
233
203
int i = 0 ;
234
204
235
205
BOOST_FOREACH (CMasternode& mn, vMasternodes) {
236
206
mn.Check ();
237
- UpdateLastTimeChanged ();
238
- if (mn.protocolVersion < protocolVersion || !mn.IsEnabled ()) continue ;
239
- i++;
207
+ if (mn.IsEnabled ()) i++;
240
208
}
241
209
242
210
return i;
243
211
}
244
212
245
- int CMasternodeMan::CountEnabled ( )
213
+ int CMasternodeMan::CountMasternodesAboveProtocol ( int protocolVersion )
246
214
{
247
215
int i = 0 ;
248
216
249
217
BOOST_FOREACH (CMasternode& mn, vMasternodes) {
250
218
mn.Check ();
251
- UpdateLastTimeChanged () ;
252
- if (mn. IsEnabled ()) i++;
219
+ if (mn. protocolVersion < protocolVersion || !mn. IsEnabled ()) continue ;
220
+ i++;
253
221
}
254
222
255
223
return i;
256
224
}
257
225
226
+ void CMasternodeMan::DsegUpdate (CNode* pnode)
227
+ {
228
+ std::map<CNetAddr, int64_t >::iterator it = mWeAskedForMasternodeList .find (pnode->addr );
229
+ if (it != mWeAskedForMasternodeList .end ())
230
+ {
231
+ if (GetTime () < (*it).second ) {
232
+ LogPrintf (" dseg - we already asked %s for the list; skipping...\n " , pnode->addr .ToString ());
233
+ return ;
234
+ }
235
+ }
236
+ pnode->PushMessage (" dseg" , CTxIn ());
237
+ int64_t askAgain = GetTime () + MASTERNODES_DSEG_SECONDS;
238
+ mWeAskedForMasternodeList [pnode->addr ] = askAgain;
239
+ }
240
+
241
+ CMasternode *CMasternodeMan::Find (const CTxIn &vin)
242
+ {
243
+ LOCK (cs);
244
+
245
+ BOOST_FOREACH (CMasternode& mn, vMasternodes)
246
+ {
247
+ if (mn.vin == vin)
248
+ return &mn;
249
+ }
250
+ return NULL ;
251
+ }
252
+
253
+ CMasternode *CMasternodeMan::FindNotInVec (const std::vector<CTxIn> &vVins)
254
+ {
255
+ LOCK (cs);
256
+
257
+ BOOST_FOREACH (CMasternode &mn, vMasternodes)
258
+ {
259
+ mn.Check ();
260
+ if (!mn.IsEnabled ()) continue ;
261
+
262
+ bool found = false ;
263
+ BOOST_FOREACH (const CTxIn& vin, vVins)
264
+ if (mn.vin == vin)
265
+ {
266
+ found = true ;
267
+ break ;
268
+ }
269
+
270
+ if (found) continue ;
271
+
272
+ return &mn;
273
+ }
274
+
275
+ return NULL ;
276
+ }
277
+
278
+ CMasternode *CMasternodeMan::FindRandom ()
279
+ {
280
+ LOCK (cs);
281
+
282
+ if (size () == 0 ) return NULL ;
283
+
284
+ return &vMasternodes[GetRandInt (vMasternodes.size ())];
285
+ }
286
+
258
287
CMasternode* CMasternodeMan::GetCurrentMasterNode (int mod, int64_t nBlockHeight, int minProtocol)
259
288
{
260
289
unsigned int score = 0 ;
@@ -263,7 +292,6 @@ CMasternode* CMasternodeMan::GetCurrentMasterNode(int mod, int64_t nBlockHeight,
263
292
// scan for winner
264
293
BOOST_FOREACH (CMasternode& mn, vMasternodes) {
265
294
mn.Check ();
266
- UpdateLastTimeChanged ();
267
295
if (mn.protocolVersion < minProtocol || !mn.IsEnabled ()) continue ;
268
296
269
297
// calculate the score for each masternode
@@ -289,7 +317,6 @@ int CMasternodeMan::GetMasternodeRank(const CTxIn& vin, int64_t nBlockHeight, in
289
317
BOOST_FOREACH (CMasternode& mn, vMasternodes) {
290
318
291
319
mn.Check ();
292
- UpdateLastTimeChanged ();
293
320
294
321
if (mn.protocolVersion < minProtocol) continue ;
295
322
if (!mn.IsEnabled ()) {
@@ -399,7 +426,6 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
399
426
// after that they just need to match
400
427
if (count == -1 && pmn->pubkey == pubkey && !pmn->UpdatedWithin (MASTERNODE_MIN_DSEE_SECONDS)){
401
428
pmn->UpdateLastSeen ();
402
- UpdateLastTimeChanged ();
403
429
404
430
if (pmn->now < sigTime){ // take the newest entry
405
431
LogPrintf (" dsee - Got updated entry for %s\n " , addr.ToString ().c_str ());
@@ -516,7 +542,6 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
516
542
517
543
if (!pmn->UpdatedWithin (MASTERNODE_MIN_DSEEP_SECONDS))
518
544
{
519
- UpdateLastTimeChanged ();
520
545
if (stop) pmn->Disable ();
521
546
else
522
547
{
@@ -532,8 +557,8 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
532
557
533
558
if (fDebug ) LogPrintf (" dseep - Couldn't find masternode entry %s\n " , vin.ToString ().c_str ());
534
559
535
- std::map<COutPoint, int64_t >::iterator i = askedForMasternodeListEntry .find (vin.prevout );
536
- if (i != askedForMasternodeListEntry .end ())
560
+ std::map<COutPoint, int64_t >::iterator i = mWeAskedForMasternodeListEntry .find (vin.prevout );
561
+ if (i != mWeAskedForMasternodeListEntry .end ())
537
562
{
538
563
int64_t t = (*i).second ;
539
564
if (GetTime () < t) return ; // we've asked recently
@@ -544,7 +569,7 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
544
569
LogPrintf (" dseep - Asking source node for missing entry %s\n " , vin.ToString ().c_str ());
545
570
pfrom->PushMessage (" dseg" , vin);
546
571
int64_t askAgain = GetTime ()+(60 *60 *24 );
547
- askedForMasternodeListEntry [vin.prevout ] = askAgain;
572
+ mWeAskedForMasternodeListEntry [vin.prevout ] = askAgain;
548
573
549
574
} else if (strCommand == " dseg" ) { // Get masternode list or specific entry
550
575
@@ -555,8 +580,8 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
555
580
// local network
556
581
if (!pfrom->addr .IsRFC1918 () && Params ().NetworkID () == CChainParams::MAIN)
557
582
{
558
- std::map<CNetAddr, int64_t >::iterator i = askedForMasternodeList .find (pfrom->addr );
559
- if (i != askedForMasternodeList .end ())
583
+ std::map<CNetAddr, int64_t >::iterator i = mAskedUsForMasternodeList .find (pfrom->addr );
584
+ if (i != mAskedUsForMasternodeList .end ())
560
585
{
561
586
int64_t t = (*i).second ;
562
587
if (GetTime () < t) {
@@ -565,9 +590,8 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
565
590
return ;
566
591
}
567
592
}
568
-
569
- int64_t askAgain = GetTime ()+(60 *60 *3 );
570
- askedForMasternodeList[pfrom->addr ] = askAgain;
593
+ int64_t askAgain = GetTime () + MASTERNODES_DSEG_SECONDS;
594
+ mAskedUsForMasternodeList [pfrom->addr ] = askAgain;
571
595
}
572
596
} // else, asking for a specific node which is ok
573
597
0 commit comments