#pragma once /** Account-address redaction for telemetry span attributes. Path-finding RPC handlers would otherwise emit the caller's raw account addresses as span attributes. To keep plaintext addresses out of the telemetry backend, they are hashed at the point of emission. This header exposes a single pure helper that turns an address into a short, stable, obfuscated token. Data flow: handler -> redactAccount(addr) -> span attribute -> OTLP export The returned token is the first 16 hex characters (lowercase) of the SHA-512Half digest of the address. It is deterministic (same address always maps to the same token) so operators can still correlate spans for a given account across nodes and restarts. The hash is unsalted, so it is obfuscation, not a secrecy guarantee: XRP account addresses are a public, enumerable set, so a determined observer with the telemetry stream could rebuild the address->token mapping. The goal here is to keep plaintext addresses out of traces and dashboards, not to defend against a precomputation attack. A salt is intentionally omitted because it would break cross-node/restart correlation, which is the reason for hashing rather than dropping. A second, independent hashing layer runs in the OpenTelemetry Collector (an `attributes/hash` processor) as defense-in-depth for any node that emits a raw value. @note This function is pure and reentrant: it holds no global state, performs no I/O, and is safe to call concurrently from any thread. Usage example: @code #include using namespace xrpl::telemetry; span.setAttribute( pathfind_span::attr::sourceAccount, redactAccount(src.asString())); @endcode Edge case (empty input yields empty output): @code assert(redactAccount("") == ""); @endcode */ #include #include namespace xrpl::telemetry { /** Hash an account address into a short, stable, obfuscated token. @param addr The account address to redact (e.g. an r-address). @return The first 16 lowercase hex characters of sha512Half(addr), or an empty string when @p addr is empty. */ [[nodiscard]] std::string redactAccount(std::string_view addr); } // namespace xrpl::telemetry