PRCYCoin  2.0.0.7rc1
P2P Digital Currency
masternode-payments.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 MASTERNODE_PAYMENTS_H
8 #define MASTERNODE_PAYMENTS_H
9 
10 #include "key.h"
11 #include "main.h"
12 #include "masternode.h"
13 
14 
18 
22 
24 
25 #define MNPAYMENTS_SIGNATURES_REQUIRED 6
26 #define MNPAYMENTS_SIGNATURES_TOTAL 10
27 
28 void ProcessMessageMasternodePayments(CNode* pfrom, std::string& strCommand, CDataStream& vRecv);
29 bool IsBlockPayeeValid(const CBlock& block, int nBlockHeight);
31 bool IsBlockValueValid(int nHeight, CAmount nExpectedValue, CAmount nMinted);
32 bool FillBlockPayee(CMutableTransaction& txNew, CAmount nFees, bool fProofOfStake);
33 
35 
39 {
40 private:
41  fs::path pathDB;
42  std::string strMagicMessage;
43 
44 public:
45  enum ReadResult {
46  Ok,
53  };
54 
56  bool Write(const CMasternodePayments& objToSave);
57  ReadResult Read(CMasternodePayments& objToLoad, bool fDryRun = false);
58 };
59 
61 {
62 public:
63  int nVotes;
64  std::vector<unsigned char> masternodeStealthAddress;
65 
67  {
68  nVotes = 0;
69  }
70 
71  CMasternodePayee(int nVotesIn, std::vector<unsigned char> masternodeStealthAddress)
72  {
73  nVotes = nVotesIn;
74  this->masternodeStealthAddress = masternodeStealthAddress;
75  }
76 
78 
79  template <typename Stream, typename Operation>
80  inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
81  {
84  }
85 };
86 
87 // Keep track of votes for payees from masternodes
89 {
90 public:
92  std::vector<CMasternodePayee> vecPayments;
93 
95  {
96  nBlockHeight = 0;
97  vecPayments.clear();
98  }
99  CMasternodeBlockPayees(int nBlockHeightIn)
100  {
101  nBlockHeight = nBlockHeightIn;
102  vecPayments.clear();
103  }
104 
105  void AddPayee(int nIncrement, std::vector<unsigned char> masternodeStealthAddress)
106  {
108 
109  for (CMasternodePayee& payee : vecPayments) {
110  if (payee.masternodeStealthAddress == masternodeStealthAddress) {
111  payee.nVotes += nIncrement;
112  return;
113  }
114  }
115 
116  CMasternodePayee c(nIncrement, masternodeStealthAddress);
117  vecPayments.push_back(c);
118  }
119 
120  bool GetPayee(std::vector<unsigned char>& payee)
121  {
123 
124  int nVotes = -1;
125  for (CMasternodePayee& p : vecPayments) {
126  if (p.nVotes > nVotes) {
127  payee = p.masternodeStealthAddress;
128  nVotes = p.nVotes;
129  }
130  }
131 
132  return (nVotes > -1);
133  }
134 
135  bool HasPayeeWithVotes(std::vector<unsigned char> payee, int nVotesReq)
136  {
138 
139  for (CMasternodePayee& p : vecPayments) {
140  if (p.nVotes >= nVotesReq && p.masternodeStealthAddress == payee) return true;
141  }
142 
143  return false;
144  }
145 
146  bool IsTransactionValid(const CTransaction& txNew);
147  std::string GetRequiredPaymentsString();
148 
150 
151  template <typename Stream, typename Operation>
152  inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
153  {
156  }
157 };
158 
159 // for storing the winning payments
161 {
162 public:
164 
166  std::vector<unsigned char> payee;//masternode stealth public address
167  std::vector<unsigned char> vchSig;
168 
170  {
171  nBlockHeight = 0;
172  vinMasternode = CTxIn();
173  }
174 
176  {
177  nBlockHeight = 0;
178  vinMasternode = vinIn;
180  }
181 
183  {
184  CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION);
185  ss << payee;
186  ss << nBlockHeight;
187  ss << vinMasternode.prevout;
188 
189  return ss.GetHash();
190  }
191 
192  bool Sign(CKey& keyMasternode, CPubKey& pubKeyMasternode);
193  bool IsValid(CNode* pnode, std::string& strError);
194  bool SignatureValid();
195  void Relay();
196 
197  void AddPayee(std::vector<unsigned char> payeeIn)
198  {
199  payee = payeeIn;
200  }
201 
202 
204 
205  template <typename Stream, typename Operation>
206  inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
207  {
210  READWRITE(payee);
211  READWRITE(vchSig);
212  }
213 
214  std::string ToString()
215  {
216  std::string s(payee.begin(), payee.end());
217  std::string ret = "";
218  ret += vinMasternode.ToString();
219  ret += ", " + std::to_string(nBlockHeight);
220  ret += ", " + s;
221  ret += ", " + std::to_string((int)vchSig.size());
222  return ret;
223  }
224 };
225 
226 //
227 // Masternode Payments Class
228 // Keeps track of who should get paid for which blocks
229 //
230 
232 {
233 private:
236 
237 public:
238  std::map<uint256, CMasternodePaymentWinner> mapMasternodePayeeVotes;
239  std::map<int, CMasternodeBlockPayees> mapMasternodeBlocks;
240  std::map<uint256, int> mapMasternodesLastVote; //prevout.hash + prevout.n, nBlockHeight
241 
243  {
244  nSyncedFromPeer = 0;
245  nLastBlockHeight = 0;
246  }
247 
248  void Clear()
249  {
251  mapMasternodeBlocks.clear();
252  mapMasternodePayeeVotes.clear();
253  }
254 
256  bool ProcessBlock(int nBlockHeight);
257 
258  void Sync(CNode* node, int nCountNeeded);
259  void CleanPaymentList();
260  int LastPayment(CMasternode& mn);
261 
262  bool GetBlockPayee(int nBlockHeight, std::vector<unsigned char>& payee);
263  bool IsTransactionValid(const CTransaction& txNew, int nBlockHeight);
264  bool IsScheduled(CMasternode& mn, int nNotBlockHeight);
265 
266  bool CanVote(COutPoint outMasternode, int nBlockHeight)
267  {
269 
270  if (mapMasternodesLastVote.count(outMasternode.hash + outMasternode.n)) {
271  if (mapMasternodesLastVote[outMasternode.hash + outMasternode.n] == nBlockHeight) {
272  return false;
273  }
274  }
275 
276  //record this masternode voted
277  mapMasternodesLastVote[outMasternode.hash + outMasternode.n] = nBlockHeight;
278  return true;
279  }
280 
282  void ProcessMessageMasternodePayments(CNode* pfrom, std::string& strCommand, CDataStream& vRecv);
283  std::string GetRequiredPaymentsString(int nBlockHeight);
284  bool FillBlockPayee(CMutableTransaction& txNew, int64_t nFees, bool fProofOfStake);
285  std::string ToString() const;
286  int GetOldestBlock();
287  int GetNewestBlock();
288 
290 
291  template <typename Stream, typename Operation>
292  inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
293  {
296  }
297 };
298 
299 
300 #endif
CTxIn
An input of a transaction.
Definition: transaction.h:83
LOCK2
#define LOCK2(cs1, cs2)
Definition: sync.h:183
CMasternodePaymentWinner::GetHash
uint256 GetHash()
Definition: masternode-payments.h:182
IsBlockValueValid
bool IsBlockValueValid(int nHeight, CAmount nExpectedValue, CAmount nMinted)
Definition: masternode-payments.cpp:175
CMasternodePaymentWinner::Relay
void Relay()
Definition: masternode-payments.cpp:682
CMasternodePayments::nLastBlockHeight
int nLastBlockHeight
Definition: masternode-payments.h:235
SER_GETHASH
@ SER_GETHASH
Definition: serialize.h:161
CMasternodePayments::GetMinMasternodePaymentsProto
int GetMinMasternodePaymentsProto()
Definition: masternode-payments.cpp:293
CMasternodePayments::CanVote
bool CanVote(COutPoint outMasternode, int nBlockHeight)
Definition: masternode-payments.h:266
CMasternodePaymentDB::Write
bool Write(const CMasternodePayments &objToSave)
Definition: masternode-payments.cpp:35
CMasternodePayee::nVotes
int nVotes
Definition: masternode-payments.h:63
CMasternodePaymentDB::Read
ReadResult Read(CMasternodePayments &objToLoad, bool fDryRun=false)
Definition: masternode-payments.cpp:66
CMasternodePayments::Sync
void Sync(CNode *node, int nCountNeeded)
Definition: masternode-payments.cpp:707
CMasternodePayments::GetBlockPayee
bool GetBlockPayee(int nBlockHeight, std::vector< unsigned char > &payee)
Definition: masternode-payments.cpp:398
CMasternodePaymentWinner
Definition: masternode-payments.h:160
CMasternodeBlockPayees::HasPayeeWithVotes
bool HasPayeeWithVotes(std::vector< unsigned char > payee, int nVotesReq)
Definition: masternode-payments.h:135
COutPoint::hash
uint256 hash
Definition: transaction.h:39
cs_mapMasternodePayeeVotes
RecursiveMutex cs_mapMasternodePayeeVotes
Definition: masternode-payments.cpp:23
CMasternodePaymentDB::strMagicMessage
std::string strMagicMessage
Definition: masternode-payments.h:42
CMasternodePaymentWinner::IsValid
bool IsValid(CNode *pnode, std::string &strError)
Definition: masternode-payments.cpp:583
CNode
Information about a peer.
Definition: net.h:306
CMasternodePaymentWinner::SerializationOp
void SerializationOp(Stream &s, Operation ser_action, int nType, int nVersion)
Definition: masternode-payments.h:206
CMasternodePayee::CMasternodePayee
CMasternodePayee()
Definition: masternode-payments.h:66
CMasternodePaymentWinner::ToString
std::string ToString()
Definition: masternode-payments.h:214
cs_vecPayments
RecursiveMutex cs_vecPayments
Definition: masternode-payments.cpp:21
CMasternodePayee::CMasternodePayee
CMasternodePayee(int nVotesIn, std::vector< unsigned char > masternodeStealthAddress)
Definition: masternode-payments.h:71
CMasternodePayments::ProcessBlock
bool ProcessBlock(int nBlockHeight)
Definition: masternode-payments.cpp:615
CMasternodePayments::mapMasternodePayeeVotes
std::map< uint256, CMasternodePaymentWinner > mapMasternodePayeeVotes
Definition: masternode-payments.h:238
CMasternodePayee
Definition: masternode-payments.h:60
CMasternodePaymentWinner::AddPayee
void AddPayee(std::vector< unsigned char > payeeIn)
Definition: masternode-payments.h:197
AnnotatedMixin< std::recursive_mutex >
CMasternodeBlockPayees::AddPayee
void AddPayee(int nIncrement, std::vector< unsigned char > masternodeStealthAddress)
Definition: masternode-payments.h:105
CMasternodeBlockPayees::vecPayments
std::vector< CMasternodePayee > vecPayments
Definition: masternode-payments.h:92
CMasternodePaymentDB
Save Masternode Payment Data (mnpayments.dat)
Definition: masternode-payments.h:38
CMasternodePaymentWinner::Sign
bool Sign(CKey &keyMasternode, CPubKey &pubKeyMasternode)
Definition: masternode-payments.cpp:376
CMasternodePaymentDB::IncorrectFormat
@ IncorrectFormat
Definition: masternode-payments.h:52
CMasternodePaymentDB::CMasternodePaymentDB
CMasternodePaymentDB()
Definition: masternode-payments.cpp:29
CTxIn::masternodeStealthAddress
std::vector< unsigned char > masternodeStealthAddress
Definition: transaction.h:99
CTransaction
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:269
CMasternodeBlockPayees::ADD_SERIALIZE_METHODS
ADD_SERIALIZE_METHODS
Definition: masternode-payments.h:149
CMasternodePayments::GetOldestBlock
int GetOldestBlock()
Definition: masternode-payments.cpp:744
CMasternodePaymentWinner::ADD_SERIALIZE_METHODS
ADD_SERIALIZE_METHODS
Definition: masternode-payments.h:203
CMasternodePayments::GetRequiredPaymentsString
std::string GetRequiredPaymentsString(int nBlockHeight)
Definition: masternode-payments.cpp:532
CMasternodePaymentWinner::CMasternodePaymentWinner
CMasternodePaymentWinner()
Definition: masternode-payments.h:169
CMasternodeBlockPayees::IsTransactionValid
bool IsTransactionValid(const CTransaction &txNew)
Definition: masternode-payments.cpp:465
CMasternodePaymentDB::ReadResult
ReadResult
Definition: masternode-payments.h:45
CMasternodePayments::LastPayment
int LastPayment(CMasternode &mn)
CMasternodePayments::CleanPaymentList
void CleanPaymentList()
Definition: masternode-payments.cpp:554
CMasternodePaymentWinner::payee
std::vector< unsigned char > payee
Definition: masternode-payments.h:166
CMasternodePayments::FillBlockPayee
bool FillBlockPayee(CMutableTransaction &txNew, int64_t nFees, bool fProofOfStake)
Definition: masternode-payments.cpp:227
CMasternodePaymentDB::Ok
@ Ok
Definition: masternode-payments.h:46
CMasternodePayee::ADD_SERIALIZE_METHODS
ADD_SERIALIZE_METHODS
Definition: masternode-payments.h:77
CMasternodePaymentDB::HashReadError
@ HashReadError
Definition: masternode-payments.h:48
CMasternodeBlockPayees::GetRequiredPaymentsString
std::string GetRequiredPaymentsString()
Definition: masternode-payments.cpp:512
GetRequiredPaymentsString
std::string GetRequiredPaymentsString(int nBlockHeight)
Definition: masternode-payments.cpp:222
CMasternodePaymentDB::FileError
@ FileError
Definition: masternode-payments.h:47
CMasternodeBlockPayees::nBlockHeight
int nBlockHeight
Definition: masternode-payments.h:91
DumpMasternodePayments
void DumpMasternodePayments()
Definition: masternode-payments.cpp:148
CMasternodePayments::Clear
void Clear()
Definition: masternode-payments.h:248
CMasternodeBlockPayees::CMasternodeBlockPayees
CMasternodeBlockPayees()
Definition: masternode-payments.h:94
CAmount
int64_t CAmount
Amount in PRCY (Can be negative)
Definition: amount.h:17
masternodePayments
CMasternodePayments masternodePayments
Object for who's going to get paid on which blocks.
Definition: masternode-payments.cpp:19
uint256
256-bit unsigned big integer.
Definition: uint256.h:38
CMasternodeBlockPayees
Definition: masternode-payments.h:88
CMasternodePayments::mapMasternodesLastVote
std::map< uint256, int > mapMasternodesLastVote
Definition: masternode-payments.h:240
CMasternodeBlockPayees::CMasternodeBlockPayees
CMasternodeBlockPayees(int nBlockHeightIn)
Definition: masternode-payments.h:99
CMasternodePaymentWinner::vinMasternode
CTxIn vinMasternode
Definition: masternode-payments.h:163
CMasternodePayments::mapMasternodeBlocks
std::map< int, CMasternodeBlockPayees > mapMasternodeBlocks
Definition: masternode-payments.h:239
CMasternodeBlockPayees::SerializationOp
void SerializationOp(Stream &s, Operation ser_action, int nType, int nVersion)
Definition: masternode-payments.h:152
CMasternodePaymentWinner::nBlockHeight
int nBlockHeight
Definition: masternode-payments.h:165
CMasternodePayments::ADD_SERIALIZE_METHODS
ADD_SERIALIZE_METHODS
Definition: masternode-payments.h:289
CBlock
Definition: block.h:142
CMasternodePayments::CMasternodePayments
CMasternodePayments()
Definition: masternode-payments.h:242
key.h
CMasternode
Definition: masternode.h:107
CMasternodeBlockPayees::GetPayee
bool GetPayee(std::vector< unsigned char > &payee)
Definition: masternode-payments.h:120
CPubKey
An encapsulated public key.
Definition: pubkey.h:37
READWRITE
#define READWRITE(obj)
Definition: serialize.h:164
CKey
An encapsulated private key.
Definition: key.h:39
CTxIn::ToString
std::string ToString() const
Definition: transaction.cpp:50
main.h
COutPoint::n
uint32_t n
Definition: transaction.h:40
LOCK
#define LOCK(cs)
Definition: sync.h:182
CMasternodePayments::GetNewestBlock
int GetNewestBlock()
Definition: masternode-payments.cpp:762
CTxIn::prevout
COutPoint prevout
Definition: transaction.h:86
CHashWriter
A writer stream (for serialization) that computes a 256-bit hash.
Definition: hash.h:259
FillBlockPayee
bool FillBlockPayee(CMutableTransaction &txNew, CAmount nFees, bool fProofOfStake)
Definition: masternode-payments.cpp:214
CMasternodePayments::nSyncedFromPeer
int nSyncedFromPeer
Definition: masternode-payments.h:234
masternode.h
CMasternodePayments::IsTransactionValid
bool IsTransactionValid(const CTransaction &txNew, int nBlockHeight)
Definition: masternode-payments.cpp:543
CMasternodePayments::SerializationOp
void SerializationOp(Stream &s, Operation ser_action, int nType, int nVersion)
Definition: masternode-payments.h:292
CDataStream
Double ended buffer combining vector and stream-like interfaces.
Definition: streams.h:34
COutPoint
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:36
CMasternodePaymentDB::IncorrectMagicMessage
@ IncorrectMagicMessage
Definition: masternode-payments.h:50
cs_mapMasternodeBlocks
RecursiveMutex cs_mapMasternodeBlocks
Definition: masternode-payments.cpp:22
CMutableTransaction
A mutable version of CTransaction.
Definition: transaction.h:384
CHashWriter::GetHash
uint256 GetHash()
Definition: hash.h:277
CMasternodePaymentDB::pathDB
fs::path pathDB
Definition: masternode-payments.h:41
IsBlockPayeeValid
bool IsBlockPayeeValid(const CBlock &block, int nBlockHeight)
Definition: masternode-payments.cpp:194
ProcessMessageMasternodePayments
void ProcessMessageMasternodePayments(CNode *pfrom, std::string &strCommand, CDataStream &vRecv)
CMasternodePaymentWinner::CMasternodePaymentWinner
CMasternodePaymentWinner(CTxIn vinIn)
Definition: masternode-payments.h:175
CMasternodePayee::SerializationOp
void SerializationOp(Stream &s, Operation ser_action, int nType, int nVersion)
Definition: masternode-payments.h:80
CMasternodePaymentWinner::SignatureValid
bool SignatureValid()
Definition: masternode-payments.cpp:688
CMasternodePayments::IsScheduled
bool IsScheduled(CMasternode &mn, int nNotBlockHeight)
Definition: masternode-payments.cpp:409
CMasternodePayee::masternodeStealthAddress
std::vector< unsigned char > masternodeStealthAddress
Definition: masternode-payments.h:64
CMasternodePaymentDB::IncorrectMagicNumber
@ IncorrectMagicNumber
Definition: masternode-payments.h:51
CMasternodePaymentWinner::vchSig
std::vector< unsigned char > vchSig
Definition: masternode-payments.h:167
CMasternodePayments
Definition: masternode-payments.h:231
CMasternodePayments::AddWinningMasternode
bool AddWinningMasternode(CMasternodePaymentWinner &winner)
Definition: masternode-payments.cpp:438
CMasternodePaymentDB::IncorrectHash
@ IncorrectHash
Definition: masternode-payments.h:49
CMasternodePayments::ToString
std::string ToString() const
Definition: masternode-payments.cpp:734
CMasternodePayments::ProcessMessageMasternodePayments
void ProcessMessageMasternodePayments(CNode *pfrom, std::string &strCommand, CDataStream &vRecv)
Definition: masternode-payments.cpp:298