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/protocol/ErrorCodes.h>
24 #include <ripple/protocol/Protocol.h>
25 #include <ripple/protocol/STTx.h>
26 #include <ripple/protocol/TER.h>
27 #include <ripple/beast/utility/Journal.h>
28 #include <ripple/basics/RangeSet.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 {
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 // This class is for constructing and examining transactions.
57 // Transactions are static so manipulation functions are unnecessary.
59  : public std::enable_shared_from_this<Transaction>
60  , public CountedObject <Transaction>
61 {
62 public:
63  static char const* getCountedObjectName () { return "Transaction"; }
64 
66  using ref = const pointer&;
67 
68  Transaction (
70 
71  static
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
81  sqlTransactionStatus(boost::optional<std::string> const& status);
82 
84  {
85  return mTransaction;
86  }
87 
88  uint256 const& getID () const
89  {
90  return mTransactionID;
91  }
92 
94  {
95  return mInLedger;
96  }
97 
99  {
100  return mStatus;
101  }
102 
104  {
105  return mResult;
106  }
107 
108  void setResult (TER terResult)
109  {
110  mResult = terResult;
111  }
112 
113  void setStatus (TransStatus status, std::uint32_t ledgerSeq);
114 
115  void setStatus (TransStatus status)
116  {
117  mStatus = status;
118  }
119 
120  void setLedger (LedgerIndex ledger)
121  {
122  mInLedger = ledger;
123  }
124 
128  void setApplying()
129  {
130  mApplying = true;
131  }
132 
138  bool getApplying()
139  {
140  return mApplying;
141  }
142 
147  {
148  mApplying = false;
149  }
150 
152  {
156  void clear()
157  {
158  applied = false;
159  broadcast = false;
160  queued = false;
161  kept = false;
162  }
163 
168  bool any() const
169  {
170  return applied || broadcast || queued || kept;
171  }
172 
173  bool applied = false;
174  bool broadcast = false;
175  bool queued = false;
176  bool kept = false;
177  };
178 
184  {
185  return submitResult_;
186  }
187 
192  {
194  }
195 
199  void setApplied()
200  {
201  submitResult_.applied = true;
202  }
203 
207  void setQueued()
208  {
209  submitResult_.queued = true;
210  }
211 
216  {
217  submitResult_.broadcast = true;
218  }
219 
223  void setKept()
224  {
225  submitResult_.kept = true;
226  }
227 
229  {
230  CurrentLedgerState() = delete;
231 
233  LedgerIndex li,
234  XRPAmount fee,
235  std::uint32_t accSeqNext,
236  std::uint32_t accSeqAvail)
237  : validatedLedger{li}
238  , minFeeRequired{fee}
239  , accountSeqNext{accSeqNext}
240  , accountSeqAvail{accSeqAvail}
241  {
242  }
243 
248  };
249 
254  boost::optional<CurrentLedgerState>
256  {
257  return currentLedgerState_;
258  }
259 
267  void
269  LedgerIndex validatedLedger,
270  XRPAmount fee,
271  std::uint32_t accountSeq,
272  std::uint32_t availableSeq)
273  {
274  currentLedgerState_.emplace(
275  validatedLedger, fee, accountSeq, availableSeq);
276  }
277 
278  Json::Value getJson (JsonOptions options, bool binary = false) const;
279 
280  static pointer
281  load (uint256 const& id, Application& app, error_code_i& ec);
282 
283  static boost::variant<Transaction::pointer, bool>
284  load (uint256 const& id, Application& app, ClosedInterval<uint32_t> const& range, error_code_i& ec);
285 
286 private:
287 
288  static boost::variant<Transaction::pointer, bool>
289  load (uint256 const& id, Application& app, boost::optional<ClosedInterval<uint32_t>> const& range,
290  error_code_i& ec);
291 
293 
297  bool mApplying = false;
298 
301 
302  boost::optional<CurrentLedgerState> currentLedgerState_;
303 
307 };
308 
309 } // ripple
310 
311 #endif
ripple::COMMITTED
@ COMMITTED
Definition: Transaction.h:49
ripple::Transaction::sqlTransactionStatus
static TransStatus sqlTransactionStatus(boost::optional< std::string > const &status)
Definition: Transaction.cpp:65
ripple::Application
Definition: Application.h:85
ripple::Transaction::CurrentLedgerState::accountSeqAvail
std::uint32_t accountSeqAvail
Definition: Transaction.h:247
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:83
ripple::CountedObject
Tracks the number of instances of an object.
Definition: CountedObject.h:102
ripple::Transaction::CurrentLedgerState::minFeeRequired
XRPAmount minFeeRequired
Definition: Transaction.h:245
std::string
STL class.
std::shared_ptr< Transaction >
ripple::Transaction::getJson
Json::Value getJson(JsonOptions options, bool binary=false) const
Definition: Transaction.cpp:182
ripple::Transaction::getSTransaction
std::shared_ptr< STTx const > const & getSTransaction()
Definition: Transaction.h:83
ripple::JsonOptions
JsonOptions
Definition: STBase.h:34
ripple::Transaction::SubmitResult::kept
bool kept
Definition: Transaction.h:176
std::vector< unsigned char >
ripple::Transaction::load
static pointer load(uint256 const &id, Application &app, error_code_i &ec)
Definition: Transaction.cpp:103
ripple::INCOMPLETE
@ INCOMPLETE
Definition: Transaction.h:53
ripple::Transaction::setLedger
void setLedger(LedgerIndex ledger)
Definition: Transaction.h:120
ripple::Transaction
Definition: Transaction.h:58
ripple::Transaction::SubmitResult
Definition: Transaction.h:151
ripple::Transaction::CurrentLedgerState
Definition: Transaction.h:228
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:199
ripple::Transaction::setResult
void setResult(TER terResult)
Definition: Transaction.h:108
ripple::Transaction::mStatus
TransStatus mStatus
Definition: Transaction.h:295
ripple::Transaction::getSubmitResult
SubmitResult getSubmitResult() const
getSubmitResult Return submit result
Definition: Transaction.h:183
ripple::Transaction::getID
uint256 const & getID() const
Definition: Transaction.h:88
ripple::Transaction::CurrentLedgerState::accountSeqNext
std::uint32_t accountSeqNext
Definition: Transaction.h:246
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:115
ripple::temUNCERTAIN
@ temUNCERTAIN
Definition: TER.h:121
ripple::Transaction::mTransaction
std::shared_ptr< STTx const > mTransaction
Definition: Transaction.h:304
ripple::base_uint< 256 >
ripple::INCLUDED
@ INCLUDED
Definition: Transaction.h:47
ripple::Transaction::mTransactionID
uint256 mTransactionID
Definition: Transaction.h:292
ripple::Transaction::getCurrentLedgerState
boost::optional< CurrentLedgerState > getCurrentLedgerState() const
getCurrentLedgerState Get current ledger state of transaction
Definition: Transaction.h:255
ripple::Transaction::SubmitResult::clear
void clear()
clear Clear all states
Definition: Transaction.h:156
ripple::Transaction::clearSubmitResult
void clearSubmitResult()
clearSubmitResult Clear all flags in SubmitResult
Definition: Transaction.h:191
ripple::Transaction::getApplying
bool getApplying()
Detect if transaction is being batched.
Definition: Transaction.h:138
ripple::Transaction::SubmitResult::queued
bool queued
Definition: Transaction.h:175
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:268
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:93
ripple::TERSubset< CanCvtToTER >
ripple::Transaction::CurrentLedgerState::CurrentLedgerState
CurrentLedgerState(LedgerIndex li, XRPAmount fee, std::uint32_t accSeqNext, std::uint32_t accSeqAvail)
Definition: Transaction.h:232
ripple::Transaction::setKept
void setKept()
setKept Set this flag once was put to localtxns queue
Definition: Transaction.h:223
std::enable_shared_from_this
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:60
ripple::Transaction::SubmitResult::any
bool any() const
any Get true of any state is true
Definition: Transaction.h:168
std::uint32_t
ripple::Transaction::submitResult_
SubmitResult submitResult_
different ways for transaction to be accepted
Definition: Transaction.h:300
ripple::CONFLICTED
@ CONFLICTED
Definition: Transaction.h:48
ripple::range
ClosedInterval< T > range(T low, T high)
Create a closed range interval.
Definition: RangeSet.h:54
ripple::Transaction::mInLedger
LedgerIndex mInLedger
Definition: Transaction.h:294
ripple::Transaction::mResult
TER mResult
Definition: Transaction.h:296
ripple::Transaction::getStatus
TransStatus getStatus() const
Definition: Transaction.h:98
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:302
ripple::Transaction::SubmitResult::applied
bool applied
Definition: Transaction.h:173
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:63
ripple::Transaction::pointer
std::shared_ptr< Transaction > pointer
Definition: Transaction.h:65
ripple::Transaction::mApp
Application & mApp
Definition: Transaction.h:305
ripple::Transaction::j_
beast::Journal j_
Definition: Transaction.h:306
ripple::Transaction::SubmitResult::broadcast
bool broadcast
Definition: Transaction.h:174
ripple::ClosedInterval
boost::icl::closed_interval< T > ClosedInterval
A closed interval over the domain T.
Definition: RangeSet.h:45
ripple::Transaction::mApplying
bool mApplying
Definition: Transaction.h:297
ripple::Transaction::setApplying
void setApplying()
Set this flag once added to a batch.
Definition: Transaction.h:128
ripple::Transaction::setQueued
void setQueued()
setQueued Set this flag once was put into heldtxns queue
Definition: Transaction.h:207
ripple::Transaction::CurrentLedgerState::validatedLedger
LedgerIndex validatedLedger
Definition: Transaction.h:244
ripple::Transaction::setBroadcast
void setBroadcast()
setBroadcast Set this flag once was broadcasted via network
Definition: Transaction.h:215
Json::Value
Represents a JSON value.
Definition: json_value.h:141
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::Transaction::clearApplying
void clearApplying()
Indicate that transaction application has been attempted.
Definition: Transaction.h:146
ripple::Transaction::getResult
TER getResult()
Definition: Transaction.h:103