# Conflicts: # .codecov.yml # .github/scripts/levelization/results/ordering.txt # .github/workflows/reusable-clang-tidy-files.yml # CMakeLists.txt # OpenTelemetryPlan/00-tracing-fundamentals.md # OpenTelemetryPlan/01-architecture-analysis.md # OpenTelemetryPlan/02-design-decisions.md # OpenTelemetryPlan/03-implementation-strategy.md # OpenTelemetryPlan/04-code-samples.md # OpenTelemetryPlan/05-configuration-reference.md # OpenTelemetryPlan/06-implementation-phases.md # OpenTelemetryPlan/07-observability-backends.md # OpenTelemetryPlan/08-appendix.md # OpenTelemetryPlan/09-data-collection-reference.md # OpenTelemetryPlan/OpenTelemetryPlan.md # OpenTelemetryPlan/POC_taskList.md # OpenTelemetryPlan/Phase2_taskList.md # OpenTelemetryPlan/Phase3_taskList.md # OpenTelemetryPlan/Phase4_taskList.md # OpenTelemetryPlan/Phase5_IntegrationTest_taskList.md # OpenTelemetryPlan/Phase5_taskList.md # OpenTelemetryPlan/presentation.md # cfg/xrpld-example.cfg # conan.lock # conanfile.py # cspell.config.yaml # docker/telemetry/TESTING.md # docker/telemetry/docker-compose.yml # docker/telemetry/grafana/dashboards/consensus-health.json # docker/telemetry/grafana/dashboards/transaction-overview.json # docker/telemetry/grafana/provisioning/dashboards/dashboards.yaml # docker/telemetry/grafana/provisioning/datasources/tempo.yaml # docker/telemetry/integration-test.sh # docker/telemetry/otel-collector-config.yaml # docker/telemetry/tempo.yaml # docker/telemetry/xrpld-telemetry.cfg # docs/build/telemetry.md # docs/telemetry-runbook.md # include/xrpl/core/ServiceRegistry.h # include/xrpl/protocol/detail/features.macro # include/xrpl/telemetry/SpanGuard.h # include/xrpl/telemetry/Telemetry.h # include/xrpl/telemetry/TraceContextPropagator.h # src/libxrpl/basics/MallocTrim.cpp # src/libxrpl/nodestore/backend/MemoryFactory.cpp # src/libxrpl/nodestore/backend/NuDBFactory.cpp # src/libxrpl/nodestore/backend/RocksDBFactory.cpp # src/libxrpl/telemetry/NullTelemetry.cpp # src/libxrpl/telemetry/Telemetry.cpp # src/libxrpl/telemetry/TelemetryConfig.cpp # src/tests/libxrpl/basics/MallocTrim.cpp # src/tests/libxrpl/telemetry/TelemetryConfig.cpp # src/xrpld/app/consensus/RCLConsensus.cpp # src/xrpld/app/consensus/RCLConsensus.h # src/xrpld/app/ledger/detail/BuildLedger.cpp # src/xrpld/app/ledger/detail/LedgerMaster.cpp # src/xrpld/app/main/Application.cpp # src/xrpld/app/misc/NetworkOPs.cpp # src/xrpld/consensus/Consensus.h # src/xrpld/overlay/detail/PeerImp.cpp # src/xrpld/rpc/detail/RPCHandler.cpp # src/xrpld/rpc/detail/ServerHandler.cpp
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 thexrpldcodebase.- 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.
- As a consequence of this,
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.