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 
29 #include <cstdint>
30 #include <map>
31 #include <tuple>
32 #include <utility>
33 
34 namespace ripple {
35 
36 class ReadView;
37 
38 #if GENERATING_DOCS
39 
48 {
49 public:
50  explicit InvariantChecker_PROTOTYPE() = default;
51 
59  void
60  visitEntry(
61  bool isDelete,
62  std::shared_ptr<SLE const> const& before,
64 
77  bool
78  finalize(
79  STTx const& tx,
80  TER const tec,
81  XRPAmount const fee,
82  ReadView const& view,
83  beast::Journal const& j);
84 };
85 #endif
86 
94 {
95 public:
96  void
97  visitEntry(
98  bool,
101 
102  bool
103  finalize(
104  STTx const&,
105  TER const,
106  XRPAmount const,
107  ReadView const&,
108  beast::Journal const&);
109 };
110 
120 {
122 
123 public:
124  void
125  visitEntry(
126  bool,
129 
130  bool
131  finalize(
132  STTx const&,
133  TER const,
134  XRPAmount const,
135  ReadView const&,
136  beast::Journal const&);
137 };
138 
148 {
150 
151 public:
152  void
153  visitEntry(
154  bool,
157 
158  bool
159  finalize(
160  STTx const&,
161  TER const,
162  XRPAmount const,
163  ReadView const&,
164  beast::Journal const&);
165 };
166 
175 {
176  bool bad_ = false;
177 
178 public:
179  void
180  visitEntry(
181  bool,
184 
185  bool
186  finalize(
187  STTx const&,
188  TER const,
189  XRPAmount const,
190  ReadView const&,
191  beast::Journal const&);
192 };
193 
199 {
200  bool typeMismatch_ = false;
201  bool invalidTypeAdded_ = false;
202 
203 public:
204  void
205  visitEntry(
206  bool,
209 
210  bool
211  finalize(
212  STTx const&,
213  TER const,
214  XRPAmount const,
215  ReadView const&,
216  beast::Journal const&);
217 };
218 
226 {
227  bool xrpTrustLine_ = false;
228 
229 public:
230  void
231  visitEntry(
232  bool,
235 
236  bool
237  finalize(
238  STTx const&,
239  TER const,
240  XRPAmount const,
241  ReadView const&,
242  beast::Journal const&);
243 };
244 
253 {
254  bool bad_ = false;
255 
256 public:
257  void
258  visitEntry(
259  bool,
262 
263  bool
264  finalize(
265  STTx const&,
266  TER const,
267  XRPAmount const,
268  ReadView const&,
269  beast::Journal const&);
270 };
271 
277 {
278  bool bad_ = false;
279 
280 public:
281  void
282  visitEntry(
283  bool,
286 
287  bool
288  finalize(
289  STTx const&,
290  TER const,
291  XRPAmount const,
292  ReadView const&,
293  beast::Journal const&);
294 };
295 
302 {
305 
306 public:
307  void
308  visitEntry(
309  bool,
312 
313  bool
314  finalize(
315  STTx const&,
316  TER const,
317  XRPAmount const,
318  ReadView const&,
319  beast::Journal const&);
320 };
321 
334 {
335  bool badEntry_ = false;
336  bool badLink_ = false;
337  bool badSort_ = false;
338  bool badURI_ = false;
339  bool invalidSize_ = false;
340 
341 public:
342  void
343  visitEntry(
344  bool,
347 
348  bool
349  finalize(
350  STTx const&,
351  TER const,
352  XRPAmount const,
353  ReadView const&,
354  beast::Journal const&);
355 };
356 
371 {
376 
377 public:
378  void
379  visitEntry(
380  bool,
383 
384  bool
385  finalize(
386  STTx const&,
387  TER const,
388  XRPAmount const,
389  ReadView const&,
390  beast::Journal const&);
391 };
392 
402 {
404 
405 public:
406  void
407  visitEntry(
408  bool,
411 
412  bool
413  finalize(
414  STTx const&,
415  TER const,
416  XRPAmount const,
417  ReadView const&,
418  beast::Journal const&);
419 };
420 
421 // additional invariant checks can be declared above and then added to this
422 // tuple
430  NoBadOffers,
431  NoZeroEscrow,
436 
445 inline InvariantChecks
447 {
448  return InvariantChecks{};
449 }
450 
451 } // namespace ripple
452 
453 #endif
ripple::ValidNFTokenPage::badURI_
bool badURI_
Definition: InvariantCheck.h:338
ripple::LedgerEntryTypesMatch::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:362
ripple::NoZeroEscrow::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:263
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:45
ripple::XRPBalanceChecks::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:200
ripple::NoXRPTrustLines::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:430
ripple::ValidNFTokenPage::badSort_
bool badSort_
Definition: InvariantCheck.h:337
ripple::NoBadOffers::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:219
ripple::NoZeroEscrow::bad_
bool bad_
Definition: InvariantCheck.h:278
ripple::ValidClawback
Invariant: Token holder's trustline balance cannot be negative after Clawback.
Definition: InvariantCheck.h:401
ripple::ValidNFTokenPage::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:521
ripple::NoBadOffers::bad_
bool bad_
Definition: InvariantCheck.h:254
tuple
ripple::NFTokenCountTracking::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:659
ripple::ValidNFTokenPage::invalidSize_
bool invalidSize_
Definition: InvariantCheck.h:339
ripple::NFTokenCountTracking::beforeMintedTotal
std::uint32_t beforeMintedTotal
Definition: InvariantCheck.h:372
ripple::NoBadOffers
Invariant: offers should be for non-negative amounts and must not be XRP to XRP.
Definition: InvariantCheck.h:252
ripple::NFTokenCountTracking::afterMintedTotal
std::uint32_t afterMintedTotal
Definition: InvariantCheck.h:374
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:304
ripple::XRPBalanceChecks
Invariant: An account XRP balance must be in XRP and take a value between 0 and INITIAL_XRP drops,...
Definition: InvariantCheck.h:174
ripple::ValidNewAccountRoot::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:477
ripple::NoXRPTrustLines::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:447
ripple::LedgerEntryTypesMatch::typeMismatch_
bool typeMismatch_
Definition: InvariantCheck.h:200
ripple::NFTokenCountTracking
Invariant: Validates counts of NFTokens after all transaction types.
Definition: InvariantCheck.h:370
ripple::ValidNFTokenPage::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:598
ripple::NoBadOffers::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:244
ripple::TransactionFeeCheck
Invariant: We should never charge a transaction a negative fee or a fee that is larger than what the ...
Definition: InvariantCheck.h:93
ripple::LedgerEntryTypesMatch::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:404
ripple::NFTokenCountTracking::afterBurnedTotal
std::uint32_t afterBurnedTotal
Definition: InvariantCheck.h:375
ripple::ValidNFTokenPage::badEntry_
bool badEntry_
Definition: InvariantCheck.h:335
ripple::TERSubset< CanCvtToTER >
ripple::ValidNewAccountRoot::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:464
ripple::ValidClawback::trustlinesChanged
std::uint32_t trustlinesChanged
Definition: InvariantCheck.h:403
ripple::ValidClawback::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:757
ripple::AccountRootsNotDeleted
Invariant: we cannot remove an account ledger entry.
Definition: InvariantCheck.h:147
ripple::XRPNotCreated
Invariant: A transaction must not create XRP and should only destroy the XRP fee.
Definition: InvariantCheck.h:119
ripple::XRPNotCreated::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:84
ripple::XRPNotCreated::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:139
cstdint
ripple::STTx
Definition: STTx.h:46
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:301
map
ripple::NoZeroEscrow::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:289
ripple::AccountRootsNotDeleted::finalize
bool finalize(STTx const &, TER const, XRPAmount const, ReadView const &, beast::Journal const &)
Definition: InvariantCheck.cpp:318
ripple::LedgerEntryTypesMatch
Invariant: corresponding modified ledger entries should match in type and added entries should be a v...
Definition: InvariantCheck.h:198
ripple::NFTokenCountTracking::beforeBurnedTotal
std::uint32_t beforeBurnedTotal
Definition: InvariantCheck.h:373
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:54
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:47
ripple::NoXRPTrustLines::xrpTrustLine_
bool xrpTrustLine_
Definition: InvariantCheck.h:227
ripple::ValidNewAccountRoot::accountsCreated_
std::uint32_t accountsCreated_
Definition: InvariantCheck.h:303
ripple::TransactionFeeCheck::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:36
ripple::AccountRootsNotDeleted::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:308
ripple::after
static bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: Escrow.cpp:88
ripple::ValidClawback::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:747
ripple::AccountRootsNotDeleted::accountsDeleted_
std::uint32_t accountsDeleted_
Definition: InvariantCheck.h:149
ripple::XRPBalanceChecks::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:169
ripple::NFTokenCountTracking::visitEntry
void visitEntry(bool, std::shared_ptr< SLE const > const &, std::shared_ptr< SLE const > const &)
Definition: InvariantCheck.cpp:640
ripple::NoXRPTrustLines
Invariant: Trust lines using XRP are not allowed.
Definition: InvariantCheck.h:225
ripple::XRPBalanceChecks::bad_
bool bad_
Definition: InvariantCheck.h:176
ripple::getInvariantChecks
InvariantChecks getInvariantChecks()
get a tuple of all invariant checks
Definition: InvariantCheck.h:446
ripple::LedgerEntryTypesMatch::invalidTypeAdded_
bool invalidTypeAdded_
Definition: InvariantCheck.h:201
ripple::XRPNotCreated::drops_
std::int64_t drops_
Definition: InvariantCheck.h:121
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:336
ripple::ValidNFTokenPage
Invariant: Validates several invariants for NFToken pages.
Definition: InvariantCheck.h:333
ripple::NoZeroEscrow
Invariant: an escrow entry must take a value between 0 and INITIAL_XRP drops exclusive.
Definition: InvariantCheck.h:276