Dash Core  0.12.2.1
P2P Digital Currency
masternodeman.h
Go to the documentation of this file.
1 // Copyright (c) 2014-2017 The Dash Core developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef MASTERNODEMAN_H
6 #define MASTERNODEMAN_H
7 
8 #include "masternode.h"
9 #include "sync.h"
10 
11 using namespace std;
12 
13 class CMasternodeMan;
14 class CConnman;
15 
17 
19 {
20 public:
21  typedef std::pair<arith_uint256, CMasternode*> score_pair_t;
22  typedef std::vector<score_pair_t> score_pair_vec_t;
23  typedef std::pair<int, CMasternode> rank_pair_t;
24  typedef std::vector<rank_pair_t> rank_pair_vec_t;
25 
26 private:
27  static const std::string SERIALIZATION_VERSION_STRING;
28 
29  static const int DSEG_UPDATE_SECONDS = 3 * 60 * 60;
30 
31  static const int LAST_PAID_SCAN_BLOCKS = 100;
32 
33  static const int MIN_POSE_PROTO_VERSION = 70203;
34  static const int MAX_POSE_CONNECTIONS = 10;
35  static const int MAX_POSE_RANK = 10;
36  static const int MAX_POSE_BLOCKS = 10;
37 
38  static const int MNB_RECOVERY_QUORUM_TOTAL = 10;
39  static const int MNB_RECOVERY_QUORUM_REQUIRED = 6;
40  static const int MNB_RECOVERY_MAX_ASK_ENTRIES = 10;
41  static const int MNB_RECOVERY_WAIT_SECONDS = 60;
42  static const int MNB_RECOVERY_RETRY_SECONDS = 3 * 60 * 60;
43 
44 
45  // critical section to protect the inner data structures
47 
48  // Keep track of current block height
50 
51  // map to hold all MNs
52  std::map<COutPoint, CMasternode> mapMasternodes;
53  // who's asked for the Masternode list and the last time
54  std::map<CNetAddr, int64_t> mAskedUsForMasternodeList;
55  // who we asked for the Masternode list and the last time
56  std::map<CNetAddr, int64_t> mWeAskedForMasternodeList;
57  // which Masternodes we've asked for
58  std::map<COutPoint, std::map<CNetAddr, int64_t> > mWeAskedForMasternodeListEntry;
59  // who we asked for the masternode verification
60  std::map<CNetAddr, CMasternodeVerification> mWeAskedForVerification;
61 
62  // these maps are used for masternode recovery from MASTERNODE_NEW_START_REQUIRED state
63  std::map<uint256, std::pair< int64_t, std::set<CNetAddr> > > mMnbRecoveryRequests;
64  std::map<uint256, std::vector<CMasternodeBroadcast> > mMnbRecoveryGoodReplies;
65  std::list< std::pair<CService, uint256> > listScheduledMnbRequestConnections;
66 
69 
72 
73  std::vector<uint256> vecDirtyGovernanceObjectHashes;
74 
76 
77  friend class CMasternodeSync;
79  CMasternode* Find(const COutPoint& outpoint);
80 
81  bool GetMasternodeScores(const uint256& nBlockHash, score_pair_vec_t& vecMasternodeScoresRet, int nMinProtocol = 0);
82 
83 public:
84  // Keep track of all broadcasts I've seen
85  std::map<uint256, std::pair<int64_t, CMasternodeBroadcast> > mapSeenMasternodeBroadcast;
86  // Keep track of all pings I've seen
87  std::map<uint256, CMasternodePing> mapSeenMasternodePing;
88  // Keep track of all verifications I've seen
89  std::map<uint256, CMasternodeVerification> mapSeenMasternodeVerification;
90  // keep track of dsq count to prevent masternodes from gaming darksend queue
91  int64_t nDsqCount;
92 
93 
95 
96  template <typename Stream, typename Operation>
97  inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
98  LOCK(cs);
99  std::string strVersion;
100  if(ser_action.ForRead()) {
101  READWRITE(strVersion);
102  }
103  else {
104  strVersion = SERIALIZATION_VERSION_STRING;
105  READWRITE(strVersion);
106  }
107 
108  READWRITE(mapMasternodes);
109  READWRITE(mAskedUsForMasternodeList);
110  READWRITE(mWeAskedForMasternodeList);
111  READWRITE(mWeAskedForMasternodeListEntry);
112  READWRITE(mMnbRecoveryRequests);
113  READWRITE(mMnbRecoveryGoodReplies);
114  READWRITE(nLastWatchdogVoteTime);
115  READWRITE(nDsqCount);
116 
117  READWRITE(mapSeenMasternodeBroadcast);
118  READWRITE(mapSeenMasternodePing);
119  if(ser_action.ForRead() && (strVersion != SERIALIZATION_VERSION_STRING)) {
120  Clear();
121  }
122  }
123 
124  CMasternodeMan();
125 
127  bool Add(CMasternode &mn);
128 
130  void AskForMN(CNode *pnode, const COutPoint& outpoint, CConnman& connman);
131  void AskForMnb(CNode *pnode, const uint256 &hash);
132 
133  bool PoSeBan(const COutPoint &outpoint);
134  bool AllowMixing(const COutPoint &outpoint);
135  bool DisallowMixing(const COutPoint &outpoint);
136 
138  void Check();
139 
141  void CheckAndRemove(CConnman& connman);
143  void CheckAndRemove() {}
144 
146  void Clear();
147 
150  int CountMasternodes(int nProtocolVersion = -1);
153  int CountEnabled(int nProtocolVersion = -1);
154 
156  // int CountByIP(int nNetworkType);
157 
158  void DsegUpdate(CNode* pnode, CConnman& connman);
159 
161  bool Get(const COutPoint& outpoint, CMasternode& masternodeRet);
162  bool Has(const COutPoint& outpoint);
163 
164  bool GetMasternodeInfo(const COutPoint& outpoint, masternode_info_t& mnInfoRet);
165  bool GetMasternodeInfo(const CPubKey& pubKeyMasternode, masternode_info_t& mnInfoRet);
166  bool GetMasternodeInfo(const CScript& payee, masternode_info_t& mnInfoRet);
167 
169  bool GetNextMasternodeInQueueForPayment(int nBlockHeight, bool fFilterSigTime, int& nCountRet, masternode_info_t& mnInfoRet);
171  bool GetNextMasternodeInQueueForPayment(bool fFilterSigTime, int& nCountRet, masternode_info_t& mnInfoRet);
172 
174  masternode_info_t FindRandomNotInVec(const std::vector<COutPoint> &vecToExclude, int nProtocolVersion = -1);
175 
176  std::map<COutPoint, CMasternode> GetFullMasternodeMap() { return mapMasternodes; }
177 
178  bool GetMasternodeRanks(rank_pair_vec_t& vecMasternodeRanksRet, int nBlockHeight = -1, int nMinProtocol = 0);
179  bool GetMasternodeRank(const COutPoint &outpoint, int& nRankRet, int nBlockHeight = -1, int nMinProtocol = 0);
180  bool GetMasternodeByRank(int nRank, masternode_info_t& mnInfoRet, int nBlockHeight = -1, int nMinProtocol = 0);
181 
182  void ProcessMasternodeConnections(CConnman& connman);
183  std::pair<CService, std::set<uint256> > PopScheduledMnbRequestConnection();
184 
185  void ProcessMessage(CNode* pfrom, std::string& strCommand, CDataStream& vRecv, CConnman& connman);
186 
187  void DoFullVerificationStep(CConnman& connman);
188  void CheckSameAddr();
189  bool SendVerifyRequest(const CAddress& addr, const std::vector<CMasternode*>& vSortedByAddr, CConnman& connman);
190  void SendVerifyReply(CNode* pnode, CMasternodeVerification& mnv, CConnman& connman);
191  void ProcessVerifyReply(CNode* pnode, CMasternodeVerification& mnv);
192  void ProcessVerifyBroadcast(CNode* pnode, const CMasternodeVerification& mnv);
193 
195  int size() { return mapMasternodes.size(); }
196 
197  std::string ToString() const;
198 
200  void UpdateMasternodeList(CMasternodeBroadcast mnb, CConnman& connman);
202  bool CheckMnbAndUpdateMasternodeList(CNode* pfrom, CMasternodeBroadcast mnb, int& nDos, CConnman& connman);
203  bool IsMnbRecoveryRequested(const uint256& hash) { return mMnbRecoveryRequests.count(hash); }
204 
205  void UpdateLastPaid(const CBlockIndex* pindex);
206 
208  {
209  LOCK(cs);
210  vecDirtyGovernanceObjectHashes.push_back(nHash);
211  }
212 
214  {
215  LOCK(cs);
216  std::vector<uint256> vecTmp = vecDirtyGovernanceObjectHashes;
217  vecDirtyGovernanceObjectHashes.clear();
218  return vecTmp;;
219  }
220 
221  bool IsWatchdogActive();
222  void UpdateWatchdogVoteTime(const COutPoint& outpoint, uint64_t nVoteTime = 0);
223  bool AddGovernanceVote(const COutPoint& outpoint, uint256 nGovernanceObjectHash);
224  void RemoveGovernanceObject(uint256 nGovernanceObjectHash);
225 
226  void CheckMasternode(const CPubKey& pubKeyMasternode, bool fForce);
227 
228  bool IsMasternodePingedWithin(const COutPoint& outpoint, int nSeconds, int64_t nTimeToCheckAt = -1);
229  void SetMasternodeLastPing(const COutPoint& outpoint, const CMasternodePing& mnp);
230 
231  void UpdatedBlockTip(const CBlockIndex *pindex);
232 
237  void NotifyMasternodeUpdates(CConnman& connman);
238 
239 };
240 
241 #endif
int64_t nDsqCount
Definition: masternodeman.h:91
void SerializationOp(Stream &s, Operation ser_action, int nType, int nVersion)
Definition: masternodeman.h:97
#define READWRITE(obj)
Definition: serialize.h:175
bool IsMnbRecoveryRequested(const uint256 &hash)
void CheckAndRemove()
This is dummy overload to be used for dumping/loading mncache.dat.
std::map< uint256, std::vector< CMasternodeBroadcast > > mMnbRecoveryGoodReplies
Definition: masternodeman.h:64
void AddDirtyGovernanceObjectHash(const uint256 &nHash)
Definition: net.h:108
std::map< uint256, CMasternodePing > mapSeenMasternodePing
Definition: masternodeman.h:87
std::map< COutPoint, std::map< CNetAddr, int64_t > > mWeAskedForMasternodeListEntry
Definition: masternodeman.h:58
std::map< uint256, std::pair< int64_t, CMasternodeBroadcast > > mapSeenMasternodeBroadcast
Definition: masternodeman.h:85
static bool ProcessMessage(CNode *pfrom, string strCommand, CDataStream &vRecv, int64_t nTimeReceived, CConnman &connman, std::atomic< bool > &interruptMsgProc)
std::vector< score_pair_t > score_pair_vec_t
Definition: masternodeman.h:22
void UpdatedBlockTip(const CBlockIndex *pindexNew, bool fInitialDownload, CConnman &connman)
bool fMasternodesAdded
Set when masternodes are added, cleared when CGovernanceManager is notified.
Definition: masternodeman.h:68
std::map< CNetAddr, int64_t > mAskedUsForMasternodeList
Definition: masternodeman.h:54
std::map< CNetAddr, CMasternodeVerification > mWeAskedForVerification
Definition: masternodeman.h:60
Definition: net.h:661
#define LOCK(cs)
Definition: sync.h:168
CCriticalSection cs
Definition: masternodeman.h:46
std::vector< uint256 > GetAndClearDirtyGovernanceObjectHashes()
std::list< std::pair< CService, uint256 > > listScheduledMnbRequestConnections
Definition: masternodeman.h:65
std::map< uint256, CMasternodeVerification > mapSeenMasternodeVerification
Definition: masternodeman.h:89
std::map< COutPoint, CMasternode > mapMasternodes
Definition: masternodeman.h:52
std::vector< rank_pair_t > rank_pair_vec_t
Definition: masternodeman.h:24
int size()
Return the number of (unique) Masternodes.
std::pair< int, CMasternode > rank_pair_t
Definition: masternodeman.h:23
std::map< COutPoint, CMasternode > GetFullMasternodeMap()
std::vector< uint256 > vecDirtyGovernanceObjectHashes
Definition: masternodeman.h:73
static const std::string SERIALIZATION_VERSION_STRING
Definition: masternodeman.h:27
std::map< CNetAddr, int64_t > mWeAskedForMasternodeList
Definition: masternodeman.h:56
int64_t nLastWatchdogVoteTime
Definition: masternodeman.h:75
Definition: pubkey.h:37
CMasternodeMan mnodeman
std::pair< arith_uint256, CMasternode * > score_pair_t
Definition: masternodeman.h:21
std::map< uint256, std::pair< int64_t, std::set< CNetAddr > > > mMnbRecoveryRequests
Definition: masternodeman.h:63
bool fMasternodesRemoved
Set when masternodes are removed, cleared when CGovernanceManager is notified.
Definition: masternodeman.h:71