rippled
Transactor.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_TX_TRANSACTOR_H_INCLUDED
21 #define RIPPLE_APP_TX_TRANSACTOR_H_INCLUDED
22 
23 #include <ripple/app/tx/applySteps.h>
24 #include <ripple/app/tx/impl/ApplyContext.h>
25 #include <ripple/basics/XRPAmount.h>
26 #include <ripple/beast/utility/Journal.h>
27 
28 namespace ripple {
29 
32 {
33 public:
35  STTx const& tx;
36  Rules const rules;
39 
41  Application& app_,
42  STTx const& tx_,
43  Rules const& rules_,
44  ApplyFlags flags_,
45  beast::Journal j_);
46 
48  operator=(PreflightContext const&) = delete;
49 };
50 
53 {
54 public:
56  ReadView const& view;
58  STTx const& tx;
61 
63  Application& app_,
64  ReadView const& view_,
65  TER preflightResult_,
66  STTx const& tx_,
67  ApplyFlags flags_,
69  : app(app_)
70  , view(view_)
71  , preflightResult(preflightResult_)
72  , tx(tx_)
73  , flags(flags_)
74  , j(j_)
75  {
76  }
77 
79  operator=(PreclaimContext const&) = delete;
80 };
81 
82 class TxConsequences;
83 struct PreflightResult;
84 
86 {
87 protected:
90 
92  XRPAmount mPriorBalance; // Balance before fees.
93  XRPAmount mSourceBalance; // Balance after fees.
94 
95  virtual ~Transactor() = default;
96  Transactor(Transactor const&) = delete;
97  Transactor&
98  operator=(Transactor const&) = delete;
99 
100 public:
104  operator()();
105 
106  ApplyView&
108  {
109  return ctx_.view();
110  }
111 
112  ApplyView const&
113  view() const
114  {
115  return ctx_.view();
116  }
117 
119  /*
120  These static functions are called from invoke_preclaim<Tx>
121  using name hiding to accomplish compile-time polymorphism,
122  so derived classes can override for different or extra
123  functionality. Use with care, as these are not really
124  virtual and so don't have the compiler-time protection that
125  comes with it.
126  */
127 
128  static NotTEC
129  checkSeqProxy(ReadView const& view, STTx const& tx, beast::Journal j);
130 
131  static NotTEC
133 
134  static TER
135  checkFee(PreclaimContext const& ctx, XRPAmount baseFee);
136 
137  static NotTEC
138  checkSign(PreclaimContext const& ctx);
139 
140  // Returns the fee in fee units, not scaled for load.
141  static XRPAmount
142  calculateBaseFee(ReadView const& view, STTx const& tx);
143 
144  static TER
146  {
147  // Most transactors do nothing
148  // after checkSeq/Fee/Sign.
149  return tesSUCCESS;
150  }
152 
153  // Interface used by DeleteAccount
154  static TER
155  ticketDelete(
156  ApplyView& view,
157  AccountID const& account,
158  uint256 const& ticketIndex,
159  beast::Journal j);
160 
161 protected:
162  TER
163  apply();
164 
165  explicit Transactor(ApplyContext& ctx);
166 
167  virtual void
168  preCompute();
169 
170  virtual TER
171  doApply() = 0;
172 
182  static XRPAmount
183  minimumFee(
184  Application& app,
185  XRPAmount baseFee,
186  Fees const& fees,
187  ApplyFlags flags);
188 
189 private:
191  reset(XRPAmount fee);
192 
193  TER
194  consumeSeqProxy(SLE::pointer const& sleAccount);
195  TER
196  payFee();
197  static NotTEC
198  checkSingleSign(PreclaimContext const& ctx);
199  static NotTEC
200  checkMultiSign(PreclaimContext const& ctx);
201 };
202 
204 NotTEC
205 preflight0(PreflightContext const& ctx);
206 
208 NotTEC
209 preflight1(PreflightContext const& ctx);
210 
212 NotTEC
213 preflight2(PreflightContext const& ctx);
214 
215 } // namespace ripple
216 
217 #endif
ripple::Transactor::checkPriorTxAndLastLedger
static NotTEC checkPriorTxAndLastLedger(PreclaimContext const &ctx)
Definition: Transactor.cpp:335
ripple::Application
Definition: Application.h:115
ripple::preflight2
NotTEC preflight2(PreflightContext const &ctx)
Checks whether the signature appears valid.
Definition: Transactor.cpp:130
ripple::Transactor::Blocker
@ Blocker
Definition: Transactor.h:101
ripple::Transactor::minimumFee
static XRPAmount minimumFee(Application &app, XRPAmount baseFee, Fees const &fees, ApplyFlags flags)
Compute the minimum fee required to process a transaction with a given baseFee based on the current s...
Definition: Transactor.cpp:180
ripple::Transactor::checkMultiSign
static NotTEC checkMultiSign(PreclaimContext const &ctx)
Definition: Transactor.cpp:562
std::shared_ptr< STLedgerEntry >
ripple::PreclaimContext::view
ReadView const & view
Definition: Transactor.h:56
ripple::PreclaimContext::app
Application & app
Definition: Transactor.h:55
ripple::PreclaimContext::j
const beast::Journal j
Definition: Transactor.h:60
ripple::PreclaimContext::PreclaimContext
PreclaimContext(Application &app_, ReadView const &view_, TER preflightResult_, STTx const &tx_, ApplyFlags flags_, beast::Journal j_=beast::Journal{beast::Journal::getNullSink()})
Definition: Transactor.h:62
ripple::Transactor
Definition: Transactor.h:85
ripple::Transactor::j_
const beast::Journal j_
Definition: Transactor.h:89
ripple::Transactor::checkSingleSign
static NotTEC checkSingleSign(PreclaimContext const &ctx)
Definition: Transactor.cpp:488
ripple::Transactor::view
ApplyView const & view() const
Definition: Transactor.h:113
std::pair
ripple::Transactor::operator()
std::pair< TER, bool > operator()()
Process the transaction.
Definition: Transactor.cpp:801
ripple::Transactor::operator=
Transactor & operator=(Transactor const &)=delete
ripple::ApplyFlags
ApplyFlags
Definition: ApplyView.h:29
ripple::Transactor::checkSeqProxy
static NotTEC checkSeqProxy(ReadView const &view, STTx const &tx, beast::Journal j)
Definition: Transactor.cpp:263
ripple::PreflightContext::j
const beast::Journal j
Definition: Transactor.h:38
beast::Journal::getNullSink
static Sink & getNullSink()
Returns a Sink which does nothing.
Definition: beast_Journal.cpp:72
ripple::Transactor::preclaim
static TER preclaim(PreclaimContext const &ctx)
Definition: Transactor.h:145
ripple::Transactor::ticketDelete
static TER ticketDelete(ApplyView &view, AccountID const &account, uint256 const &ticketIndex, beast::Journal j)
Definition: Transactor.cpp:383
ripple::preflight1
NotTEC preflight1(PreflightContext const &ctx)
Performs early sanity checks on the account and fee fields.
Definition: Transactor.cpp:78
ripple::ApplyView
Writeable view to a ledger, for applying a transaction.
Definition: ApplyView.h:134
ripple::Transactor::doApply
virtual TER doApply()=0
ripple::base_uint< 160, detail::AccountIDTag >
ripple::preflight0
NotTEC preflight0(PreflightContext const &ctx)
Performs early sanity checks on the txid.
Definition: Transactor.cpp:41
ripple::Transactor::ConsequencesFactoryType
ConsequencesFactoryType
Definition: Transactor.h:101
ripple::Transactor::calculateBaseFee
static XRPAmount calculateBaseFee(ReadView const &view, STTx const &tx)
Definition: Transactor.cpp:162
ripple::Transactor::checkSign
static NotTEC checkSign(PreclaimContext const &ctx)
Definition: Transactor.cpp:478
ripple::Fees
Reflects the fee settings for a particular ledger.
Definition: ReadView.h:49
ripple::PreclaimContext::operator=
PreclaimContext & operator=(PreclaimContext const &)=delete
ripple::Transactor::payFee
TER payFee()
Definition: Transactor.cpp:243
ripple::Transactor::apply
TER apply()
Definition: Transactor.cpp:443
ripple::TERSubset< CanCvtToTER >
ripple::PreflightContext::app
Application & app
Definition: Transactor.h:34
ripple::STTx
Definition: STTx.h:45
ripple::ApplyContext
State information when applying a tx.
Definition: ApplyContext.h:35
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::Transactor::consumeSeqProxy
TER consumeSeqProxy(SLE::pointer const &sleAccount)
Definition: Transactor.cpp:365
ripple::ApplyContext::view
ApplyView & view()
Definition: ApplyContext.h:54
ripple::Transactor::Transactor
Transactor(Transactor const &)=delete
ripple::PreclaimContext::tx
STTx const & tx
Definition: Transactor.h:58
ripple::PreflightContext::PreflightContext
PreflightContext(Application &app_, STTx const &tx_, Rules const &rules_, ApplyFlags flags_, beast::Journal j_)
Definition: Transactor.cpp:144
ripple::PreclaimContext
State information when determining if a tx is likely to claim a fee.
Definition: Transactor.h:52
ripple::Transactor::Custom
@ Custom
Definition: Transactor.h:101
ripple::Transactor::reset
std::pair< TER, XRPAmount > reset(XRPAmount fee)
Reset the context, discarding any changes made and adjust the fee.
Definition: Transactor.cpp:762
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:125
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::PreflightContext::flags
ApplyFlags flags
Definition: Transactor.h:37
ripple::Transactor::view
ApplyView & view()
Definition: Transactor.h:107
ripple::PreclaimContext::preflightResult
TER preflightResult
Definition: Transactor.h:57
ripple::Transactor::Normal
@ Normal
Definition: Transactor.h:101
ripple::Transactor::mPriorBalance
XRPAmount mPriorBalance
Definition: Transactor.h:92
ripple::Transactor::mSourceBalance
XRPAmount mSourceBalance
Definition: Transactor.h:93
ripple::PreclaimContext::flags
ApplyFlags flags
Definition: Transactor.h:59
ripple::Transactor::~Transactor
virtual ~Transactor()=default
ripple::Rules
Rules controlling protocol behavior.
Definition: Rules.h:33
ripple::Transactor::ctx_
ApplyContext & ctx_
Definition: Transactor.h:88
ripple::Transactor::checkFee
static TER checkFee(PreclaimContext const &ctx, XRPAmount baseFee)
Definition: Transactor.cpp:190
ripple::PreflightContext::tx
STTx const & tx
Definition: Transactor.h:35
ripple::PreflightContext
State information when preflighting a tx.
Definition: Transactor.h:31
ripple::PreflightContext::operator=
PreflightContext & operator=(PreflightContext const &)=delete
ripple::PreflightContext::rules
const Rules rules
Definition: Transactor.h:36
ripple::tesSUCCESS
@ tesSUCCESS
Definition: TER.h:222
ripple::Transactor::account_
const AccountID account_
Definition: Transactor.h:91
ripple::Transactor::preCompute
virtual void preCompute()
Definition: Transactor.cpp:437
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::NotTEC
TERSubset< CanCvtToNotTEC > NotTEC
Definition: TER.h:528