rippled
InvariantCheck.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012-2017 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_INVARIANTCHECK_H_INCLUDED
21 #define RIPPLE_APP_TX_INVARIANTCHECK_H_INCLUDED
22 
23 #include <ripple/basics/base_uint.h>
24 #include <ripple/beast/utility/Journal.h>
25 #include <ripple/protocol/STLedgerEntry.h>
26 #include <ripple/protocol/STTx.h>
27 #include <ripple/protocol/TER.h>
28 #include <cstdint>
29 #include <map>
30 #include <tuple>
31 #include <utility>
32 
33 namespace ripple {
34 
35 class ReadView;
36 
37 #if GENERATING_DOCS
38 
47 {
48 public:
49  explicit InvariantChecker_PROTOTYPE() = default;
50 
58  void
59  visitEntry(
60  bool isDelete,
61  std::shared_ptr<SLE const> const& before,
63 
76  bool
77  finalize(
78  STTx const& tx,
79  TER const tec,
80  XRPAmount const fee,
81  ReadView const& view,
82  beast::Journal const& j);
83 };
84 #endif
85 
93 {
94 public:
95  void
96  visitEntry(
97  bool,
100 
101  bool
102  finalize(
103  STTx const&,
104  TER const,
105  XRPAmount const,
106  ReadView const&,
107  beast::Journal const&);
108 };
109 
119 {
121 
122 public:
123  void
124  visitEntry(
125  bool,
128 
129  bool
130  finalize(
131  STTx const&,
132  TER const,
133  XRPAmount const,
134  ReadView const&,
135  beast::Journal const&);
136 };
137 
147 {
149 
150 public:
151  void
152  visitEntry(
153  bool,
156 
157  bool
158  finalize(
159  STTx const&,
160  TER const,
161  XRPAmount const,
162  ReadView const&,
163  beast::Journal const&);
164 };
165 
174 {
175  bool bad_ = false;
176 
177 public:
178  void
179  visitEntry(
180  bool,
183 
184  bool
185  finalize(
186  STTx const&,
187  TER const,
188  XRPAmount const,
189  ReadView const&,
190  beast::Journal const&);
191 };
192 
198 {
199  bool typeMismatch_ = false;
200  bool invalidTypeAdded_ = false;
201 
202 public:
203  void
204  visitEntry(
205  bool,
208 
209  bool
210  finalize(
211  STTx const&,
212  TER const,
213  XRPAmount const,
214  ReadView const&,
215  beast::Journal const&);
216 };
217 
225 {
226  bool xrpTrustLine_ = false;
227 
228 public:
229  void
230  visitEntry(
231  bool,
234 
235  bool
236  finalize(
237  STTx const&,
238  TER const,
239  XRPAmount const,
240  ReadView const&,
241  beast::Journal const&);
242 };
243 
252 {
253  bool bad_ = false;
254 
255 public:
256  void
257  visitEntry(
258  bool,
261 
262  bool
263  finalize(
264  STTx const&,
265  TER const,
266  XRPAmount const,
267  ReadView const&,
268  beast::Journal const&);
269 };
270 
276 {
277  bool bad_ = false;
278 
279 public:
280  void
281  visitEntry(
282  bool,
285 
286  bool
287  finalize(
288  STTx const&,
289  TER const,
290  XRPAmount const,
291  ReadView const&,
292  beast::Journal const&);
293 };
294 
301 {
303  std::uint32_t accountSeq_ = 0; // Only meaningful if accountsCreated_ > 0
304 
305 public:
306  void
307  visitEntry(
308  bool,
311 
312  bool
313  finalize(
314  STTx const&,
315  TER const,
316  XRPAmount const,
317  ReadView const&,
318  beast::Journal const&);
319 };
320 
322 {
323  bool badEntry_ = false;
324  bool badLink_ = false;
325  bool badSort_ = false;
326  bool badURI_ = false;
327  bool invalidSize_ = false;
328 
329 public:
330  void
331  visitEntry(
332  bool,
335 
336  bool
337  finalize(
338  STTx const&,
339  TER const,
340  XRPAmount const,
341  ReadView const&,
342  beast::Journal const&);
343 };
344 
346 {
351 
352 public:
353  void
354  visitEntry(
355  bool,
358 
359  bool
360  finalize(
361  STTx const&,
362  TER const,
363  XRPAmount const,
364  ReadView const&,
365  beast::Journal const&);
366 };
367 
368 // additional invariant checks can be declared above and then added to this
369 // tuple
377  NoBadOffers,
378  NoZeroEscrow,
382 
391 inline InvariantChecks
393 {
394  return InvariantChecks{};
395 }
396 
397 } // namespace ripple
398 
399 #endif
ripple::ValidNFTokenPage::badURI_
bool badURI_
Definition: InvariantCheck.h:326
ripple::LedgerEntryTypesMatch::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:347
ripple::NoZeroEscrow::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:261
std::shared_ptr
STL class.
utility
ripple::TransactionFeeCheck::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:43
ripple::XRPBalanceChecks::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:198
ripple::NoXRPTrustLines::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:410
ripple::ValidNFTokenPage::badSort_
bool badSort_
Definition: InvariantCheck.h:325
ripple::NoBadOffers::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:217
ripple::NoZeroEscrow::bad_
bool bad_
Definition: InvariantCheck.h:277
ripple::ValidNFTokenPage::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:497
ripple::NoBadOffers::bad_
bool bad_
Definition: InvariantCheck.h:253
tuple
ripple::NFTokenCountTracking::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:635
ripple::ValidNFTokenPage::invalidSize_
bool invalidSize_
Definition: InvariantCheck.h:327
ripple::NFTokenCountTracking::beforeMintedTotal
std::uint32_t beforeMintedTotal
Definition: InvariantCheck.h:347
ripple::NoBadOffers
Invariant: offers should be for non-negative amounts and must not be XRP to XRP.
Definition: InvariantCheck.h:251
ripple::NFTokenCountTracking::afterMintedTotal
std::uint32_t afterMintedTotal
Definition: InvariantCheck.h:349
ripple::InvariantChecker_PROTOTYPE::finalize
bool finalize(STTx const &tx, TER const tec, XRPAmount const fee, ReadView const &view, beast::Journal const &j)
called after all ledger entries have been visited to determine the final status of the check
ripple::InvariantChecker_PROTOTYPE::InvariantChecker_PROTOTYPE
InvariantChecker_PROTOTYPE()=default
ripple::ValidNewAccountRoot::accountSeq_
std::uint32_t accountSeq_
Definition: InvariantCheck.h:303
ripple::XRPBalanceChecks
Invariant: An account XRP balance must be in XRP and take a value between 0 and INITIAL_XRP drops,...
Definition: InvariantCheck.h:173
ripple::ValidNewAccountRoot::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:457
ripple::NoXRPTrustLines::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:427
ripple::LedgerEntryTypesMatch::typeMismatch_
bool typeMismatch_
Definition: InvariantCheck.h:199
ripple::NFTokenCountTracking
Definition: InvariantCheck.h:345
ripple::ValidNFTokenPage::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:574
ripple::NoBadOffers::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:242
ripple::TransactionFeeCheck
Invariant: We should never charge a transaction a negative fee or a fee that is larger than what the ...
Definition: InvariantCheck.h:92
ripple::LedgerEntryTypesMatch::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:384
ripple::NFTokenCountTracking::afterBurnedTotal
std::uint32_t afterBurnedTotal
Definition: InvariantCheck.h:350
ripple::ValidNFTokenPage::badEntry_
bool badEntry_
Definition: InvariantCheck.h:323
ripple::TERSubset< CanCvtToTER >
ripple::ValidNewAccountRoot::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:444
ripple::AccountRootsNotDeleted
Invariant: we cannot remove an account ledger entry.
Definition: InvariantCheck.h:146
ripple::XRPNotCreated
Invariant: A transaction must not create XRP and should only destroy the XRP fee.
Definition: InvariantCheck.h:118
ripple::XRPNotCreated::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:82
ripple::XRPNotCreated::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:137
cstdint
ripple::STTx
Definition: STTx.h:45
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
std::int64_t
ripple::ValidNewAccountRoot
Invariant: a new account root must be the consequence of a payment, must have the right starting sequ...
Definition: InvariantCheck.h:300
map
ripple::NoZeroEscrow::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:287
ripple::AccountRootsNotDeleted::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:316
ripple::LedgerEntryTypesMatch
Invariant: corresponding modified ledger entries should match in type and added entries should be a v...
Definition: InvariantCheck.h:197
ripple::NFTokenCountTracking::beforeBurnedTotal
std::uint32_t beforeBurnedTotal
Definition: InvariantCheck.h:348
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::InvariantChecker_PROTOTYPE
Prototype for invariant check implementations.
Definition: InvariantCheck.h:46
ripple::NoXRPTrustLines::xrpTrustLine_
bool xrpTrustLine_
Definition: InvariantCheck.h:226
ripple::ValidNewAccountRoot::accountsCreated_
std::uint32_t accountsCreated_
Definition: InvariantCheck.h:302
ripple::TransactionFeeCheck::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:34
ripple::AccountRootsNotDeleted::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:306
ripple::after
static bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: Escrow.cpp:88
ripple::AccountRootsNotDeleted::accountsDeleted_
std::uint32_t accountsDeleted_
Definition: InvariantCheck.h:148
ripple::XRPBalanceChecks::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:167
ripple::NFTokenCountTracking::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:616
ripple::NoXRPTrustLines
Invariant: Trust lines using XRP are not allowed.
Definition: InvariantCheck.h:224
ripple::XRPBalanceChecks::bad_
bool bad_
Definition: InvariantCheck.h:175
ripple::getInvariantChecks
InvariantChecks getInvariantChecks()
get a tuple of all invariant checks
Definition: InvariantCheck.h:392
ripple::LedgerEntryTypesMatch::invalidTypeAdded_
bool invalidTypeAdded_
Definition: InvariantCheck.h:200
ripple::XRPNotCreated::drops_
std::int64_t drops_
Definition: InvariantCheck.h:120
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::InvariantChecker_PROTOTYPE::visitEntry
void visitEntry(bool isDelete, std::shared_ptr< SLE const > const &before, std::shared_ptr< SLE const > const &after)
called for each ledger entry in the current transaction.
ripple::ValidNFTokenPage::badLink_
bool badLink_
Definition: InvariantCheck.h:324
ripple::ValidNFTokenPage
Definition: InvariantCheck.h:321
ripple::NoZeroEscrow
Invariant: an escrow entry must take a value between 0 and INITIAL_XRP drops exclusive.
Definition: InvariantCheck.h:275