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:
65  using ref = const pointer&;
66 
69  std::string&,
70  Application&) noexcept;
71 
74  boost::optional<std::uint64_t> const& ledgerSeq,
75  boost::optional<std::string> const& status,
76  Blob const& rawTxn,
77  Application& app);
78 
79  static TransStatus
80  sqlTransactionStatus(boost::optional<std::string> const& status);
81 
84  {
85  return mTransaction;
86  }
87 
88  uint256 const&
89  getID() const
90  {
91  return mTransactionID;
92  }
93 
95  getLedger() const
96  {
97  return mInLedger;
98  }
99 
100  bool
101  isValidated() const
102  {
103  return mInLedger != 0;
104  }
105 
107  getStatus() const
108  {
109  return mStatus;
110  }
111 
112  TER
114  {
115  return mResult;
116  }
117 
118  void
119  setResult(TER terResult)
120  {
121  mResult = terResult;
122  }
123 
124  void
125  setStatus(TransStatus status, std::uint32_t ledgerSeq);
126 
127  void
129  {
130  mStatus = status;
131  }
132 
133  void
135  {
136  mInLedger = ledger;
137  }
138 
142  void
144  {
145  mApplying = true;
146  }
147 
153  bool
155  {
156  return mApplying;
157  }
158 
162  void
164  {
165  mApplying = false;
166  }
167 
169  {
173  void
175  {
176  applied = false;
177  broadcast = false;
178  queued = false;
179  kept = false;
180  }
181 
186  bool
187  any() const
188  {
189  return applied || broadcast || queued || kept;
190  }
191 
192  bool applied = false;
193  bool broadcast = false;
194  bool queued = false;
195  bool kept = false;
196  };
197 
204  {
205  return submitResult_;
206  }
207 
211  void
213  {
215  }
216 
220  void
222  {
223  submitResult_.applied = true;
224  }
225 
229  void
231  {
232  submitResult_.queued = true;
233  }
234 
238  void
240  {
241  submitResult_.broadcast = true;
242  }
243 
247  void
249  {
250  submitResult_.kept = true;
251  }
252 
254  {
255  CurrentLedgerState() = delete;
256 
258  LedgerIndex li,
259  XRPAmount fee,
260  std::uint32_t accSeqNext,
261  std::uint32_t accSeqAvail)
262  : validatedLedger{li}
263  , minFeeRequired{fee}
264  , accountSeqNext{accSeqNext}
265  , accountSeqAvail{accSeqAvail}
266  {
267  }
268 
273  };
274 
279  boost::optional<CurrentLedgerState>
281  {
282  return currentLedgerState_;
283  }
284 
292  void
294  LedgerIndex validatedLedger,
295  XRPAmount fee,
296  std::uint32_t accountSeq,
297  std::uint32_t availableSeq)
298  {
299  currentLedgerState_.emplace(
300  validatedLedger, fee, accountSeq, availableSeq);
301  }
302 
304  getJson(JsonOptions options, bool binary = false) const;
305 
306  static std::variant<
308  TxSearched>
309  load(uint256 const& id, Application& app, error_code_i& ec);
310 
311  static std::variant<
313  TxSearched>
314  load(
315  uint256 const& id,
316  Application& app,
318  error_code_i& ec);
319 
320 private:
321  static std::variant<
323  TxSearched>
324  load(
325  uint256 const& id,
326  Application& app,
327  boost::optional<ClosedInterval<uint32_t>> const& range,
328  error_code_i& ec);
329 
331 
335  bool mApplying = false;
336 
339 
340  boost::optional<CurrentLedgerState> currentLedgerState_;
341 
345 };
346 
347 } // namespace ripple
348 
349 #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:272
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:124
ripple::Transaction::CurrentLedgerState::minFeeRequired
XRPAmount minFeeRequired
Definition: Transaction.h:270
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:83
ripple::JsonOptions
JsonOptions
Definition: STBase.h:34
std::pair
ripple::Transaction::SubmitResult::kept
bool kept
Definition: Transaction.h:195
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:134
ripple::Transaction
Definition: Transaction.h:60
ripple::Transaction::SubmitResult
Definition: Transaction.h:168
ripple::Transaction::CurrentLedgerState
Definition: Transaction.h:253
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:221
ripple::Transaction::setResult
void setResult(TER terResult)
Definition: Transaction.h:119
ripple::Transaction::mStatus
TransStatus mStatus
Definition: Transaction.h:333
ripple::Transaction::getSubmitResult
SubmitResult getSubmitResult() const
getSubmitResult Return submit result
Definition: Transaction.h:203
ripple::Transaction::getID
uint256 const & getID() const
Definition: Transaction.h:89
ripple::Transaction::CurrentLedgerState::accountSeqNext
std::uint32_t accountSeqNext
Definition: Transaction.h:271
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:128
ripple::temUNCERTAIN
@ temUNCERTAIN
Definition: TER.h:119
ripple::Transaction::mTransaction
std::shared_ptr< STTx const > mTransaction
Definition: Transaction.h:342
ripple::base_uint
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:73
ripple::INCLUDED
@ INCLUDED
Definition: Transaction.h:47
ripple::Transaction::mTransactionID
uint256 mTransactionID
Definition: Transaction.h:330
ripple::Transaction::getCurrentLedgerState
boost::optional< CurrentLedgerState > getCurrentLedgerState() const
getCurrentLedgerState Get current ledger state of transaction
Definition: Transaction.h:280
ripple::Transaction::SubmitResult::clear
void clear()
clear Clear all states
Definition: Transaction.h:174
ripple::Transaction::clearSubmitResult
void clearSubmitResult()
clearSubmitResult Clear all flags in SubmitResult
Definition: Transaction.h:212
ripple::Transaction::getApplying
bool getApplying()
Detect if transaction is being batched.
Definition: Transaction.h:154
ripple::Transaction::SubmitResult::queued
bool queued
Definition: Transaction.h:194
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:293
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:95
ripple::TERSubset< CanCvtToTER >
ripple::Transaction::CurrentLedgerState::CurrentLedgerState
CurrentLedgerState(LedgerIndex li, XRPAmount fee, std::uint32_t accSeqNext, std::uint32_t accSeqAvail)
Definition: Transaction.h:257
ripple::Transaction::setKept
void setKept()
setKept Set this flag once was put to localtxns queue
Definition: Transaction.h:248
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:187
std::uint32_t
ripple::Transaction::submitResult_
SubmitResult submitResult_
different ways for transaction to be accepted
Definition: Transaction.h:338
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:332
ripple::Transaction::isValidated
bool isValidated() const
Definition: Transaction.h:101
ripple::Transaction::mResult
TER mResult
Definition: Transaction.h:334
ripple::Transaction::getStatus
TransStatus getStatus() const
Definition: Transaction.h:107
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:340
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:192
ripple::INVALID
@ INVALID
Definition: Transaction.h:46
ripple::Transaction::setStatus
void setStatus(TransStatus status, std::uint32_t ledgerSeq)
Definition: Transaction.cpp:59
ripple::Transaction::mApp
Application & mApp
Definition: Transaction.h:343
ripple::Transaction::j_
beast::Journal j_
Definition: Transaction.h:344
ripple::Transaction::SubmitResult::broadcast
bool broadcast
Definition: Transaction.h:193
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:335
ripple::Transaction::setApplying
void setApplying()
Set this flag once added to a batch.
Definition: Transaction.h:143
ripple::Transaction::setQueued
void setQueued()
setQueued Set this flag once was put into heldtxns queue
Definition: Transaction.h:230
ripple::Transaction::CurrentLedgerState::validatedLedger
LedgerIndex validatedLedger
Definition: Transaction.h:269
ripple::Transaction::setBroadcast
void setBroadcast()
setBroadcast Set this flag once was broadcasted via network
Definition: Transaction.h:239
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:163
ripple::Transaction::getResult
TER getResult()
Definition: Transaction.h:113
std::variant