@@ -268,10 +268,12 @@ CMasternode *CMasternodeMan::Find(const CTxIn &vin)
268
268
return NULL ;
269
269
}
270
270
271
- CMasternode * CMasternodeMan::FindNotInVec (const std::vector<CTxIn> &vVins)
271
+ CMasternode* CMasternodeMan::FindOldestNotInVec (const std::vector<CTxIn> &vVins)
272
272
{
273
273
LOCK (cs);
274
274
275
+ CMasternode *pOldestMasternode = NULL ;
276
+
275
277
BOOST_FOREACH (CMasternode &mn, vMasternodes)
276
278
{
277
279
mn.Check ();
@@ -287,10 +289,11 @@ CMasternode *CMasternodeMan::FindNotInVec(const std::vector<CTxIn> &vVins)
287
289
288
290
if (found) continue ;
289
291
290
- return &mn;
292
+ if (pOldestMasternode == NULL || pOldestMasternode->GetMasternodeInputAge () < mn.GetMasternodeInputAge ())
293
+ pOldestMasternode = &mn;
291
294
}
292
295
293
- return NULL ;
296
+ return pOldestMasternode ;
294
297
}
295
298
296
299
CMasternode *CMasternodeMan::FindRandom ()
@@ -445,10 +448,10 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
445
448
if (count == -1 && pmn->pubkey == pubkey && !pmn->UpdatedWithin (MASTERNODE_MIN_DSEE_SECONDS)){
446
449
pmn->UpdateLastSeen ();
447
450
448
- if (pmn->now < sigTime){ // take the newest entry
451
+ if (pmn->sigTime < sigTime){ // take the newest entry
449
452
LogPrintf (" dsee - Got updated entry for %s\n " , addr.ToString ().c_str ());
450
453
pmn->pubkey2 = pubkey2;
451
- pmn->now = sigTime;
454
+ pmn->sigTime = sigTime;
452
455
pmn->sig = vchSig;
453
456
pmn->protocolVersion = protocolVersion;
454
457
pmn->addr = addr;
@@ -488,6 +491,24 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
488
491
return ;
489
492
}
490
493
494
+ // verify that sig time is legit in past
495
+ // should be at least not earlier than block when 1000 DRK tx got MASTERNODE_MIN_CONFIRMATIONS
496
+ uint256 hashBlock = 0 ;
497
+ GetTransaction (vin.prevout .hash , tx, hashBlock, true );
498
+ map<uint256, CBlockIndex*>::iterator mi = mapBlockIndex.find (hashBlock);
499
+ if (mi != mapBlockIndex.end () && (*mi).second )
500
+ {
501
+ CBlockIndex* pMNIndex = (*mi).second ; // block for 1000 DRK tx -> 1 confirmation
502
+ CBlockIndex* pConfIndex = chainActive[pMNIndex->nHeight + MASTERNODE_MIN_CONFIRMATIONS - 1 ]; // block where tx got MASTERNODE_MIN_CONFIRMATIONS
503
+ if (pConfIndex->GetBlockTime () > sigTime)
504
+ {
505
+ LogPrintf (" dsee - Bad sigTime %d for masternode %20s %105s (%i conf block is at %d)\n " ,
506
+ sigTime, addr.ToString (), vin.ToString (), MASTERNODE_MIN_CONFIRMATIONS, pConfIndex->GetBlockTime ());
507
+ return ;
508
+ }
509
+ }
510
+
511
+
491
512
// use this as a peer
492
513
addrman.Add (CAddress (addr), pfrom->addr , 2 *60 *60 );
493
514
@@ -624,9 +645,9 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, std::string& strCommand, CData
624
645
{
625
646
if (fDebug ) LogPrintf (" dseg - Sending masternode entry - %s \n " , mn.addr .ToString ().c_str ());
626
647
if (vin == CTxIn ()){
627
- pfrom->PushMessage (" dsee" , mn.vin , mn.addr , mn.sig , mn.now , mn.pubkey , mn.pubkey2 , count, i, mn.lastTimeSeen , mn.protocolVersion );
648
+ pfrom->PushMessage (" dsee" , mn.vin , mn.addr , mn.sig , mn.sigTime , mn.pubkey , mn.pubkey2 , count, i, mn.lastTimeSeen , mn.protocolVersion );
628
649
} else if (vin == mn.vin ) {
629
- pfrom->PushMessage (" dsee" , mn.vin , mn.addr , mn.sig , mn.now , mn.pubkey , mn.pubkey2 , count, i, mn.lastTimeSeen , mn.protocolVersion );
650
+ pfrom->PushMessage (" dsee" , mn.vin , mn.addr , mn.sig , mn.sigTime , mn.pubkey , mn.pubkey2 , count, i, mn.lastTimeSeen , mn.protocolVersion );
630
651
LogPrintf (" dseg - Sent 1 masternode entries to %s\n " , pfrom->addr .ToString ().c_str ());
631
652
return ;
632
653
}
0 commit comments