Skip to main content
TransactionMeta can carry diagnostic events: data written by whichever node executed the transaction, not covered by consensus. They’re useful for debugging, and they’re different on every node.

What we measured

  • The CAP-0073 fixture’s meta from one RPC node’s getTransaction and from another’s getLedgers differed in exactly one value: a core_metrics invoke_time_nsecs event, 188,866 ns on one node and 126,592 ns on the other.
  • Re-fetching testnet ledgers 5,727,196 and 5,727,199 from the same RPC endpoint a few hours later returned LedgerCloseMeta with different sha256 hashes, because a different node behind the load balancer answered.
  • The mainnet data-lake objects stayed byte-identical across downloads.

The rules

  • Never index, hash or compare diagnostic events across nodes.
  • If you hash or compare whole metadata (for deduplication, integrity checks or caching), strip diagnostic events first, or compare only the consensus parts.
  • Treat a captured ledger as a snapshot, and pin it.

How the corpus follows it

Fixture meta is cut from the stored canonical ledger (kit/capture/canonicalize.mjs, checked by the provenance verifier), and stored testnet ledgers are never overwritten unless --refresh is passed. stellar-core’s own goldens take the same approach and zero diagnostic events before they’re written.