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/ledger/TxMeta.h>
26 #include <ripple/protocol/ErrorCodes.h>
27 #include <ripple/protocol/Protocol.h>
28 #include <ripple/protocol/STTx.h>
29 #include <ripple/protocol/TER.h>
30 #include <boost/optional.hpp>
31 #include <boost/variant.hpp>
32 
33 namespace ripple {
34 
35 //
36 // Transactions should be constructed in JSON with. Use STObject::parseJson to
37 // obtain a binary version.
38 //
39 
40 class Application;
41 class Database;
42 class Rules;
43 
45  NEW = 0, // just received / generated
46  INVALID = 1, // no valid signature, insufficient funds
47  INCLUDED = 2, // added to the current ledger
48  CONFLICTED = 3, // losing to a conflicting transaction
49  COMMITTED = 4, // known to be in a ledger
50  HELD = 5, // not valid now, maybe later
51  REMOVED = 6, // taken out of a ledger
52  OBSOLETE = 7, // a compatible transaction has taken precedence
53  INCOMPLETE = 8 // needs more signatures
54 };
55 
56 enum class TxSearched { all, some, unknown };
57 
58 // This class is for constructing and examining transactions.
59 // Transactions are static so manipulation functions are unnecessary.
60 class Transaction : public std::enable_shared_from_this<Transaction>,
61  public CountedObject<Transaction>
62 {
63 public:
64  static char const*
66  {
67  return "Transaction";
68  }
69 
71  using ref = const pointer&;
72 
75  std::string&,
76  Application&) noexcept;
77 
80  boost::optional<std::uint64_t> const& ledgerSeq,
81  boost::optional<std::string> const& status,
82  Blob const& rawTxn,
83  Application& app);
84 
85  static TransStatus
86  sqlTransactionStatus(boost::optional<std::string> const& status);
87 
90  {
91  return mTransaction;
92  }
93 
94  uint256 const&
95  getID() const
96  {
97  return mTransactionID;
98  }
99 
101  getLedger() const
102  {
103  return mInLedger;
104  }
105 
106  bool
107  isValidated() const
108  {
109  return mInLedger != 0;
110  }
111 
113  getStatus() const
114  {
115  return mStatus;
116  }
117 
118  TER
120  {
121  return mResult;
122  }
123 
124  void
125  setResult(TER terResult)
126  {
127  mResult = terResult;
128  }
129 
130  void
131  setStatus(TransStatus status, std::uint32_t ledgerSeq);
132 
133  void
135  {
136  mStatus = status;
137  }
138 
139  void
141  {
142  mInLedger = ledger;
143  }
144 
148  void
150  {
151  mApplying = true;
152  }
153 
159  bool
161  {
162  return mApplying;
163  }
164 
168  void
170  {
171  mApplying = false;
172  }
173 
175  {
179  void
181  {
182  applied = false;
183  broadcast = false;
184  queued = false;
185  kept = false;
186  }
187 
192  bool
193  any() const
194  {
195  return applied || broadcast || queued || kept;
196  }
197 
198  bool applied = false;
199  bool broadcast = false;
200  bool queued = false;
201  bool kept = false;
202  };
203 
210  {
211  return submitResult_;
212  }
213 
217  void
219  {
221  }
222 
226  void
228  {
229  submitResult_.applied = true;
230  }
231 
235  void
237  {
238  submitResult_.queued = true;
239  }
240 
244  void
246  {
247  submitResult_.broadcast = true;
248  }
249 
253  void
255  {
256  submitResult_.kept = true;
257  }
258 
260  {
261  CurrentLedgerState() = delete;
262 
264  LedgerIndex li,
265  XRPAmount fee,
266  std::uint32_t accSeqNext,
267  std::uint32_t accSeqAvail)
268  : validatedLedger{li}
269  , minFeeRequired{fee}
270  , accountSeqNext{accSeqNext}
271  , accountSeqAvail{accSeqAvail}
272  {
273  }
274 
279  };
280 
285  boost::optional<CurrentLedgerState>
287  {
288  return currentLedgerState_;
289  }
290 
298  void
300  LedgerIndex validatedLedger,
301  XRPAmount fee,
302  std::uint32_t accountSeq,
303  std::uint32_t availableSeq)
304  {
305  currentLedgerState_.emplace(
306  validatedLedger, fee, accountSeq, availableSeq);
307  }
308 
310  getJson(JsonOptions options, bool binary = false) const;
311 
312  static std::variant<
314  TxSearched>
315  load(uint256 const& id, Application& app, error_code_i& ec);
316 
317  static std::variant<
319  TxSearched>
320  load(
321  uint256 const& id,
322  Application& app,
324  error_code_i& ec);
325 
326 private:
327  static std::variant<
329  TxSearched>
330  load(
331  uint256 const& id,
332  Application& app,
333  boost::optional<ClosedInterval<uint32_t>> const& range,
334  error_code_i& ec);
335 
337 
341  bool mApplying = false;
342 
345 
346  boost::optional<CurrentLedgerState> currentLedgerState_;
347 
351 };
352 
353 } // namespace ripple
354 
355 #endif
ripple::COMMITTED
@ COMMITTED
Definition: Transaction.h:49
ripple::Transaction::sqlTransactionStatus
static TransStatus sqlTransactionStatus(boost::optional< std::string > const &status)
Definition: Transaction.cpp:66
ripple::Application
Definition: Application.h:97
ripple::Transaction::CurrentLedgerState::accountSeqAvail
std::uint32_t accountSeqAvail
Definition: Transaction.h:278
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::TxSearched::unknown
@ unknown
ripple::CountedObject
Tracks the number of instances of an object.
Definition: CountedObject.h:110
ripple::Transaction::CurrentLedgerState::minFeeRequired
XRPAmount minFeeRequired
Definition: Transaction.h:276
std::string
STL class.
std::shared_ptr< Transaction >
ripple::Transaction::getJson
Json::Value getJson(JsonOptions options, bool binary=false) const
Definition: Transaction.cpp:213
ripple::Transaction::getSTransaction
std::shared_ptr< STTx const > const & getSTransaction()
Definition: Transaction.h:89
ripple::JsonOptions
JsonOptions
Definition: STBase.h:34
std::pair
ripple::Transaction::SubmitResult::kept
bool kept
Definition: Transaction.h:201
ripple::TxSearched::all
@ all
ripple::TxSearched
TxSearched
Definition: Transaction.h:56
std::vector< unsigned char >
ripple::INCOMPLETE
@ INCOMPLETE
Definition: Transaction.h:53
ripple::Transaction::setLedger
void setLedger(LedgerIndex ledger)
Definition: Transaction.h:140
ripple::Transaction
Definition: Transaction.h:60
ripple::Transaction::SubmitResult
Definition: Transaction.h:174
ripple::Transaction::CurrentLedgerState
Definition: Transaction.h:259
ripple::NEW
@ NEW
Definition: Transaction.h:45
ripple::HELD
@ HELD
Definition: Transaction.h:50
ripple::Transaction::setApplied
void setApplied()
setApplied Set this flag once was applied to open ledger
Definition: Transaction.h:227
ripple::Transaction::setResult
void setResult(TER terResult)
Definition: Transaction.h:125
ripple::Transaction::mStatus
TransStatus mStatus
Definition: Transaction.h:339
ripple::Transaction::getSubmitResult
SubmitResult getSubmitResult() const
getSubmitResult Return submit result
Definition: Transaction.h:209
ripple::Transaction::getID
uint256 const & getID() const
Definition: Transaction.h:95
ripple::Transaction::CurrentLedgerState::accountSeqNext
std::uint32_t accountSeqNext
Definition: Transaction.h:277
ripple::error_code_i
error_code_i
Definition: ErrorCodes.h:40
ripple::TransStatus
TransStatus
Definition: Transaction.h:44
ripple::Transaction::setStatus
void setStatus(TransStatus status)
Definition: Transaction.h:134
ripple::temUNCERTAIN
@ temUNCERTAIN
Definition: TER.h:119
ripple::Transaction::mTransaction
std::shared_ptr< STTx const > mTransaction
Definition: Transaction.h:348
ripple::base_uint< 256 >
ripple::INCLUDED
@ INCLUDED
Definition: Transaction.h:47
ripple::Transaction::mTransactionID
uint256 mTransactionID
Definition: Transaction.h:336
ripple::Transaction::getCurrentLedgerState
boost::optional< CurrentLedgerState > getCurrentLedgerState() const
getCurrentLedgerState Get current ledger state of transaction
Definition: Transaction.h:286
ripple::Transaction::SubmitResult::clear
void clear()
clear Clear all states
Definition: Transaction.h:180
ripple::Transaction::clearSubmitResult
void clearSubmitResult()
clearSubmitResult Clear all flags in SubmitResult
Definition: Transaction.h:218
ripple::Transaction::getApplying
bool getApplying()
Detect if transaction is being batched.
Definition: Transaction.h:160
ripple::Transaction::SubmitResult::queued
bool queued
Definition: Transaction.h:200
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:299
ripple::Transaction::Transaction
Transaction(std::shared_ptr< STTx const > const &, std::string &, Application &) noexcept
Definition: Transaction.cpp:35
ripple::OBSOLETE
@ OBSOLETE
Definition: Transaction.h:52
ripple::Transaction::CurrentLedgerState::CurrentLedgerState
CurrentLedgerState()=delete
ripple::Transaction::getLedger
LedgerIndex getLedger() const
Definition: Transaction.h:101
ripple::TERSubset< CanCvtToTER >
ripple::Transaction::CurrentLedgerState::CurrentLedgerState
CurrentLedgerState(LedgerIndex li, XRPAmount fee, std::uint32_t accSeqNext, std::uint32_t accSeqAvail)
Definition: Transaction.h:263
ripple::Transaction::setKept
void setKept()
setKept Set this flag once was put to localtxns queue
Definition: Transaction.h:254
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:193
std::uint32_t
ripple::Transaction::submitResult_
SubmitResult submitResult_
different ways for transaction to be accepted
Definition: Transaction.h:344
ripple::CONFLICTED
@ CONFLICTED
Definition: Transaction.h:48
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:338
ripple::Transaction::isValidated
bool isValidated() const
Definition: Transaction.h:107
ripple::Transaction::mResult
TER mResult
Definition: Transaction.h:340
ripple::Transaction::getStatus
TransStatus getStatus() const
Definition: Transaction.h:113
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:51
ripple::Transaction::currentLedgerState_
boost::optional< CurrentLedgerState > currentLedgerState_
Definition: Transaction.h:346
ripple::Transaction::load
static std::variant< std::pair< std::shared_ptr< Transaction >, std::shared_ptr< TxMeta > >, TxSearched > load(uint256 const &id, Application &app, error_code_i &ec)
Definition: Transaction.cpp:111
ripple::Transaction::SubmitResult::applied
bool applied
Definition: Transaction.h:198
ripple::INVALID
@ INVALID
Definition: Transaction.h:46
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:65
ripple::Transaction::mApp
Application & mApp
Definition: Transaction.h:349
ripple::Transaction::j_
beast::Journal j_
Definition: Transaction.h:350
ripple::Transaction::SubmitResult::broadcast
bool broadcast
Definition: Transaction.h:199
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:341
ripple::Transaction::setApplying
void setApplying()
Set this flag once added to a batch.
Definition: Transaction.h:149
ripple::Transaction::setQueued
void setQueued()
setQueued Set this flag once was put into heldtxns queue
Definition: Transaction.h:236
ripple::Transaction::CurrentLedgerState::validatedLedger
LedgerIndex validatedLedger
Definition: Transaction.h:275
ripple::Transaction::setBroadcast
void setBroadcast()
setBroadcast Set this flag once was broadcasted via network
Definition: Transaction.h:245
ripple::TxSearched::some
@ some
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:169
ripple::Transaction::getResult
TER getResult()
Definition: Transaction.h:119
std::variant