PRCYCoin  2.0.0.7rc1
P2P Digital Currency
masternodeman.h
Go to the documentation of this file.
1 // Copyright (c) 2014-2015 The Dash developers
2 // Copyright (c) 2015-2018 The PIVX developers
3 // Copyright (c) 2018-2020 The DAPS Project developers
4 // Distributed under the MIT/X11 software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef MASTERNODEMAN_H
8 #define MASTERNODEMAN_H
9 
10 #include "activemasternode.h"
11 #include "base58.h"
12 #include "key.h"
13 #include "main.h"
14 #include "masternode.h"
15 #include "net.h"
16 #include "sync.h"
17 #include "util.h"
18 
19 #define MASTERNODES_DUMP_SECONDS (15 * 60)
20 #define MASTERNODES_DSEG_SECONDS (3 * 60 * 60)
21 
22 
23 class CMasternodeMan;
24 class CActiveMasternode;
25 
28 extern std::string strMasterNodePrivKey;
29 
30 void DumpMasternodes();
31 
35 {
36 private:
37  fs::path pathMN;
38  std::string strMagicMessage;
39 
40 public:
41  enum ReadResult {
42  Ok,
49  };
50 
51  CMasternodeDB();
52  bool Write(const CMasternodeMan& mnodemanToSave);
53  ReadResult Read(CMasternodeMan& mnodemanToLoad, bool fDryRun = false);
54 };
55 
57 {
58 private:
59  // critical section to protect the inner data structures
60  mutable RecursiveMutex cs;
61 
62  // critical section to protect the inner data structures specifically on messaging
64 
65  // map to hold all MNs
66  std::vector<CMasternode> vMasternodes;
67  // who's asked for the Masternode list and the last time
68  std::map<CNetAddr, int64_t> mAskedUsForMasternodeList;
69  // who we asked for the Masternode list and the last time
70  std::map<CNetAddr, int64_t> mWeAskedForMasternodeList;
71  // which Masternodes we've asked for
72  std::map<COutPoint, int64_t> mWeAskedForMasternodeListEntry;
73 
74 public:
75  // Keep track of all broadcasts I've seen
76  std::map<uint256, CMasternodeBroadcast> mapSeenMasternodeBroadcast;
77  // Keep track of all pings I've seen
78  std::map<uint256, CMasternodePing> mapSeenMasternodePing;
79 
80  // keep track of dsq count to prevent masternodes from gaming obfuscation queue
81  // TODO: Remove this from serialization
82  int64_t nDsqCount;
83 
85 
86  template <typename Stream, typename Operation>
87  inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
88  {
89  LOCK(cs);
95 
98  }
99 
100  CMasternodeMan();
102 
104  bool Add(CMasternode& mn);
105 
107  void AskForMN(CNode* pnode, CTxIn& vin);
108 
110  void Check();
111 
113  void CheckAndRemove(bool forceExpiredRemoval = false);
114 
116  void Clear();
117 
118  int CountEnabled(int protocolVersion = -1);
119 
120  void CountNetworks(int protocolVersion, int& ipv4, int& ipv6, int& onion);
121 
122  void DsegUpdate(CNode* pnode);
123 
125  CMasternode* Find(const CScript& payee);
126  CMasternode* Find(const CTxIn& vin);
127  CMasternode* Find(const CPubKey& pubKeyMasternode);
128 
130  CMasternode* GetNextMasternodeInQueueForPayment(int nBlockHeight, bool fFilterSigTime, int& nCount);
131 
133  CMasternode* GetCurrentMasterNode(int mod = 1, int64_t nBlockHeight = 0, int minProtocol = 0);
134 
135  std::vector<CMasternode> GetFullMasternodeVector()
136  {
137  Check();
138  return vMasternodes;
139  }
140 
141  std::vector<std::pair<int, CMasternode> > GetMasternodeRanks(int64_t nBlockHeight, int minProtocol = 0);
142  int GetMasternodeRank(const CTxIn& vin, int64_t nBlockHeight, int minProtocol = 0, bool fOnlyActive = true);
143  CMasternode* GetMasternodeByRank(int nRank, int64_t nBlockHeight, int minProtocol = 0, bool fOnlyActive = true);
144 
145  void ProcessMessage(CNode* pfrom, std::string& strCommand, CDataStream& vRecv);
146 
148  int size() { return vMasternodes.size(); }
149 
151  int stable_size ();
152 
153  std::string ToString() const;
154 
155  void Remove(CTxIn vin);
156 
159 };
160 
162 
163 #endif
CTxIn
An input of a transaction.
Definition: transaction.h:83
CMasternodeDB::HashReadError
@ HashReadError
Definition: masternodeman.h:44
CMasternodeDB::FileError
@ FileError
Definition: masternodeman.h:43
CMasternodeMan::AskForMN
void AskForMN(CNode *pnode, CTxIn &vin)
Ask (source) node for mnb.
Definition: masternodeman.cpp:223
CMasternodeMan::CountEnabled
int CountEnabled(int protocolVersion=-1)
Definition: masternodeman.cpp:379
CActiveMasternode
Definition: activemasternode.h:23
CMasternodeMan::UpdateMasternodeList
void UpdateMasternodeList(CMasternodeBroadcast mnb)
Update masternode list and maps using provided CMasternodeBroadcast.
Definition: masternodeman.cpp:819
CMasternodeMan::GetMasternodeRank
int GetMasternodeRank(const CTxIn &vin, int64_t nBlockHeight, int minProtocol=0, bool fOnlyActive=true)
Definition: masternodeman.cpp:564
sync.h
CMasternodeMan::Find
CMasternode * Find(const CScript &payee)
Find an entry.
Definition: masternodeman.cpp:440
CMasternodeMan::CheckAndRemove
void CheckAndRemove(bool forceExpiredRemoval=false)
Check all Masternodes and remove inactive.
Definition: masternodeman.cpp:250
CNode
Information about a peer.
Definition: net.h:306
CMasternodeDB::Ok
@ Ok
Definition: masternodeman.h:42
CMasternodeMan::size
int size()
Return the number of (unique) Masternodes.
Definition: masternodeman.h:148
CMasternodeMan::vMasternodes
std::vector< CMasternode > vMasternodes
Definition: masternodeman.h:66
AnnotatedMixin< std::recursive_mutex >
CMasternodeMan::GetNextMasternodeInQueueForPayment
CMasternode * GetNextMasternodeInQueueForPayment(int nBlockHeight, bool fFilterSigTime, int &nCount)
Find an entry in the masternode list that is next to be paid.
Definition: masternodeman.cpp:479
CMasternodeMan::ToString
std::string ToString() const
Definition: masternodeman.cpp:838
ThreadCheckMasternodes
void ThreadCheckMasternodes()
Definition: masternodeman.cpp:847
CMasternodeMan::stable_size
int stable_size()
Return the number of Masternodes older than (default) 8000 seconds.
Definition: masternodeman.cpp:358
CMasternodeMan::GetMasternodeRanks
std::vector< std::pair< int, CMasternode > > GetMasternodeRanks(int64_t nBlockHeight, int minProtocol=0)
Definition: masternodeman.cpp:604
CMasternodeDB::IncorrectMagicNumber
@ IncorrectMagicNumber
Definition: masternodeman.h:47
CMasternodeMan::Remove
void Remove(CTxIn vin)
Definition: masternodeman.cpp:804
CMasternodeMan::mWeAskedForMasternodeListEntry
std::map< COutPoint, int64_t > mWeAskedForMasternodeListEntry
Definition: masternodeman.h:72
CMasternodeMan::GetFullMasternodeVector
std::vector< CMasternode > GetFullMasternodeVector()
Definition: masternodeman.h:135
strMasterNodePrivKey
std::string strMasterNodePrivKey
Definition: util.cpp:98
CMasternodeMan::Clear
void Clear()
Clear Masternode vector.
Definition: masternodeman.cpp:346
CMasternodeMan::ADD_SERIALIZE_METHODS
ADD_SERIALIZE_METHODS
Definition: masternodeman.h:84
CMasternodeMan::GetMasternodeByRank
CMasternode * GetMasternodeByRank(int nRank, int64_t nBlockHeight, int minProtocol=0, bool fOnlyActive=true)
Definition: masternodeman.cpp:641
CMasternodeDB::ReadResult
ReadResult
Definition: masternodeman.h:41
CMasternodeDB::Write
bool Write(const CMasternodeMan &mnodemanToSave)
Definition: masternodeman.cpp:60
CMasternodeMan::mapSeenMasternodeBroadcast
std::map< uint256, CMasternodeBroadcast > mapSeenMasternodeBroadcast
Definition: masternodeman.h:76
CMasternodeDB::IncorrectFormat
@ IncorrectFormat
Definition: masternodeman.h:48
CMasternodeMan::Add
bool Add(CMasternode &mn)
Add an entry.
Definition: masternodeman.cpp:206
activeMasternode
CActiveMasternode activeMasternode
Keep track of the active Masternode.
Definition: masternodeman.cpp:24
CMasternodeMan::GetCurrentMasterNode
CMasternode * GetCurrentMasterNode(int mod=1, int64_t nBlockHeight=0, int minProtocol=0)
Get the current winner for this block.
Definition: masternodeman.cpp:540
CScript
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:363
CMasternodeMan::Check
void Check()
Check all Masternodes.
Definition: masternodeman.cpp:241
CMasternodeMan::cs_process_message
RecursiveMutex cs_process_message
Definition: masternodeman.h:63
CMasternodeMan::ProcessMessage
void ProcessMessage(CNode *pfrom, std::string &strCommand, CDataStream &vRecv)
Definition: masternodeman.cpp:672
DumpMasternodes
void DumpMasternodes()
Definition: masternodeman.cpp:174
activemasternode.h
CMasternodeMan::CountNetworks
void CountNetworks(int protocolVersion, int &ipv4, int &ipv6, int &onion)
Definition: masternodeman.cpp:393
key.h
CMasternode
Definition: masternode.h:107
CPubKey
An encapsulated public key.
Definition: pubkey.h:37
READWRITE
#define READWRITE(obj)
Definition: serialize.h:164
CMasternodeMan::cs
RecursiveMutex cs
Definition: masternodeman.h:60
CMasternodeMan::CMasternodeMan
CMasternodeMan()
Definition: masternodeman.cpp:201
main.h
CMasternodeDB::IncorrectHash
@ IncorrectHash
Definition: masternodeman.h:45
CMasternodeMan::mapSeenMasternodePing
std::map< uint256, CMasternodePing > mapSeenMasternodePing
Definition: masternodeman.h:78
LOCK
#define LOCK(cs)
Definition: sync.h:182
CMasternodeMan
Definition: masternodeman.h:56
CMasternodeMan::DsegUpdate
void DsegUpdate(CNode *pnode)
Definition: masternodeman.cpp:419
CMasternodeDB::pathMN
fs::path pathMN
Definition: masternodeman.h:37
masternode.h
CMasternodeDB::IncorrectMagicMessage
@ IncorrectMagicMessage
Definition: masternodeman.h:46
CDataStream
Double ended buffer combining vector and stream-like interfaces.
Definition: streams.h:34
base58.h
CMasternodeMan::mAskedUsForMasternodeList
std::map< CNetAddr, int64_t > mAskedUsForMasternodeList
Definition: masternodeman.h:68
CMasternodeMan::mWeAskedForMasternodeList
std::map< CNetAddr, int64_t > mWeAskedForMasternodeList
Definition: masternodeman.h:70
net.h
CMasternodeBroadcast
Definition: masternode.h:292
CMasternodeMan::nDsqCount
int64_t nDsqCount
Definition: masternodeman.h:82
util.h
CMasternodeDB::CMasternodeDB
CMasternodeDB()
Definition: masternodeman.cpp:54
CMasternodeDB::Read
ReadResult Read(CMasternodeMan &mnodemanToLoad, bool fDryRun=false)
Definition: masternodeman.cpp:93
mnodeman
CMasternodeMan mnodeman
Masternode manager.
Definition: masternodeman.cpp:22
CMasternodeDB::strMagicMessage
std::string strMagicMessage
Definition: masternodeman.h:38
CMasternodeMan::SerializationOp
void SerializationOp(Stream &s, Operation ser_action, int nType, int nVersion)
Definition: masternodeman.h:87
CMasternodeDB
Access to the MN database (mncache.dat)
Definition: masternodeman.h:34