@@ -873,54 +873,11 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, const std::string& strCommand,
873873
874874 LOCK (cs);
875875
876- if (vin == CTxIn ()) { // only should ask for this once
877- // local network
878- bool isLocal = (pfrom->addr .IsRFC1918 () || pfrom->addr .IsLocal ());
879-
880- if (!isLocal && Params ().NetworkIDString () == CBaseChainParams::MAIN) {
881- std::map<CNetAddr, int64_t >::iterator it = mAskedUsForMasternodeList .find (pfrom->addr );
882- if (it != mAskedUsForMasternodeList .end () && it->second > GetTime ()) {
883- Misbehaving (pfrom->GetId (), 34 );
884- LogPrintf (" DSEG -- peer already asked me for the list, peer=%d\n " , pfrom->id );
885- return ;
886- }
887- int64_t askAgain = GetTime () + DSEG_UPDATE_SECONDS;
888- mAskedUsForMasternodeList [pfrom->addr ] = askAgain;
889- }
890- } // else, asking for a specific node which is ok
891-
892- int nInvCount = 0 ;
893-
894- for (const auto & mnpair : mapMasternodes) {
895- if (vin != CTxIn () && vin != mnpair.second .vin ) continue ; // asked for specific vin but we are not there yet
896- if (mnpair.second .addr .IsRFC1918 () || mnpair.second .addr .IsLocal ()) continue ; // do not send local network masternode
897- // NOTE: send masternode regardless of its current state, the other node will need it to verify old votes.
898-
899- LogPrint (" masternode" , " DSEG -- Sending Masternode entry: masternode=%s addr=%s\n " , mnpair.first .ToStringShort (), mnpair.second .addr .ToString ());
900- CMasternodeBroadcast mnb = CMasternodeBroadcast (mnpair.second );
901- CMasternodePing mnp = mnpair.second .lastPing ;
902- uint256 hashMNB = mnb.GetHash ();
903- uint256 hashMNP = mnp.GetHash ();
904- pfrom->PushInventory (CInv (MSG_MASTERNODE_ANNOUNCE, hashMNB));
905- pfrom->PushInventory (CInv (MSG_MASTERNODE_PING, hashMNP));
906- nInvCount++;
907-
908- mapSeenMasternodeBroadcast.insert (std::make_pair (hashMNB, std::make_pair (GetTime (), mnb)));
909- mapSeenMasternodePing.insert (std::make_pair (hashMNP, mnp));
910-
911- if (vin.prevout == mnpair.first ) {
912- LogPrintf (" DSEG -- Sent 1 Masternode inv to peer=%d\n " , pfrom->id );
913- return ;
914- }
915- }
916-
917876 if (vin == CTxIn ()) {
918- connman. PushMessage (pfrom, msgMaker. Make (NetMsgType::SYNCSTATUSCOUNT, MASTERNODE_SYNC_LIST, nInvCount) );
919- LogPrintf ( " DSEG -- Sent %d Masternode invs to peer=%d \n " , nInvCount, pfrom-> id );
920- return ;
877+ SyncAll (pfrom, connman );
878+ } else {
879+ SyncSingle (pfrom, vin. prevout , connman) ;
921880 }
922- // smth weird happen - someone asked us for vin we have no idea about?
923- LogPrint (" masternode" , " DSEG -- No invs sent to peer=%d\n " , pfrom->id );
924881
925882 } else if (strCommand == NetMsgType::MNVERIFY) { // Masternode Verify
926883
@@ -947,6 +904,74 @@ void CMasternodeMan::ProcessMessage(CNode* pfrom, const std::string& strCommand,
947904 }
948905}
949906
907+ void CMasternodeMan::SyncSingle (CNode* pnode, const COutPoint& outpoint, CConnman& connman)
908+ {
909+ // do not provide any data until our node is synced
910+ if (!masternodeSync.IsSynced ()) return ;
911+
912+ LOCK (cs);
913+
914+ auto it = mapMasternodes.find (outpoint);
915+
916+ if (it != mapMasternodes.end ()) {
917+ if (it->second .addr .IsRFC1918 () || it->second .addr .IsLocal ()) return ; // do not send local network masternode
918+ // NOTE: send masternode regardless of its current state, the other node will need it to verify old votes.
919+ LogPrint (" masternode" , " CMasternodeMan::%s -- Sending Masternode entry: masternode=%s addr=%s\n " , __func__, outpoint.ToStringShort (), it->second .addr .ToString ());
920+ PushDsegInvs (pnode, it->second );
921+ LogPrintf (" CMasternodeMan::%s -- Sent 1 Masternode inv to peer=%d\n " , __func__, pnode->id );
922+ }
923+ }
924+
925+ void CMasternodeMan::SyncAll (CNode* pnode, CConnman& connman)
926+ {
927+ // do not provide any data until our node is synced
928+ if (!masternodeSync.IsSynced ()) return ;
929+
930+ LOCK (cs);
931+
932+ // local network
933+ bool isLocal = (pnode->addr .IsRFC1918 () || pnode->addr .IsLocal ());
934+
935+ // should only ask for this once
936+ if (!isLocal && Params ().NetworkIDString () == CBaseChainParams::MAIN) {
937+ std::map<CNetAddr, int64_t >::iterator it = mAskedUsForMasternodeList .find (pnode->addr );
938+ if (it != mAskedUsForMasternodeList .end () && it->second > GetTime ()) {
939+ Misbehaving (pnode->GetId (), 34 );
940+ LogPrintf (" CMasternodeMan::%s -- peer already asked me for the list, peer=%d\n " , __func__, pnode->id );
941+ return ;
942+ }
943+ int64_t askAgain = GetTime () + DSEG_UPDATE_SECONDS;
944+ mAskedUsForMasternodeList [pnode->addr ] = askAgain;
945+ }
946+
947+ int nInvCount = 0 ;
948+
949+ for (const auto & mnpair : mapMasternodes) {
950+ if (mnpair.second .addr .IsRFC1918 () || mnpair.second .addr .IsLocal ()) continue ; // do not send local network masternode
951+ // NOTE: send masternode regardless of its current state, the other node will need it to verify old votes.
952+ LogPrint (" masternode" , " CMasternodeMan::%s -- Sending Masternode entry: masternode=%s addr=%s\n " , __func__, mnpair.first .ToStringShort (), mnpair.second .addr .ToString ());
953+ PushDsegInvs (pnode, mnpair.second );
954+ nInvCount++;
955+ }
956+
957+ connman.PushMessage (pnode, CNetMsgMaker (pnode->GetSendVersion ()).Make (NetMsgType::SYNCSTATUSCOUNT, MASTERNODE_SYNC_LIST, nInvCount));
958+ LogPrintf (" CMasternodeMan::%s -- Sent %d Masternode invs to peer=%d\n " , __func__, nInvCount, pnode->id );
959+ }
960+
961+ void CMasternodeMan::PushDsegInvs (CNode* pnode, const CMasternode& mn)
962+ {
963+ AssertLockHeld (cs);
964+
965+ CMasternodeBroadcast mnb (mn);
966+ CMasternodePing mnp = mnb.lastPing ;
967+ uint256 hashMNB = mnb.GetHash ();
968+ uint256 hashMNP = mnp.GetHash ();
969+ pnode->PushInventory (CInv (MSG_MASTERNODE_ANNOUNCE, hashMNB));
970+ pnode->PushInventory (CInv (MSG_MASTERNODE_PING, hashMNP));
971+ mapSeenMasternodeBroadcast.insert (std::make_pair (hashMNB, std::make_pair (GetTime (), mnb)));
972+ mapSeenMasternodePing.insert (std::make_pair (hashMNP, mnp));
973+ }
974+
950975// Verification of masternodes via unique direct requests.
951976
952977void CMasternodeMan::DoFullVerificationStep (CConnman& connman)
0 commit comments