Canonical ledgers
For each fixture, the fullLedgerCloseMeta of its ledger is stored in corpus/ledgers/<network>/<seq>.xdr.zst, as a zstd-compressed LedgerCloseMetaBatch. That’s the same layout SDF uses for its public data lake.
corpus/ledgers/index.json records each ledger’s sha256 (of the decompressed XDR), its size and its source.
The verifier
kit/go/cmd/verify checks every fixture, in order:
1
Manifest
manifest.json parses and validates against corpus/manifest.schema.json.2
Files
Each file decodes, and its sha256 and size match the manifest.
3
Ledger
The stored ledger’s sha256 matches
index.json, and its header’s protocol version matches the manifest.4
Transaction
The fixture’s transaction is found in that ledger by hash, using go-stellar-sdk’s ingestion reader with the network’s passphrase.
5
Byte equality
Every XDR value in the fixture (envelope, result, fee changes, meta) is byte-identical to the ledger’s copy. For ledger-entry fixtures, the entry is found among the transaction’s changes.
corpus/results/provenance.json and exits non-zero on any failure, which fails CI. Today: 62 of 62 checks pass.
Why the fixture is cut from the ledger
Testnet fixtures were first captured fromgetTransaction, and the verifier caught the problem immediately: one RPC node’s meta and another node’s ledger differed in a single diagnostic value. Rather than special-case that, kit/capture/canonicalize.mjs rewrites each fixture’s meta from the stored ledger. The ledger is the source of truth; the fixture is a slice of it.