Dash Core  0.12.2.1
P2P Digital Currency
instantx.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 #ifndef INSTANTX_H
5 #define INSTANTX_H
6 
7 #include "chain.h"
8 #include "net.h"
10 
11 class CTxLockVote;
12 class COutPointLock;
13 class CTxLockRequest;
14 class CTxLockCandidate;
15 class CInstantSend;
16 
18 
19 /*
20  At 15 signatures, 1/2 of the masternode network can be owned by
21  one party without compromising the security of InstantSend
22  (1000/2150.0)**10 = 0.00047382219560689856
23  (1000/2900.0)**10 = 2.3769498616783657e-05
24 
25  ### getting 5 of 10 signatures w/ 1000 nodes of 2900
26  (1000/2900.0)**5 = 0.004875397277841433
27 */
29 static const int DEFAULT_INSTANTSEND_DEPTH = 5;
30 
31 static const int MIN_INSTANTSEND_PROTO_VERSION = 70208;
32 
33 // For how long we are going to accept votes/locks
34 // after we saw the first one for a specific transaction
35 static const int INSTANTSEND_LOCK_TIMEOUT_SECONDS = 15;
36 // For how long we are going to keep invalid votes and votes for failed lock attempts,
37 // must be greater than INSTANTSEND_LOCK_TIMEOUT_SECONDS
38 static const int INSTANTSEND_FAILED_TIMEOUT_SECONDS = 60;
39 
40 extern bool fEnableInstantSend;
41 extern int nInstantSendDepth;
42 extern int nCompleteTXLocks;
43 
45 {
46 private:
47  // Keep track of current block height
49 
50  // maps for AlreadyHave
51  std::map<uint256, CTxLockRequest> mapLockRequestAccepted; // tx hash - tx
52  std::map<uint256, CTxLockRequest> mapLockRequestRejected; // tx hash - tx
53  std::map<uint256, CTxLockVote> mapTxLockVotes; // vote hash - vote
54  std::map<uint256, CTxLockVote> mapTxLockVotesOrphan; // vote hash - vote
55 
56  std::map<uint256, CTxLockCandidate> mapTxLockCandidates; // tx hash - lock candidate
57 
58  std::map<COutPoint, std::set<uint256> > mapVotedOutpoints; // utxo - tx hash set
59  std::map<COutPoint, uint256> mapLockedOutpoints; // utxo - tx hash
60 
61  //track masternodes who voted with no txreq (for DOS protection)
62  std::map<COutPoint, int64_t> mapMasternodeOrphanVotes; // mn outpoint - time
63 
64  bool CreateTxLockCandidate(const CTxLockRequest& txLockRequest);
65  void CreateEmptyTxLockCandidate(const uint256& txHash);
66  void Vote(CTxLockCandidate& txLockCandidate, CConnman& connman);
67 
68  //process consensus vote message
69  bool ProcessTxLockVote(CNode* pfrom, CTxLockVote& vote, CConnman& connman);
70  void ProcessOrphanTxLockVotes(CConnman& connman);
71  bool IsEnoughOrphanVotesForTx(const CTxLockRequest& txLockRequest);
72  bool IsEnoughOrphanVotesForTxAndOutPoint(const uint256& txHash, const COutPoint& outpoint);
74 
75  void TryToFinalizeLockCandidate(const CTxLockCandidate& txLockCandidate);
76  void LockTransactionInputs(const CTxLockCandidate& txLockCandidate);
77  //update UI and notify external script if any
78  void UpdateLockedTransaction(const CTxLockCandidate& txLockCandidate);
79  bool ResolveConflicts(const CTxLockCandidate& txLockCandidate);
80 
81  bool IsInstantSendReadyToLock(const uint256 &txHash);
82 
83 public:
85 
86  void ProcessMessage(CNode* pfrom, std::string& strCommand, CDataStream& vRecv, CConnman& connman);
87 
88  bool ProcessTxLockRequest(const CTxLockRequest& txLockRequest, CConnman& connman);
89 
90  bool AlreadyHave(const uint256& hash);
91 
92  void AcceptLockRequest(const CTxLockRequest& txLockRequest);
93  void RejectLockRequest(const CTxLockRequest& txLockRequest);
94  bool HasTxLockRequest(const uint256& txHash);
95  bool GetTxLockRequest(const uint256& txHash, CTxLockRequest& txLockRequestRet);
96 
97  bool GetTxLockVote(const uint256& hash, CTxLockVote& txLockVoteRet);
98 
99  bool GetLockedOutPointTxHash(const COutPoint& outpoint, uint256& hashRet);
100 
101  // verify if transaction is currently locked
102  bool IsLockedInstantSendTransaction(const uint256& txHash);
103  // get the actual number of accepted lock signatures
104  int GetTransactionLockSignatures(const uint256& txHash);
105  // get instantsend confirmations (only)
106  int GetConfirmations(const uint256 &nTXHash);
107 
108  // remove expired entries from maps
109  void CheckAndRemove();
110  // verify if transaction lock timed out
111  bool IsTxLockCandidateTimedOut(const uint256& txHash);
112 
113  void Relay(const uint256& txHash, CConnman& connman);
114 
115  void UpdatedBlockTip(const CBlockIndex *pindex);
116  void SyncTransaction(const CTransaction& tx, const CBlock* pblock);
117 
118  std::string ToString();
119 };
120 
122 {
123 private:
124  static const CAmount MIN_FEE = 0.001 * COIN;
125 
126 public:
127  static const int WARN_MANY_INPUTS = 100;
128 
129  CTxLockRequest() = default;
131 
132  bool IsValid() const;
133  CAmount GetMinFee() const;
134  int GetMaxSignatures() const;
135 
136  explicit operator bool() const
137  {
138  return *this != CTxLockRequest();
139  }
140 };
141 
143 {
144 private:
148  std::vector<unsigned char> vchMasternodeSignature;
149  // local memory only
150  int nConfirmedHeight; // when corresponding tx is 0-confirmed or conflicted, nConfirmedHeight is -1
151  int64_t nTimeCreated;
152 
153 public:
155  txHash(),
156  outpoint(),
159  nConfirmedHeight(-1),
161  {}
162 
163  CTxLockVote(const uint256& txHashIn, const COutPoint& outpointIn, const COutPoint& outpointMasternodeIn) :
164  txHash(txHashIn),
165  outpoint(outpointIn),
166  outpointMasternode(outpointMasternodeIn),
168  nConfirmedHeight(-1),
170  {}
171 
173 
174  template <typename Stream, typename Operation>
175  inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
176  READWRITE(txHash);
180  }
181 
182  uint256 GetHash() const;
183 
184  uint256 GetTxHash() const { return txHash; }
185  COutPoint GetOutpoint() const { return outpoint; }
187 
188  bool IsValid(CNode* pnode, CConnman& connman) const;
189  void SetConfirmedHeight(int nConfirmedHeightIn) { nConfirmedHeight = nConfirmedHeightIn; }
190  bool IsExpired(int nHeight) const;
191  bool IsTimedOut() const;
192  bool IsFailed() const;
193 
194  bool Sign();
195  bool CheckSignature() const;
196 
197  void Relay(CConnman& connman) const;
198 };
199 
201 {
202 private:
204  std::map<COutPoint, CTxLockVote> mapMasternodeVotes; // masternode outpoint - vote
205  bool fAttacked = false;
206 
207 public:
208  static const int SIGNATURES_REQUIRED = 6;
209  static const int SIGNATURES_TOTAL = 10;
210 
211  COutPointLock(const COutPoint& outpointIn) :
212  outpoint(outpointIn),
214  {}
215 
216  COutPoint GetOutpoint() const { return outpoint; }
217 
218  bool AddVote(const CTxLockVote& vote);
219  std::vector<CTxLockVote> GetVotes() const;
220  bool HasMasternodeVoted(const COutPoint& outpointMasternodeIn) const;
221  int CountVotes() const { return fAttacked ? 0 : mapMasternodeVotes.size(); }
222  bool IsReady() const { return !fAttacked && CountVotes() >= SIGNATURES_REQUIRED; }
223  void MarkAsAttacked() { fAttacked = true; }
224 
225  void Relay(CConnman& connman) const;
226 };
227 
229 {
230 private:
231  int nConfirmedHeight; // when corresponding tx is 0-confirmed or conflicted, nConfirmedHeight is -1
232  int64_t nTimeCreated;
233 
234 public:
235  CTxLockCandidate(const CTxLockRequest& txLockRequestIn) :
236  nConfirmedHeight(-1),
238  txLockRequest(txLockRequestIn),
240  {}
241 
243  std::map<COutPoint, COutPointLock> mapOutPointLocks;
244 
245  uint256 GetHash() const { return txLockRequest.GetHash(); }
246 
247  void AddOutPointLock(const COutPoint& outpoint);
248  void MarkOutpointAsAttacked(const COutPoint& outpoint);
249  bool AddVote(const CTxLockVote& vote);
250  bool IsAllOutPointsReady() const;
251 
252  bool HasMasternodeVoted(const COutPoint& outpointIn, const COutPoint& outpointMasternodeIn);
253  int CountVotes() const;
254 
255  void SetConfirmedHeight(int nConfirmedHeightIn) { nConfirmedHeight = nConfirmedHeightIn; }
256  bool IsExpired(int nHeight) const;
257  bool IsTimedOut() const;
258 
259  void Relay(CConnman& connman) const;
260 };
261 
262 #endif
int nConfirmedHeight
Definition: instantx.h:150
static const int INSTANTSEND_CONFIRMATIONS_REQUIRED
Definition: instantx.h:28
int CountVotes() const
Definition: instantx.cpp:1185
CTxLockRequest()=default
void UpdateLockedTransaction(const CTxLockCandidate &txLockCandidate)
Definition: instantx.cpp:480
static const CAmount MIN_FEE
Definition: instantx.h:124
COutPoint outpointMasternode
Definition: instantx.h:147
int64_t GetAverageMasternodeOrphanVoteTime()
Definition: instantx.cpp:614
void TryToFinalizeLockCandidate(const CTxLockCandidate &txLockCandidate)
Definition: instantx.cpp:458
bool IsTxLockCandidateTimedOut(const uint256 &txHash)
Definition: instantx.cpp:816
#define READWRITE(obj)
Definition: serialize.h:175
bool GetLockedOutPointTxHash(const COutPoint &outpoint, uint256 &hashRet)
Definition: instantx.cpp:530
bool GetTxLockVote(const uint256 &hash, CTxLockVote &txLockVoteRet)
Definition: instantx.cpp:747
std::map< uint256, CTxLockVote > mapTxLockVotesOrphan
Definition: instantx.h:54
bool IsExpired(int nHeight) const
Definition: instantx.cpp:1091
void AcceptLockRequest(const CTxLockRequest &txLockRequest)
Definition: instantx.cpp:718
bool IsAllOutPointsReady() const
Definition: instantx.cpp:1167
bool IsEnoughOrphanVotesForTxAndOutPoint(const uint256 &txHash, const COutPoint &outpoint)
Definition: instantx.cpp:440
void UpdatedBlockTip(const CBlockIndex *pindex)
Definition: instantx.cpp:841
static const int SIGNATURES_REQUIRED
Definition: instantx.h:208
int nConfirmedHeight
Definition: instantx.h:231
static const int DEFAULT_INSTANTSEND_DEPTH
Definition: instantx.h:29
std::map< COutPoint, COutPointLock > mapOutPointLocks
Definition: instantx.h:243
COutPointLock(const COutPoint &outpointIn)
Definition: instantx.h:211
static const CAmount COIN
Definition: amount.h:16
void Relay(const uint256 &txHash, CConnman &connman)
Definition: instantx.cpp:831
bool CreateTxLockCandidate(const CTxLockRequest &txLockRequest)
Definition: instantx.cpp:131
std::map< uint256, CTxLockVote > mapTxLockVotes
Definition: instantx.h:53
Definition: net.h:108
static const int SIGNATURES_TOTAL
Definition: instantx.h:209
void CheckAndRemove()
Definition: instantx.cpp:631
bool HasMasternodeVoted(const COutPoint &outpointMasternodeIn) const
Definition: instantx.cpp:1130
bool AlreadyHave(const uint256 &hash)
Definition: instantx.cpp:710
int nCompleteTXLocks
Definition: instantx.cpp:28
uint256 GetHash() const
Definition: instantx.cpp:1038
uint256 GetHash() const
Definition: instantx.h:245
void Relay(CConnman &connman) const
Definition: instantx.cpp:1135
std::map< uint256, CTxLockRequest > mapLockRequestRejected
Definition: instantx.h:52
bool AddVote(const CTxLockVote &vote)
Definition: instantx.cpp:1160
bool IsFailed() const
Definition: instantx.cpp:1102
void ProcessOrphanTxLockVotes(CConnman &connman)
Definition: instantx.cpp:408
uint256 GetTxHash() const
Definition: instantx.h:184
COutPoint GetOutpoint() const
Definition: instantx.h:185
CTxLockRequest(const CTransaction &tx)
Definition: instantx.h:130
void Relay(CConnman &connman) const
Definition: instantx.cpp:1085
void SetConfirmedHeight(int nConfirmedHeightIn)
Definition: instantx.h:255
bool IsTimedOut() const
Definition: instantx.cpp:1203
std::map< COutPoint, uint256 > mapLockedOutpoints
Definition: instantx.h:59
COutPoint outpoint
Definition: instantx.h:146
int64_t CAmount
Definition: amount.h:14
void RejectLockRequest(const CTxLockRequest &txLockRequest)
Definition: instantx.cpp:724
ADD_SERIALIZE_METHODS
Definition: instantx.h:172
int nInstantSendDepth
Definition: instantx.cpp:27
std::map< COutPoint, CTxLockVote > mapMasternodeVotes
Definition: instantx.h:204
bool IsInstantSendReadyToLock(const uint256 &txHash)
Definition: instantx.cpp:758
int GetTransactionLockSignatures(const uint256 &txHash)
Definition: instantx.cpp:795
void Vote(CTxLockCandidate &txLockCandidate, CConnman &connman)
Definition: instantx.cpp:178
int nCachedBlockHeight
Definition: instantx.h:48
CCriticalSection cs_instantsend
Definition: instantx.h:84
Definition: net.h:661
CTxLockRequest txLockRequest
Definition: instantx.h:242
int GetConfirmations(const uint256 &nTXHash)
Definition: instantx.cpp:811
static const int INSTANTSEND_FAILED_TIMEOUT_SECONDS
Definition: instantx.h:38
std::string ToString()
Definition: instantx.cpp:912
COutPoint GetOutpoint() const
Definition: instantx.h:216
COutPoint GetMasternodeOutpoint() const
Definition: instantx.h:186
void ProcessMessage(CNode *pfrom, std::string &strCommand, CDataStream &vRecv, CConnman &connman)
Definition: instantx.cpp:43
std::map< COutPoint, int64_t > mapMasternodeOrphanVotes
Definition: instantx.h:62
bool IsLockedInstantSendTransaction(const uint256 &txHash)
Definition: instantx.cpp:770
int64_t nTimeCreated
Definition: instantx.h:232
bool fAttacked
Definition: instantx.h:205
void MarkAsAttacked()
Definition: instantx.h:223
bool fEnableInstantSend
Definition: instantx.cpp:26
bool IsValid(CNode *pnode, CConnman &connman) const
Definition: instantx.cpp:999
int64_t nTimeCreated
Definition: instantx.h:151
std::map< uint256, CTxLockCandidate > mapTxLockCandidates
Definition: instantx.h:56
int CountVotes() const
Definition: instantx.h:221
bool CheckSignature() const
Definition: instantx.cpp:1047
bool IsExpired(int nHeight) const
Definition: instantx.cpp:1197
bool IsValid() const
Definition: instantx.cpp:922
void Relay(CConnman &connman) const
Definition: instantx.cpp:1208
bool IsReady() const
Definition: instantx.h:222
const uint256 & GetHash() const
Definition: transaction.h:262
CAmount GetMinFee() const
Definition: instantx.cpp:984
std::map< COutPoint, std::set< uint256 > > mapVotedOutpoints
Definition: instantx.h:58
bool ProcessTxLockRequest(const CTxLockRequest &txLockRequest, CConnman &connman)
Definition: instantx.cpp:80
bool ProcessTxLockVote(CNode *pfrom, CTxLockVote &vote, CConnman &connman)
Definition: instantx.cpp:278
bool AddVote(const CTxLockVote &vote)
Definition: instantx.cpp:1111
COutPoint outpoint
Definition: instantx.h:203
std::vector< unsigned char > vchMasternodeSignature
Definition: instantx.h:148
CTxLockCandidate(const CTxLockRequest &txLockRequestIn)
Definition: instantx.h:235
uint256 txHash
Definition: instantx.h:145
bool HasTxLockRequest(const uint256 &txHash)
Definition: instantx.cpp:730
static const int INSTANTSEND_LOCK_TIMEOUT_SECONDS
Definition: instantx.h:35
bool GetTxLockRequest(const uint256 &txHash, CTxLockRequest &txLockRequestRet)
Definition: instantx.cpp:736
static const int WARN_MANY_INPUTS
Definition: instantx.h:127
void AddOutPointLock(const COutPoint &outpoint)
Definition: instantx.cpp:1148
void MarkOutpointAsAttacked(const COutPoint &outpoint)
Definition: instantx.cpp:1153
void SetConfirmedHeight(int nConfirmedHeightIn)
Definition: instantx.h:189
int64_t GetTime()
For unit testing.
Definition: utiltime.cpp:20
static const int MIN_INSTANTSEND_PROTO_VERSION
Definition: instantx.h:31
bool IsEnoughOrphanVotesForTx(const CTxLockRequest &txLockRequest)
Definition: instantx.cpp:427
std::vector< CTxLockVote > GetVotes() const
Definition: instantx.cpp:1119
int GetMaxSignatures() const
Definition: instantx.cpp:990
void SyncTransaction(const CTransaction &tx, const CBlock *pblock)
Definition: instantx.cpp:846
Definition: block.h:73
bool Sign()
Definition: instantx.cpp:1067
std::map< uint256, CTxLockRequest > mapLockRequestAccepted
Definition: instantx.h:51
void LockTransactionInputs(const CTxLockCandidate &txLockCandidate)
Definition: instantx.cpp:511
void SerializationOp(Stream &s, Operation ser_action, int nType, int nVersion)
Definition: instantx.h:175
CInstantSend instantsend
Definition: instantx.cpp:30
bool ResolveConflicts(const CTxLockCandidate &txLockCandidate)
Definition: instantx.cpp:539
bool IsTimedOut() const
Definition: instantx.cpp:1097
void CreateEmptyTxLockCandidate(const uint256 &txHash)
Definition: instantx.cpp:169
CTxLockVote(const uint256 &txHashIn, const COutPoint &outpointIn, const COutPoint &outpointMasternodeIn)
Definition: instantx.h:163
bool HasMasternodeVoted(const COutPoint &outpointIn, const COutPoint &outpointMasternodeIn)
Definition: instantx.cpp:1179