rippled
Transaction.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_APP_MISC_TRANSACTION_H_INCLUDED
21 #define RIPPLE_APP_MISC_TRANSACTION_H_INCLUDED
22 
23 #include <ripple/basics/RangeSet.h>
24 #include <ripple/beast/utility/Journal.h>
25 #include <ripple/protocol/ErrorCodes.h>
26 #include <ripple/protocol/Protocol.h>
27 #include <ripple/protocol/STTx.h>
28 #include <ripple/protocol/TER.h>
29 #include <boost/optional.hpp>
30 #include <boost/variant.hpp>
31 
32 namespace ripple {
33 
34 //
35 // Transactions should be constructed in JSON with. Use STObject::parseJson to
36 // obtain a binary version.
37 //
38 
39 class Application;
40 class Database;
41 class Rules;
42 
44  NEW = 0, // just received / generated
45  INVALID = 1, // no valid signature, insufficient funds
46  INCLUDED = 2, // added to the current ledger
47  CONFLICTED = 3, // losing to a conflicting transaction
48  COMMITTED = 4, // known to be in a ledger
49  HELD = 5, // not valid now, maybe later
50  REMOVED = 6, // taken out of a ledger
51  OBSOLETE = 7, // a compatible transaction has taken precedence
52  INCOMPLETE = 8 // needs more signatures
53 };
54 
55 // This class is for constructing and examining transactions.
56 // Transactions are static so manipulation functions are unnecessary.
57 class Transaction : public std::enable_shared_from_this<Transaction>,
58  public CountedObject<Transaction>
59 {
60 public:
61  static char const*
63  {
64  return "Transaction";
65  }
66 
68  using ref = const pointer&;
69 
72  std::string&,
73  Application&) noexcept;
74 
77  boost::optional<std::uint64_t> const& ledgerSeq,
78  boost::optional<std::string> const& status,
79  Blob const& rawTxn,
80  Application& app);
81 
82  static TransStatus
83  sqlTransactionStatus(boost::optional<std::string> const& status);
84 
87  {
88  return mTransaction;
89  }
90 
91  uint256 const&
92  getID() const
93  {
94  return mTransactionID;
95  }
96 
98  getLedger() const
99  {
100  return mInLedger;
101  }
102 
104  getStatus() const
105  {
106  return mStatus;
107  }
108 
109  TER
111  {
112  return mResult;
113  }
114 
115  void
116  setResult(TER terResult)
117  {
118  mResult = terResult;
119  }
120 
121  void
122  setStatus(TransStatus status, std::uint32_t ledgerSeq);
123 
124  void
126  {
127  mStatus = status;
128  }
129 
130  void
132  {
133  mInLedger = ledger;
134  }
135 
139  void
141  {
142  mApplying = true;
143  }
144 
150  bool
152  {
153  return mApplying;
154  }
155 
159  void
161  {
162  mApplying = false;
163  }
164 
166  {
170  void
172  {
173  applied = false;
174  broadcast = false;
175  queued = false;
176  kept = false;
177  }
178 
183  bool
184  any() const
185  {
186  return applied || broadcast || queued || kept;
187  }
188 
189  bool applied = false;
190  bool broadcast = false;
191  bool queued = false;
192  bool kept = false;
193  };
194 
201  {
202  return submitResult_;
203  }
204 
208  void
210  {
212  }
213 
217  void
219  {
220  submitResult_.applied = true;
221  }
222 
226  void
228  {
229  submitResult_.queued = true;
230  }
231 
235  void
237  {
238  submitResult_.broadcast = true;
239  }
240 
244  void
246  {
247  submitResult_.kept = true;
248  }
249 
251  {
252  CurrentLedgerState() = delete;
253 
255  LedgerIndex li,
256  XRPAmount fee,
257  std::uint32_t accSeqNext,
258  std::uint32_t accSeqAvail)
259  : validatedLedger{li}
260  , minFeeRequired{fee}
261  , accountSeqNext{accSeqNext}
262  , accountSeqAvail{accSeqAvail}
263  {
264  }
265 
270  };
271 
276  boost::optional<CurrentLedgerState>
278  {
279  return currentLedgerState_;
280  }
281 
289  void
291  LedgerIndex validatedLedger,
292  XRPAmount fee,
293  std::uint32_t accountSeq,
294  std::uint32_t availableSeq)
295  {
296  currentLedgerState_.emplace(
297  validatedLedger, fee, accountSeq, availableSeq);
298  }
299 
301  getJson(JsonOptions options, bool binary = false) const;
302 
303  static pointer
304  load(uint256 const& id, Application& app, error_code_i& ec);
305 
306  static boost::variant<Transaction::pointer, bool>
307  load(
308  uint256 const& id,
309  Application& app,
311  error_code_i& ec);
312 
313 private:
314  static boost::variant<Transaction::pointer, bool>
315  load(
316  uint256 const& id,
317  Application& app,
318  boost::optional<ClosedInterval<uint32_t>> const& range,
319  error_code_i& ec);
320 
322 
326  bool mApplying = false;
327 
330 
331  boost::optional<CurrentLedgerState> currentLedgerState_;
332 
336 };
337 
338 } // namespace ripple
339 
340 #endif
ripple::COMMITTED
@ COMMITTED
Definition: Transaction.h:48
ripple::Transaction::sqlTransactionStatus
static TransStatus sqlTransactionStatus(boost::optional< std::string > const &status)
Definition: Transaction.cpp:66
ripple::Application
Definition: Application.h:94
ripple::Transaction::CurrentLedgerState::accountSeqAvail
std::uint32_t accountSeqAvail
Definition: Transaction.h:269
ripple::Transaction::transactionFromSQL
static Transaction::pointer transactionFromSQL(boost::optional< std::uint64_t > const &ledgerSeq, boost::optional< std::string > const &status, Blob const &rawTxn, Application &app)
Definition: Transaction.cpp:89
ripple::CountedObject
Tracks the number of instances of an object.
Definition: CountedObject.h:110
ripple::Transaction::CurrentLedgerState::minFeeRequired
XRPAmount minFeeRequired
Definition: Transaction.h:267
std::string
STL class.
std::shared_ptr< Transaction >
ripple::Transaction::getJson
Json::Value getJson(JsonOptions options, bool binary=false) const
Definition: Transaction.cpp:192
ripple::Transaction::getSTransaction
std::shared_ptr< STTx const > const & getSTransaction()
Definition: Transaction.h:86
ripple::JsonOptions
JsonOptions
Definition: STBase.h:34
ripple::Transaction::SubmitResult::kept
bool kept
Definition: Transaction.h:192
std::vector< unsigned char >
ripple::Transaction::load
static pointer load(uint256 const &id, Application &app, error_code_i &ec)
Definition: Transaction.cpp:109
ripple::INCOMPLETE
@ INCOMPLETE
Definition: Transaction.h:52
ripple::Transaction::setLedger
void setLedger(LedgerIndex ledger)
Definition: Transaction.h:131
ripple::Transaction
Definition: Transaction.h:57
ripple::Transaction::SubmitResult
Definition: Transaction.h:165
ripple::Transaction::CurrentLedgerState
Definition: Transaction.h:250
ripple::NEW
@ NEW
Definition: Transaction.h:44
ripple::HELD
@ HELD
Definition: Transaction.h:49
ripple::Transaction::setApplied
void setApplied()
setApplied Set this flag once was applied to open ledger
Definition: Transaction.h:218
ripple::Transaction::setResult
void setResult(TER terResult)
Definition: Transaction.h:116
ripple::Transaction::mStatus
TransStatus mStatus
Definition: Transaction.h:324
ripple::Transaction::getSubmitResult
SubmitResult getSubmitResult() const
getSubmitResult Return submit result
Definition: Transaction.h:200
ripple::Transaction::getID
uint256 const & getID() const
Definition: Transaction.h:92
ripple::Transaction::CurrentLedgerState::accountSeqNext
std::uint32_t accountSeqNext
Definition: Transaction.h:268
ripple::error_code_i
error_code_i
Definition: ErrorCodes.h:40
ripple::TransStatus
TransStatus
Definition: Transaction.h:43
ripple::Transaction::setStatus
void setStatus(TransStatus status)
Definition: Transaction.h:125
ripple::temUNCERTAIN
@ temUNCERTAIN
Definition: TER.h:118
ripple::Transaction::mTransaction
std::shared_ptr< STTx const > mTransaction
Definition: Transaction.h:333
ripple::base_uint< 256 >
ripple::INCLUDED
@ INCLUDED
Definition: Transaction.h:46
ripple::Transaction::mTransactionID
uint256 mTransactionID
Definition: Transaction.h:321
ripple::Transaction::getCurrentLedgerState
boost::optional< CurrentLedgerState > getCurrentLedgerState() const
getCurrentLedgerState Get current ledger state of transaction
Definition: Transaction.h:277
ripple::Transaction::SubmitResult::clear
void clear()
clear Clear all states
Definition: Transaction.h:171
ripple::Transaction::clearSubmitResult
void clearSubmitResult()
clearSubmitResult Clear all flags in SubmitResult
Definition: Transaction.h:209
ripple::Transaction::getApplying
bool getApplying()
Detect if transaction is being batched.
Definition: Transaction.h:151
ripple::Transaction::SubmitResult::queued
bool queued
Definition: Transaction.h:191
ripple::Transaction::setCurrentLedgerState
void setCurrentLedgerState(LedgerIndex validatedLedger, XRPAmount fee, std::uint32_t accountSeq, std::uint32_t availableSeq)
setCurrentLedgerState Set current ledger state of transaction
Definition: Transaction.h:290
ripple::Transaction::Transaction
Transaction(std::shared_ptr< STTx const > const &, std::string &, Application &) noexcept
Definition: Transaction.cpp:35
ripple::OBSOLETE
@ OBSOLETE
Definition: Transaction.h:51
ripple::Transaction::CurrentLedgerState::CurrentLedgerState
CurrentLedgerState()=delete
ripple::Transaction::getLedger
LedgerIndex getLedger() const
Definition: Transaction.h:98
ripple::TERSubset< CanCvtToTER >
ripple::Transaction::CurrentLedgerState::CurrentLedgerState
CurrentLedgerState(LedgerIndex li, XRPAmount fee, std::uint32_t accSeqNext, std::uint32_t accSeqAvail)
Definition: Transaction.h:254
ripple::Transaction::setKept
void setKept()
setKept Set this flag once was put to localtxns queue
Definition: Transaction.h:245
std::enable_shared_from_this
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::Transaction::SubmitResult::any
bool any() const
any Get true of any state is true
Definition: Transaction.h:184
std::uint32_t
ripple::Transaction::submitResult_
SubmitResult submitResult_
different ways for transaction to be accepted
Definition: Transaction.h:329
ripple::CONFLICTED
@ CONFLICTED
Definition: Transaction.h:47
ripple::range
ClosedInterval< T > range(T low, T high)
Create a closed range interval.
Definition: RangeSet.h:53
ripple::Transaction::mInLedger
LedgerIndex mInLedger
Definition: Transaction.h:323
ripple::Transaction::mResult
TER mResult
Definition: Transaction.h:325
ripple::Transaction::getStatus
TransStatus getStatus() const
Definition: Transaction.h:104
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::REMOVED
@ REMOVED
Definition: Transaction.h:50
ripple::Transaction::currentLedgerState_
boost::optional< CurrentLedgerState > currentLedgerState_
Definition: Transaction.h:331
ripple::Transaction::SubmitResult::applied
bool applied
Definition: Transaction.h:189
ripple::INVALID
@ INVALID
Definition: Transaction.h:45
ripple::Transaction::setStatus
void setStatus(TransStatus status, std::uint32_t ledgerSeq)
Definition: Transaction.cpp:59
ripple::Transaction::getCountedObjectName
static char const * getCountedObjectName()
Definition: Transaction.h:62
ripple::Transaction::pointer
std::shared_ptr< Transaction > pointer
Definition: Transaction.h:67
ripple::Transaction::mApp
Application & mApp
Definition: Transaction.h:334
ripple::Transaction::j_
beast::Journal j_
Definition: Transaction.h:335
ripple::Transaction::SubmitResult::broadcast
bool broadcast
Definition: Transaction.h:190
ripple::ClosedInterval
boost::icl::closed_interval< T > ClosedInterval
A closed interval over the domain T.
Definition: RangeSet.h:44
ripple::Transaction::mApplying
bool mApplying
Definition: Transaction.h:326
ripple::Transaction::setApplying
void setApplying()
Set this flag once added to a batch.
Definition: Transaction.h:140
ripple::Transaction::setQueued
void setQueued()
setQueued Set this flag once was put into heldtxns queue
Definition: Transaction.h:227
ripple::Transaction::CurrentLedgerState::validatedLedger
LedgerIndex validatedLedger
Definition: Transaction.h:266
ripple::Transaction::setBroadcast
void setBroadcast()
setBroadcast Set this flag once was broadcasted via network
Definition: Transaction.h:236
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::Transaction::clearApplying
void clearApplying()
Indicate that transaction application has been attempted.
Definition: Transaction.h:160
ripple::Transaction::getResult
TER getResult()
Definition: Transaction.h:110