Files
rippled/include/xrpl/protocol
Ed Hennis a17ccca615 Invariant: prevent a deleted account from leaving (most) artifacts on the ledger. (#4663)
* Add feature / amendment "InvariantsV1_1"

* Adds invariant AccountRootsDeletedClean:

* Checks that a deleted account doesn't leave any directly
  accessible artifacts behind.
* Always tests, but only changes the transaction result if
  featureInvariantsV1_1 is enabled.
* Unit tests.

* Resolves #4638

* [FOLD] Review feedback from @gregtatcam:

* Fix unused variable warning
* Improve Invariant test const correctness

* [FOLD] Review feedback from @mvadari:

* Centralize the account keylet function list, and some optimization

* [FOLD] Some structured binding doesn't work in clang

* [FOLD] Review feedback 2 from @mvadari:

* Clean up and clarify some comments.

* [FOLD] Change InvariantsV1_1 to unsupported

* Will allow multiple PRs to be merged over time using the same amendment.

* fixup! [FOLD] Change InvariantsV1_1 to unsupported

* [FOLD] Update and clarify some comments. No code changes.

* Move CMake directory

* Rearrange sources

* Rewrite includes

* Recompute loops

* Fix merge issue and formatting

---------

Co-authored-by: Pretty Printer <cpp@ripple.com>
2024-07-05 10:27:15 -07:00
..
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:14 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:14 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:14 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:14 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:14 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:14 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00
2024-06-20 13:57:16 -05:00

protocol

Classes and functions for handling data and values associated with the XRP Ledger protocol.

Serialized Objects

Objects transmitted over the network must be serialized into a canonical format. The prefix "ST" refers to classes that deal with the serialized format.

The term "Tx" or "tx" is an abbreviation for "Transaction", a commonly occurring object type.

Optional Fields

Our serialized fields have some "type magic" to make optional fields easier to read:

  • The operation x[sfFoo] means "return the value of 'Foo' if it exists, or the default value if it doesn't."
  • The operation x[~sfFoo] means "return the value of 'Foo' if it exists, or nothing if it doesn't." This usage of the tilde/bitwise NOT operator is not standard outside of the rippled codebase.
    • As a consequence of this, x[~sfFoo] = y[~sfFoo] assigns the value of Foo from y to x, including omitting Foo from x if it doesn't exist in y.

Typically, for things that are guaranteed to exist, you use x[sfFoo] and avoid having to deal with a container that may or may not hold a value. For things not guaranteed to exist, you use x[~sfFoo] because you want such a container. It avoids having to look something up twice, once just to see if it exists and a second time to get/set its value. (Real example)

The source of this "type magic" is in SField.h.