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 <ripple/protocol/TxMeta.h>
30 #include <boost/optional.hpp>
31 #include <optional>
32 #include <variant>
33 
34 namespace ripple {
35 
36 //
37 // Transactions should be constructed in JSON with. Use STObject::parseJson to
38 // obtain a binary version.
39 //
40 
41 class Application;
42 class Database;
43 class Rules;
44 
46  NEW = 0, // just received / generated
47  INVALID = 1, // no valid signature, insufficient funds
48  INCLUDED = 2, // added to the current ledger
49  CONFLICTED = 3, // losing to a conflicting transaction
50  COMMITTED = 4, // known to be in a ledger
51  HELD = 5, // not valid now, maybe later
52  REMOVED = 6, // taken out of a ledger
53  OBSOLETE = 7, // a compatible transaction has taken precedence
54  INCOMPLETE = 8 // needs more signatures
55 };
56 
57 enum class TxSearched { all, some, unknown };
58 
59 // This class is for constructing and examining transactions.
60 // Transactions are static so manipulation functions are unnecessary.
61 class Transaction : public std::enable_shared_from_this<Transaction>,
62  public CountedObject<Transaction>
63 {
64 public:
66  using ref = const pointer&;
67 
70  std::string&,
71  Application&) noexcept;
72 
73  // The two boost::optional parameters are because SOCI requires
74  // boost::optional (not std::optional) parameters.
77  boost::optional<std::uint64_t> const& ledgerSeq,
78  boost::optional<std::string> const& status,
79  Blob const& rawTxn,
80  Application& app);
81 
82  // The boost::optional parameter is because SOCI requires
83  // boost::optional (not std::optional) parameters.
84  static TransStatus
85  sqlTransactionStatus(boost::optional<std::string> const& status);
86 
89  {
90  return mTransaction;
91  }
92 
93  uint256 const&
94  getID() const
95  {
96  return mTransactionID;
97  }
98 
100  getLedger() const
101  {
102  return mInLedger;
103  }
104 
105  bool
106  isValidated() const
107  {
108  return mInLedger != 0;
109  }
110 
112  getStatus() const
113  {
114  return mStatus;
115  }
116 
117  TER
119  {
120  return mResult;
121  }
122 
123  void
124  setResult(TER terResult)
125  {
126  mResult = terResult;
127  }
128 
129  void
130  setStatus(TransStatus status, std::uint32_t ledgerSeq);
131 
132  void
134  {
135  mStatus = status;
136  }
137 
138  void
140  {
141  mInLedger = ledger;
142  }
143 
147  void
149  {
150  mApplying = true;
151  }
152 
158  bool
160  {
161  return mApplying;
162  }
163 
167  void
169  {
170  mApplying = false;
171  }
172 
174  {
178  void
180  {
181  applied = false;
182  broadcast = false;
183  queued = false;
184  kept = false;
185  }
186 
191  bool
192  any() const
193  {
194  return applied || broadcast || queued || kept;
195  }
196 
197  bool applied = false;
198  bool broadcast = false;
199  bool queued = false;
200  bool kept = false;
201  };
202 
209  {
210  return submitResult_;
211  }
212 
216  void
218  {
220  }
221 
225  void
227  {
228  submitResult_.applied = true;
229  }
230 
234  void
236  {
237  submitResult_.queued = true;
238  }
239 
243  void
245  {
246  submitResult_.broadcast = true;
247  }
248 
252  void
254  {
255  submitResult_.kept = true;
256  }
257 
259  {
260  CurrentLedgerState() = delete;
261 
263  LedgerIndex li,
264  XRPAmount fee,
265  std::uint32_t accSeqNext,
266  std::uint32_t accSeqAvail)
267  : validatedLedger{li}
268  , minFeeRequired{fee}
269  , accountSeqNext{accSeqNext}
270  , accountSeqAvail{accSeqAvail}
271  {
272  }
273 
278  };
279 
286  {
287  return currentLedgerState_;
288  }
289 
297  void
299  LedgerIndex validatedLedger,
300  XRPAmount fee,
301  std::uint32_t accountSeq,
302  std::uint32_t availableSeq)
303  {
304  currentLedgerState_.emplace(
305  validatedLedger, fee, accountSeq, availableSeq);
306  }
307 
309  getJson(JsonOptions options, bool binary = false) const;
310 
311  // Information used to locate a transaction.
312  // Contains a nodestore hash and ledger sequence pair if the transaction was
313  // found. Otherwise, contains the range of ledgers present in the database
314  // at the time of search.
315  struct Locator
316  {
319 
320  // @return true if transaction was found, false otherwise
321  //
322  // Call this function first to determine the type of the contained info.
323  // Calling the wrong getter function will throw an exception.
324  // See documentation for the getter functions for more details
325  bool
327  {
328  return std::holds_alternative<std::pair<uint256, uint32_t>>(
329  locator);
330  }
331 
332  // @return key used to find transaction in nodestore
333  //
334  // Throws if isFound() returns false
335  uint256 const&
337  {
338  return std::get<std::pair<uint256, uint32_t>>(locator).first;
339  }
340 
341  // @return sequence of ledger containing the transaction
342  //
343  // Throws is isFound() returns false
344  uint32_t
346  {
347  return std::get<std::pair<uint256, uint32_t>>(locator).second;
348  }
349 
350  // @return range of ledgers searched
351  //
352  // Throws if isFound() returns true
355  {
356  return std::get<ClosedInterval<uint32_t>>(locator);
357  }
358  };
359 
360  static Locator
361  locate(uint256 const& id, Application& app);
362 
363  static std::variant<
365  TxSearched>
366  load(uint256 const& id, Application& app, error_code_i& ec);
367 
368  static std::variant<
370  TxSearched>
371  load(
372  uint256 const& id,
373  Application& app,
375  error_code_i& ec);
376 
377 private:
378  static std::variant<
380  TxSearched>
381  load(
382  uint256 const& id,
383  Application& app,
385  error_code_i& ec);
386 
388 
392  bool mApplying = false;
393 
396 
398 
402 };
403 
404 } // namespace ripple
405 
406 #endif
ripple::COMMITTED
@ COMMITTED
Definition: Transaction.h:50
ripple::Transaction::sqlTransactionStatus
static TransStatus sqlTransactionStatus(boost::optional< std::string > const &status)
Definition: Transaction.cpp:69
ripple::Application
Definition: Application.h:115
ripple::Transaction::CurrentLedgerState::accountSeqAvail
std::uint32_t accountSeqAvail
Definition: Transaction.h:277
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:92
ripple::TxSearched::unknown
@ unknown
ripple::CountedObject
Tracks the number of instances of an object.
Definition: CountedObject.h:124
ripple::Transaction::CurrentLedgerState::minFeeRequired
XRPAmount minFeeRequired
Definition: Transaction.h:275
std::string
STL class.
std::shared_ptr< Transaction >
ripple::Transaction::getJson
Json::Value getJson(JsonOptions options, bool binary=false) const
Definition: Transaction.cpp:168
ripple::Transaction::getSTransaction
std::shared_ptr< STTx const > const & getSTransaction()
Definition: Transaction.h:88
ripple::JsonOptions
JsonOptions
Definition: STBase.h:34
std::pair
ripple::Transaction::SubmitResult::kept
bool kept
Definition: Transaction.h:200
ripple::TxSearched::all
@ all
ripple::Transaction::Locator::getNodestoreHash
uint256 const & getNodestoreHash()
Definition: Transaction.h:336
ripple::TxSearched
TxSearched
Definition: Transaction.h:57
std::vector< unsigned char >
ripple::INCOMPLETE
@ INCOMPLETE
Definition: Transaction.h:54
ripple::Transaction::setLedger
void setLedger(LedgerIndex ledger)
Definition: Transaction.h:139
ripple::Transaction
Definition: Transaction.h:61
ripple::Transaction::currentLedgerState_
std::optional< CurrentLedgerState > currentLedgerState_
Definition: Transaction.h:397
ripple::Transaction::SubmitResult
Definition: Transaction.h:173
ripple::Transaction::CurrentLedgerState
Definition: Transaction.h:258
ripple::NEW
@ NEW
Definition: Transaction.h:46
ripple::HELD
@ HELD
Definition: Transaction.h:51
ripple::Transaction::setApplied
void setApplied()
setApplied Set this flag once was applied to open ledger
Definition: Transaction.h:226
ripple::Transaction::setResult
void setResult(TER terResult)
Definition: Transaction.h:124
ripple::Transaction::mStatus
TransStatus mStatus
Definition: Transaction.h:390
ripple::Transaction::getSubmitResult
SubmitResult getSubmitResult() const
getSubmitResult Return submit result
Definition: Transaction.h:208
ripple::Transaction::getID
uint256 const & getID() const
Definition: Transaction.h:94
ripple::Transaction::CurrentLedgerState::accountSeqNext
std::uint32_t accountSeqNext
Definition: Transaction.h:276
ripple::error_code_i
error_code_i
Definition: ErrorCodes.h:40
ripple::TransStatus
TransStatus
Definition: Transaction.h:45
ripple::Transaction::setStatus
void setStatus(TransStatus status)
Definition: Transaction.h:133
ripple::temUNCERTAIN
@ temUNCERTAIN
Definition: TER.h:121
ripple::Transaction::mTransaction
std::shared_ptr< STTx const > mTransaction
Definition: Transaction.h:399
ripple::base_uint< 256 >
ripple::INCLUDED
@ INCLUDED
Definition: Transaction.h:48
ripple::Transaction::mTransactionID
uint256 mTransactionID
Definition: Transaction.h:387
ripple::Transaction::SubmitResult::clear
void clear()
clear Clear all states
Definition: Transaction.h:179
ripple::Transaction::clearSubmitResult
void clearSubmitResult()
clearSubmitResult Clear all flags in SubmitResult
Definition: Transaction.h:217
ripple::Transaction::getApplying
bool getApplying()
Detect if transaction is being batched.
Definition: Transaction.h:159
ripple::Transaction::SubmitResult::queued
bool queued
Definition: Transaction.h:199
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:298
ripple::Transaction::Transaction
Transaction(std::shared_ptr< STTx const > const &, std::string &, Application &) noexcept
Definition: Transaction.cpp:38
ripple::OBSOLETE
@ OBSOLETE
Definition: Transaction.h:53
ripple::Transaction::Locator
Definition: Transaction.h:315
ripple::Transaction::CurrentLedgerState::CurrentLedgerState
CurrentLedgerState()=delete
ripple::Transaction::getLedger
LedgerIndex getLedger() const
Definition: Transaction.h:100
ripple::TERSubset< CanCvtToTER >
ripple::Transaction::CurrentLedgerState::CurrentLedgerState
CurrentLedgerState(LedgerIndex li, XRPAmount fee, std::uint32_t accSeqNext, std::uint32_t accSeqAvail)
Definition: Transaction.h:262
ripple::Transaction::setKept
void setKept()
setKept Set this flag once was put to localtxns queue
Definition: Transaction.h:253
std::enable_shared_from_this
ripple::Transaction::locate
static Locator locate(uint256 const &id, Application &app)
Definition: Transaction.cpp:134
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:192
std::uint32_t
ripple::Transaction::submitResult_
SubmitResult submitResult_
different ways for transaction to be accepted
Definition: Transaction.h:395
ripple::CONFLICTED
@ CONFLICTED
Definition: Transaction.h:49
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:389
ripple::Transaction::isValidated
bool isValidated() const
Definition: Transaction.h:106
ripple::Transaction::mResult
TER mResult
Definition: Transaction.h:391
ripple::Transaction::getStatus
TransStatus getStatus() const
Definition: Transaction.h:112
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:52
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:114
ripple::Transaction::Locator::locator
std::variant< std::pair< uint256, uint32_t >, ClosedInterval< uint32_t > > locator
Definition: Transaction.h:318
ripple::Transaction::SubmitResult::applied
bool applied
Definition: Transaction.h:197
ripple::INVALID
@ INVALID
Definition: Transaction.h:47
ripple::Transaction::setStatus
void setStatus(TransStatus status, std::uint32_t ledgerSeq)
Definition: Transaction.cpp:62
ripple::Transaction::mApp
Application & mApp
Definition: Transaction.h:400
optional
ripple::Transaction::j_
beast::Journal j_
Definition: Transaction.h:401
ripple::Transaction::SubmitResult::broadcast
bool broadcast
Definition: Transaction.h:198
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:392
ripple::Transaction::setApplying
void setApplying()
Set this flag once added to a batch.
Definition: Transaction.h:148
ripple::Transaction::getCurrentLedgerState
std::optional< CurrentLedgerState > getCurrentLedgerState() const
getCurrentLedgerState Get current ledger state of transaction
Definition: Transaction.h:285
ripple::Transaction::Locator::getLedgerSequence
uint32_t getLedgerSequence()
Definition: Transaction.h:345
ripple::Transaction::setQueued
void setQueued()
setQueued Set this flag once was put into heldtxns queue
Definition: Transaction.h:235
ripple::Transaction::CurrentLedgerState::validatedLedger
LedgerIndex validatedLedger
Definition: Transaction.h:274
ripple::Transaction::Locator::isFound
bool isFound()
Definition: Transaction.h:326
ripple::Transaction::setBroadcast
void setBroadcast()
setBroadcast Set this flag once was broadcasted via network
Definition: Transaction.h:244
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:168
ripple::Transaction::getResult
TER getResult()
Definition: Transaction.h:118
variant
ripple::Transaction::Locator::getLedgerRangeSearched
ClosedInterval< uint32_t > const & getLedgerRangeSearched()
Definition: Transaction.h:354