ingest,network,xdr: zero-copy XDR view extractors for full-history ingestion - #5949
Conversation
Add view-based twins of the parsed transaction path for full-history ingestion that avoid UnmarshalBinary by reading directly off the generated XDR view accessors: - ingest: LedgerCloseMetaView dispatch (header / TxProcessing / envelope enumeration over V0 TransactionSet + V1/V2 GeneralizedTransactionSet), TransactionEventsView with TransactionEventsFromMeta / DiagnosticEventsFromMeta, and a zero-copy Transaction read path (TransactionViewByHash / TransactionViewRange, by-hash envelope pairing) — the view analogs of LedgerTransaction / LedgerTransactionReader. - network: TransactionViewHasher, the view twin of HashTransactionInEnvelope, hashing straight from envelope wire bytes (incl. the TX_V0 -> V1 conversion). Shares the empty-passphrase guard with hashTx via validatePassphrase. - xdr: LedgerCloseMetaView.LedgerCloseTime and TransactionResultView.Successful, beside their parsed twins. Validated wire-identical against the parsed path (LedgerTransactionReader, HashTransactionInEnvelope, GetTransactionEvents / GetDiagnosticEvents) across LCM V0/V1/V2 and TransactionMeta V0-V4 via differential tests, including reversed-TxSet hash pairing and the V3 soroban contract-event gate.
There was a problem hiding this comment.
Pull request overview
This PR adds zero-copy, view-based XDR navigation and extraction primitives that operate directly on generated *View accessors (aliasing the source buffer) to support full-history ingestion/read paths without UnmarshalBinary.
Changes:
- Add view-based helpers in
xdrforLedgerCloseMetaView.LedgerCloseTimeandTransactionResultView.Successful. - Add a zero-allocation transaction hasher in
networkthat hashes directly fromTransactionEnvelopeViewwire bytes. - Add
ingestview-based transaction read/extraction APIs (LCM dispatch + per-tx materialization + event extractors) with differential tests against the parsed reader path.
Reviewed changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| xdr/transaction_result_view.go | Adds TransactionResultView.Successful() to match parsed success semantics using only view discriminants. |
| xdr/ledger_close_meta_view.go | Adds LedgerCloseMetaView.LedgerCloseTime() helper for header navigation from views. |
| network/transaction_view.go | Introduces TransactionViewHasher and HashTransactionInEnvelopeView for zero-copy hashing from envelope views. |
| network/transaction_view_test.go | Verifies view hashing matches parsed hashing across envelope types and edge cases. |
| network/main.go | Refactors passphrase validation into a shared helper used by both parsed and view hashing paths. |
| ingest/transaction_view.go | Adds zero-copy transaction materialization and range/by-hash retrieval using view dispatch + by-hash envelope pairing. |
| ingest/transaction_view_test.go | Differential tests ensuring view-based transaction materialization matches parsed LedgerTransactionReader outputs wire-identically. |
| ingest/transaction_events_view.go | Adds view-based raw event extractors with shared version-dispatched traversal for consistency across callers. |
| ingest/transaction_events_view_test.go | Differential tests ensuring view event extraction matches parsed GetTransactionEvents / GetDiagnosticEvents behavior (including the deliberate V3 gating split). |
| ingest/ledger_close_meta_view_nav.go | Adds LedgerCloseMetaViewDispatch and generalized TxSet envelope iteration to unify LCM version handling for view extractors. |
| ingest/CHANGELOG.md | Documents the new zero-copy view extractor APIs in the ingest changelog. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Distinguish the zero-copy read-path detail struct from the parsed LedgerTransaction (and the generic 'Transaction' name): TransactionView matches the package's other view-suffixed types (TransactionEventsView) and the TransactionViewByHash / TransactionViewRange constructors that produce it.
f563e98 to
52c9fd0
Compare
LedgerCloseMetaView.LedgerCloseTime and TransactionResultView.Successful (both new in this PR) read their fields through the generated Must* accessors inside Try — Must* panics with *ViewError on the first malformed field and Try recovers it, so the chain needs only one error check instead of a per-field ladder. (Addresses the per-property error-inspection feedback on stellar-rpc#778; the SDK already provides this mechanism.) Pre-existing accessors (LedgerSequence/LedgerHash/PreviousLedgerHash) are left untouched.
70ef282 to
b376025
Compare
The zero-copy XDR view extractors moved into the go-stellar-sdk (stellar/go-stellar-sdk#5949): ingest.DispatchLedgerCloseMetaView, ingest.TransactionEventsFromMeta / DiagnosticEventsFromMeta, ingest.TransactionViewByHash / TransactionViewRange (+ ingest.TransactionView), and network.TransactionViewHasher. The local views package collapses to thin RPC adapters over those APIs: - views.ExtractEvents composes the SDK extractor with the RPC events.Payload shape and the Stage->(TxIdx,OpIdx) cursor sentinels (events.StageSentinels). - views.ExtractTxHashes wraps the SDK navigation into txhash.Entry. - views.ExtractTxDetailsByHash / ExtractTransactions delegate to the SDK read path; views.Transaction aliases ingest.TransactionView. - dispatch.go and envelopes.go are deleted (moved to the SDK). Also drops the per-event index from events.Payload: it is positional and reconstructed at read time, so the eventIdx slot is removed from the 0x01 wire layout (unmarshalHeader now requires the declared length to consume every remaining byte, failing loudly on a pre-removal record) and the before/after/after-tx counters are gone from LCMToPayloads. Only the Stage->(TxIdx,OpIdx) cursor sentinels remain, shared with the SQL path via events.StageSentinels. Pins go-stellar-sdk to the #5949 branch pseudo-version; bump to the merged version once that PR lands.
…erage Renames inner err declarations flagged by go vet shadow, and ports the V=1 TransactionPhase (ParallelTxsComponent) differential test upstream so enumerateParallelTxs is covered where it lives.
tamirms
left a comment
There was a problem hiding this comment.
My main comment is the size of the public API. Besides the extractors themselves, the PR also exports the helpers they are built from — LedgerCloseMetaViewDispatch, DispatchLedgerCloseMetaView, TxResultMetaView, TransactionEventsFromMeta, DiagnosticEventsFromMeta. The only known consumer (stellar/stellar-rpc#779) needs a handful of complete functions, and once those exist nothing outside the SDK uses the helpers. Making something public later is easy; making it private later is impossible. Proposal:
- Add
ExtractTxHashes(lcm xdr.LedgerCloseMetaView) ([]xdr.Hash, error)— needed by the tx-hash index in stellar/stellar-rpc#779, missing today. - Add
ExtractLedgerEvents(lcm xdr.LedgerCloseMetaView) ([]LedgerTransactionEvents, error), withLedgerTransactionEventsa flat{Hash [32]byte; TransactionEvents [][]byte; OperationEvents [][][]byte}. The hash belongs in this result: the events index needs hash + events per transaction, and getting hashes from a separate call would walk TxProcessing twice (sizing each element to advance the iterator is the dominant cost). With this in place,TransactionEventsView/TransactionEventsFromMeta/DiagnosticEventsFromMetahave no external callers and can be unexported. TransactionViewByHash/TransactionViewRangestay public as-is.network.TransactionViewHasher:Hashcurrently returns the hash, the envelope type, and an is-soroban flag. Return just([32]byte, error)— the envelope-type and soroban reads don't involve hashing or the passphrase, and fit better as unexported helpers iningest. The one-shotHashTransactionInEnvelopeViewhas no callers; drop it.- Everything else (
LedgerCloseMetaViewDispatch,DispatchLedgerCloseMetaView,TxResultMetaView, the envelope enumerators) becomes unexported.
A smaller API is also easier to keep stable: these helpers put iter.Seq2 and the TxResultMetaView interface in public signatures, which are the most likely things to change as the views API matures. Worth marking the new functions as experimental in the doc comments and CHANGELOG either way.
Smaller items:
-
Naming:
ingest.TransactionViewcollides with the generatedxdr.TransactionView(used as a parameter type innetwork/transaction_view.goin this same PR).LedgerTransactionViewparallelsLedgerTransactionand collides with nothing. +1 to Copilot'sEvents→DiagnosticEventsrename. -
TX_V0 coverage: both V0 fixtures have TimeBounds present, so the absent arm of the TimeBounds/Preconditions wire equivalence (stated in the doc comment) is untested. Add a
txV0(t, nil, …)case to the hasher differential test. -
Real-ledger tests and benchmarks: using
xdr/testdata/ledger_58752000.bin, add (a) equivalence tests asserting the four public extractors produce output identical to the eager-decode path (LedgerTransactionReader/GetTransactionEvents), and (b) benchmarks for the four on that ledger (forTransactionViewRange, both full-ledger and a small page — the small page is where the early-stop in envelope pairing shows up). The hand-rolled benchmarks in xdr on the same fixture (extract_tx_bench_test.go,event_extraction_bench_test.go,selective_decode_bench_test.go) prototype exactly the loops this PR turns into production code — delete them in favor of the new ones, keeping their full-decode arms as the A/B baseline. Where the equivalence tests end up duplicating existing synthetic differential coverage, prefer the equivalence tests; the synthetic fixtures still earn their place for shapes a modern ledger can't contain (LCM V0, older meta versions, the TX_V0 TimeBounds arms, the V3 soroban gate, cursor and error edges).
…tractors Address review feedback: the public surface is now the complete extractors only — the navigation scaffolding they are built from is unexported, keeping iter.Seq2 and the per-version TxProcessing interface out of public signatures. - Add ExtractTxHashes (per-ledger tx hashes in apply order) and ExtractLedgerEvents (hash + contract events per transaction from a single TxProcessing walk, as flat raw-bytes LedgerTransactionEvents). - Unexport DispatchLedgerCloseMetaView/LedgerCloseMetaViewDispatch/ TxResultMetaView/TxProcessingHash and TransactionEventsView with TransactionEventsFromMeta/DiagnosticEventsFromMeta. - Rename ingest.TransactionView -> LedgerTransactionView (parallels LedgerTransaction; no longer collides with the generated xdr.TransactionView) and its Events field -> DiagnosticEvents. - network.TransactionViewHasher.Hash returns just ([32]byte, error); the envelope-type/soroban discriminant reads move to unexported ingest helpers; drop the unused one-shot HashTransactionInEnvelopeView. - Mark the new extractors experimental in doc comments and CHANGELOG. - Tests: TX_V0 absent-TimeBounds arm in the hasher differential; real-ledger (ledger_58752000) equivalence tests proving all four public extractors identical to the eager-decode reference path, and benchmarks with full-decode baselines superseding the hand-rolled xdr prototypes (extract_tx/event_extraction/selective_decode), which are deleted.
|
Implemented the API reduction in f92b870 — point by point: Public surface. The package now exports exactly the complete extractors:
1 — Naming: 2 — TX_V0 TimeBounds: added a TimeBounds-absent V0 case to the hasher differential test, pinning the absent arm of the wire-equivalence claim. 3 — Real-ledger tests and benchmarks: added equivalence tests on Downstream note: stellar/stellar-rpc#779 will need a small follow-up to consume |
Bump go-stellar-sdk to f92b870f (stellar/go-stellar-sdk#5949 review response), which shrank the public extractor surface: - ExtractTxHashes now wraps ingest.ExtractTxHashes (the navigation scaffolding the old wrapper drove is unexported in the SDK). - ExtractEvents now wraps ingest.ExtractLedgerEvents — hash + events from one TxProcessing walk; the V0 sentinel stays RPC policy, read off the discriminator locally. - views.Transaction aliases ingest.LedgerTransactionView (renamed from TransactionView); the diagnostic field is now DiagnosticEvents. - ExtractTxDetailsByHash / ExtractTransactions delegate to LedgerTransactionViewByHash / LedgerTransactionViewRange.
Carries over the position-spread dimension from the deleted xdr selective-decode prototype: TxProcessing scan cost scales with apply position and the envelope-pairing early stop with agreed-set position, so a single mid-ledger sample under-describes the range.
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
tamirms
left a comment
There was a problem hiding this comment.
LGTM once CI is green — staticcheck is flagging diagnosticEventsFromMeta as unused now that the read path goes through metaEventRaws directly; it can just be deleted.
staticcheck U1000: with the wrapper unexported, its only caller was a test — the read path collects diagnostics through metaEventRaws' wantDiag arm directly, and the test now does the same.
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
…tructive opens Address the remaining PR #779 review threads: - All hot stores are chunk-bound (each accumulates one chunk before being frozen into cold artifacts), so make the binding explicit on the ledger and txhash hot stores too: their constructors now take a chunk.ID and expose ChunkID(), and RunHot validates every injected store's binding up front instead of only the events store's. - Validate the probed first ledger IS the chunk's first before the destructive cold constructors run, so a corrupted/misrouted pack or a wrong-range ChunkSource cannot truncate a previously finalized chunk on its way to drain's rejection. - Re-check ctx cancellation after the first-ledger probe: a sibling chunk worker's failure cancels gctx while this worker is blocked in the probe's I/O, and the replay wrapper would otherwise hand drain the cached ledger only after the constructors already truncated the existing artifacts. - Extract the pre-build validation into probeChunkSource (keeps runOneChunkCold under the funlen limit and gives the probe a single home). - Bump go-stellar-sdk to the post-merge commit of stellar/go-stellar-sdk#5949.
…elds() for xdr views Extends the shipped v1 xdr views API (stellar#5949) with four additive features, without removing Iter()/All()/At()/Raw() or adding a Scan() cursor: - Decoded union discriminants: the discriminant accessor (e.g. V()) now returns the decoded enum/int/bool directly instead of a leaf view, so callers drop the two-step V().Value(). Enum discriminants validate against the known case set; int discriminants do not (default arms stay reachable). - Typed fixed-opaque Value(): returns the typed array (e.g. Hash, [N]byte) by value instead of []byte. - Array count validation (OOM guard): Count()/All()/Iter() validate the wire element count against the remaining buffer up front, using a per-type minimum element wire size. size()/valid() keep the cheap unvalidated count because their per-element walk is already buffer-bounded, so the check is confined to the allocation/iteration entry points. Covered by view_count_validation_test.go. - Fields(): a per-struct method that locates every field in a single walk and returns a bundle of trimmed sub-views, enabling fused advance+locate iteration (advance by len(bundle.View)) for single-walk materialization without a cursor. A randxdr differential (TestView_RandXDR_Fields) checks the located fields are trimmed to their exact wire extent. The xdr-package view helpers are adjusted for the typed-opaque and decoded- discriminant changes (LedgerCloseMetaView.LedgerHash/PreviousLedgerHash use Raw() for zero-copy bytes; TransactionResultView.Successful uses the decoded code), and views_api.md documents all four features. Co-Authored-By: Claude Opus 4.8 <[email protected]>
…elds() for xdr views Extends the shipped v1 xdr views API (stellar#5949) with four additive features, without removing Iter()/All()/At()/Raw() or adding a Scan() cursor: - Decoded union discriminants: the discriminant accessor (e.g. V()) now returns the decoded enum/int/bool directly instead of a leaf view, so callers drop the two-step V().Value(). Enum discriminants validate against the known case set; int discriminants do not (default arms stay reachable). - Typed fixed-opaque Value(): returns the typed array (e.g. Hash, [N]byte) by value instead of []byte. - Array count validation (OOM guard): Count()/All()/Iter() validate the wire element count against the remaining buffer up front, using a per-type minimum element wire size. size()/valid() keep the cheap unvalidated count because their per-element walk is already buffer-bounded, so the check is confined to the allocation/iteration entry points. Covered by view_count_validation_test.go. - Fields(): a per-struct method that locates every field in a single walk and returns a bundle of trimmed sub-views, enabling fused advance+locate iteration (advance by len(bundle.View)) for single-walk materialization without a cursor. A randxdr differential (TestView_RandXDR_Fields) checks the located fields are trimmed to their exact wire extent. The xdr-package view helpers are adjusted for the typed-opaque and decoded- discriminant changes (LedgerCloseMetaView.LedgerHash/PreviousLedgerHash use Raw() for zero-copy bytes; TransactionResultView.Successful uses the decoded code), and views_api.md documents all four features. Co-Authored-By: Claude Opus 4.8 <[email protected]>
…elds() for xdr views Extends the shipped v1 xdr views API (stellar#5949) with four additive features, without removing Iter()/All()/At()/Raw() or adding a Scan() cursor: - Decoded union discriminants: the discriminant accessor (e.g. V()) now returns the decoded enum/int/bool directly instead of a leaf view, so callers drop the two-step V().Value(). Enum discriminants validate against the known case set; int discriminants do not (default arms stay reachable). - Typed fixed-opaque Value(): returns the typed array (e.g. Hash, [N]byte) by value instead of []byte. - Array count validation (OOM guard): Count()/All()/Iter() validate the wire element count against the remaining buffer up front, using a per-type minimum element wire size. size()/valid() keep the cheap unvalidated count because their per-element walk is already buffer-bounded, so the check is confined to the allocation/iteration entry points. Covered by view_count_validation_test.go. - Fields(): a per-struct method that locates every field in a single walk and returns a bundle of trimmed sub-views, enabling fused advance+locate iteration (advance by len(bundle.View)) for single-walk materialization without a cursor. A randxdr differential (TestView_RandXDR_Fields) checks the located fields are trimmed to their exact wire extent. The xdr-package view helpers are adjusted for the typed-opaque and decoded- discriminant changes (LedgerCloseMetaView.LedgerHash/PreviousLedgerHash use Raw() for zero-copy bytes; TransactionResultView.Successful uses the decoded code), and views_api.md documents all four features. Co-Authored-By: Claude Opus 4.8 <[email protected]>
… updates (#1185) Yes — the previous response still rendered the Markdown. You want the **literal Markdown source**, with no HTML tags at all. ```markdown Bumps the minor-and-patch group with 7 updates in the `/` directory: | Package | From | To | | --- | --- | --- | | [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `1.43.0` | `1.43.5` | | [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.32.31` | `1.32.36` | | [github.com/aws/aws-sdk-go-v2/service/ses](https://github.com/aws/aws-sdk-go-v2) | `1.37.0` | `1.37.5` | | [github.com/aws/aws-sdk-go-v2/service/sns](https://github.com/aws/aws-sdk-go-v2) | `1.42.0` | `1.42.5` | | [github.com/stellar/go-stellar-sdk](https://github.com/stellar/go-stellar-sdk) | `0.6.0` | `0.7.2` | | [golang.org/x/crypto](https://github.com/golang/crypto) | `0.54.0` | `0.55.0` | | [golang.org/x/net](https://github.com/golang/net) | `0.57.0` | `0.58.0` | Updates `github.com/aws/aws-sdk-go-v2` from 1.43.0 to 1.43.5 ### Commits - [`a14f5f1`](aws/aws-sdk-go-v2@a14f5f1) Release 2026-08-10 - [`339f0b6`](aws/aws-sdk-go-v2@339f0b6) Regenerated Clients - [`0978e3d`](aws/aws-sdk-go-v2@0978e3d) Update API model - [`3cc614d`](aws/aws-sdk-go-v2@3cc614d) Fix codegen mp ([#3508](https://redirect.github.com/aws/aws-sdk-go-v2/issues/3508)) - [`1434b18`](aws/aws-sdk-go-v2@1434b18) generate response snapshots for json ([#3507](https://redirect.github.com/aws/aws-sdk-go-v2/issues/3507)) - [`ad58f77`](aws/aws-sdk-go-v2@ad58f77) Checkout smithy-go on PRs at the commit pointed out by SMITHY_GO_CODEGEN_VERS... - [`c002860`](aws/aws-sdk-go-v2@c002860) feat: move close-body, logger, and service-metadata work out of the middlewar... - [`f152336`](aws/aws-sdk-go-v2@f152336) Release 2026-08-07 - [`37d88d7`](aws/aws-sdk-go-v2@37d88d7) Regenerated Clients - [`c54b278`](aws/aws-sdk-go-v2@c54b278) Update endpoints model - Additional commits viewable in [compare view](aws/aws-sdk-go-v2@v1.43.0...v1.43.5) Updates `github.com/aws/aws-sdk-go-v2/config` from 1.32.31 to 1.32.36 ### Commits - [`a14f5f1`](aws/aws-sdk-go-v2@a14f5f1) Release 2026-08-10 - [`339f0b6`](aws/aws-sdk-go-v2@339f0b6) Regenerated Clients - [`0978e3d`](aws/aws-sdk-go-v2@0978e3d) Update API model - [`3cc614d`](aws/aws-sdk-go-v2@3cc614d) Fix codegen mp ([#3508](https://redirect.github.com/aws/aws-sdk-go-v2/issues/3508)) - [`1434b18`](aws/aws-sdk-go-v2@1434b18) generate response snapshots for json ([#3507](https://redirect.github.com/aws/aws-sdk-go-v2/issues/3507)) - [`ad58f77`](aws/aws-sdk-go-v2@ad58f77) Checkout smithy-go on PRs at the commit pointed out by SMITHY_GO_CODEGEN_VERS... - [`c002860`](aws/aws-sdk-go-v2@c002860) feat: move close-body, logger, and service-metadata work out of the middlewar... - [`f152336`](aws/aws-sdk-go-v2@f152336) Release 2026-08-07 - [`37d88d7`](aws/aws-sdk-go-v2@37d88d7) Regenerated Clients - [`c54b278`](aws/aws-sdk-go-v2@c54b278) Update endpoints model - Additional commits viewable in [compare view](aws/aws-sdk-go-v2@config/v1.32.31...config/v1.32.36) Updates `github.com/aws/aws-sdk-go-v2/credentials` from 1.19.30 to 1.19.35 ### Commits - [`a14f5f1`](aws/aws-sdk-go-v2@a14f5f1) Release 2026-08-10 - [`339f0b6`](aws/aws-sdk-go-v2@339f0b6) Regenerated Clients - [`0978e3d`](aws/aws-sdk-go-v2@0978e3d) Update API model - [`3cc614d`](aws/aws-sdk-go-v2@3cc614d) Fix codegen mp ([#3508](https://redirect.github.com/aws/aws-sdk-go-v2/issues/3508)) - [`1434b18`](aws/aws-sdk-go-v2@1434b18) generate response snapshots for json ([#3507](https://redirect.github.com/aws/aws-sdk-go-v2/issues/3507)) - [`ad58f77`](aws/aws-sdk-go-v2@ad58f77) Checkout smithy-go on PRs at the commit pointed out by SMITHY_GO_CODEGEN_VERS... - [`c002860`](aws/aws-sdk-go-v2@c002860) feat: move close-body, logger, and service-metadata work out of the middlewar... - [`f152336`](aws/aws-sdk-go-v2@f152336) Release 2026-08-07 - [`37d88d7`](aws/aws-sdk-go-v2@37d88d7) Regenerated Clients - [`c54b278`](aws/aws-sdk-go-v2@c54b278) Update endpoints model - Additional commits viewable in [compare view](aws/aws-sdk-go-v2@credentials/v1.19.30...credentials/v1.19.35) Updates `github.com/aws/aws-sdk-go-v2/service/ses` from 1.37.0 to 1.37.5 ### Commits - [`b4784c1`](aws/aws-sdk-go-v2@b4784c1) Release 2026-07-01 - [`97c0201`](aws/aws-sdk-go-v2@97c0201) Regenerated Clients - [`6687238`](aws/aws-sdk-go-v2@6687238) Update endpoints model - [`995297f`](aws/aws-sdk-go-v2@995297f) Update API model - [`c26cfc6`](aws/aws-sdk-go-v2@c26cfc6) Fix bump smithy-go to cover multiple issues ([#3461](https://redirect.github.com/aws/aws-sdk-go-v2/issues/3461)) - [`fae66b8`](aws/aws-sdk-go-v2@fae66b8) Set transfer manager error as the first error seen, preventing race condition... - [`cf0eabd`](aws/aws-sdk-go-v2@cf0eabd) Release 2026-06-30 - [`ad0c091`](aws/aws-sdk-go-v2@ad0c091) Regenerated Clients - [`196e961`](aws/aws-sdk-go-v2@196e961) Update endpoints model - [`1529ead`](aws/aws-sdk-go-v2@1529ead) Update API model - Additional commits viewable in [compare view](aws/aws-sdk-go-v2@v1.37.0...service/pi/v1.37.5) Updates `github.com/aws/aws-sdk-go-v2/service/sns` from 1.42.0 to 1.42.5 ### Commits - [`dcbed91`](aws/aws-sdk-go-v2@dcbed91) Release 2026-01-09 - [`08120e8`](aws/aws-sdk-go-v2@08120e8) Regenerated Clients - [`1d7a925`](aws/aws-sdk-go-v2@1d7a925) Update endpoints model - [`482067d`](aws/aws-sdk-go-v2@482067d) Update API model - [`4662404`](aws/aws-sdk-go-v2@4662404) remove example ([#3282](https://redirect.github.com/aws/aws-sdk-go-v2/issues/3282)) - [`c28a6f4`](aws/aws-sdk-go-v2@c28a6f4) Release 2026-01-07 - [`2fa7a72`](aws/aws-sdk-go-v2@2fa7a72) Regenerated Clients - [`077cbaa`](aws/aws-sdk-go-v2@077cbaa) Update endpoints model - [`3282dbc`](aws/aws-sdk-go-v2@3282dbc) Update API model - [`3daa74a`](aws/aws-sdk-go-v2@3daa74a) Release 2026-01-06 - Additional commits viewable in [compare view](aws/aws-sdk-go-v2@v1.42.0...service/amp/v1.42.5) Updates `github.com/stellar/go-stellar-sdk` from 0.6.0 to 0.7.2 ### Release Notes Source: [github.com/stellar/go-stellar-sdk releases](https://github.com/stellar/go-stellar-sdk/releases) #### v0.7.2 ##### What's Changed - xdr: compare assets by their XDR encoding, and use Equals for asset equality by [@karthikiyer56](https://github.com/karthikiyer56) in [stellar/go-stellar-sdk#5974](https://redirect.github.com/stellar/go-stellar-sdk/pull/5974) - txnbuild: consolidate liquidity pool ordering guards; xdr and ingest cleanups by [@karthikiyer56](https://github.com/karthikiyer56) in [stellar/go-stellar-sdk#5978](https://redirect.github.com/stellar/go-stellar-sdk/pull/5978) - strkey: enforce SEP-23 payload lengths in Decode and DecodeAny by [@karthikiyer56](https://github.com/karthikiyer56) in [stellar/go-stellar-sdk#5977](https://redirect.github.com/stellar/go-stellar-sdk/pull/5977) **Full Changelog:** [v0.7.1...v0.7.2](stellar/go-stellar-sdk@v0.7.1...v0.7.2) #### v0.7.1 ##### What's Changed - stellartoml: validate domain in GetStellarToml for parity with sibling by [@karthikiyer56](https://github.com/karthikiyer56) in [stellar/go-stellar-sdk#5970](https://redirect.github.com/stellar/go-stellar-sdk/pull/5970) - ingest: one ledger walk — ExtractLedgerTxParts + EventsFromTxParts/FeesFromTxParts (supersedes the extractor bundles) by [@karthikiyer56](https://github.com/karthikiyer56) in [stellar/go-stellar-sdk#5966](https://redirect.github.com/stellar/go-stellar-sdk/pull/5966) **Full Changelog:** [v0.7.0...v0.7.1](stellar/go-stellar-sdk@v0.7.0...v0.7.1) #### v0.7.0 ##### What's Changed - ingest,network,xdr: zero-copy XDR view extractors for full-history ingestion by [@chowbao](https://github.com/chowbao) in [stellar/go-stellar-sdk#5949](https://redirect.github.com/stellar/go-stellar-sdk/pull/5949) - xdr,xdrgen,ingest: extend xdr views (decoded discriminants, typed opaque, count validation, Fields) and rebuild the view extractors on them by [@tamirms](https://github.com/tamirms) in [stellar/go-stellar-sdk#5951](https://redirect.github.com/stellar/go-stellar-sdk/pull/5951) - protocols/rpc: add UseUpgradedAuth flag to SimulateTransactionRequest by [@Ryang-21](https://github.com/Ryang-21) in [stellar/go-stellar-sdk#5948](https://redirect.github.com/stellar/go-stellar-sdk/pull/5948) - protocols/rpc: Add LedgerCloseTime to GetHealthResponse by [@felixl256](https://github.com/felixl256) in [stellar/go-stellar-sdk#5958](https://redirect.github.com/stellar/go-stellar-sdk/pull/5958) - ingest/loadtest: expand loadtest functionality to handle multiple ledger bundles by [@cjonas9](https://github.com/cjonas9) in [stellar/go-stellar-sdk#5959](https://redirect.github.com/stellar/go-stellar-sdk/pull/5959) - ingest: expose fee-bump inner hashes on the view extractors by [@tamirms](https://github.com/tamirms) in [stellar/go-stellar-sdk#5964](https://redirect.github.com/stellar/go-stellar-sdk/pull/5964) - ingest/ledgerbackend: Update captive-core-pubnet.cfg: swap SP with Obsrvr by [@drebelsky](https://github.com/drebelsky) in [stellar/go-stellar-sdk#5963](https://redirect.github.com/stellar/go-stellar-sdk/pull/5963) - Protocol 28 (CAP-0085) by [@sisuresh](https://github.com/sisuresh) in [stellar/go-stellar-sdk#5965](https://redirect.github.com/stellar/go-stellar-sdk/pull/5965) ##### New Contributors - [@Ryang-21](https://github.com/Ryang-21) made their first contribution in [stellar/go-stellar-sdk#5948](https://redirect.github.com/stellar/go-stellar-sdk/pull/5948) - [@felixl256](https://github.com/felixl256) made their first contribution in [stellar/go-stellar-sdk#5958](https://redirect.github.com/stellar/go-stellar-sdk/pull/5958) **Full Changelog:** [v0.6.0...v0.7.0](stellar/go-stellar-sdk@v0.6.0...v0.7.0) #### v0.6.1 ##### What's Changed - Backports for Horizon 27.0.1 (release-0.6.1) by [@karthikiyer56](https://github.com/karthikiyer56) in [stellar/go-stellar-sdk#5979](https://redirect.github.com/stellar/go-stellar-sdk/pull/5979) **Full Changelog:** [v0.6.0...v0.6.1](stellar/go-stellar-sdk@v0.6.0...v0.6.1) ### Changelog Source: [github.com/stellar/go-stellar-sdk changelog](https://github.com/stellar/go-stellar-sdk/blob/main/CHANGELOG.md) # Changelog This repository adheres to [Go module Versioning](https://go.dev/doc/modules/version-numbers). This monorepo contains a number of SDKs: - `horizonclient` ([changelog](https://github.com/stellar/go-stellar-sdk/blob/main/clients/horizonclient/CHANGELOG.md)) - `txnbuild` ([changelog](https://github.com/stellar/go-stellar-sdk/blob/main/txnbuild/CHANGELOG.md)) - `rpcclient` ([changelog](https://github.com/stellar/go-stellar-sdk/blob/main/clients/rpcclient/CHANGELOG.md)) - `corelient` ([changelog](https://github.com/stellar/go-stellar-sdk/blob/main/clients/stellarcore/CHANGELOG.md)) Official project releases may be found here: [https://github.com/stellar/go-stellar-sdk/releases](https://github.com/stellar/go-stellar-sdk/releases) ## Pending ### New Features - protocols/rpc: Add `LatestLedgerCloseTime` and `OldestLedgerCloseTime` to `GetHealthResponse`, exposing the latest and oldest ledgers' close times (unix seconds) on the `getHealth` response ([#5958](https://redirect.github.com/stellar/go-stellar-sdk/pull/5958)) ### Breaking Changes - strkey: `Decode` and `DecodeAny` now validate the payload length against the version byte per [SEP-23](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0023.md). Fixed-length keys (account ID, seed, muxed account, contract, liquidity pool, claimable balance, hashTx, hashX) must decode to their exact canonical size, and signed payloads must carry a declared payload length of 1–64 bytes matched by their zero padding. Inputs with a valid checksum but a wrong-length payload — previously accepted by `Decode`, `DecodeAny`, and every `IsValid*` helper — are now rejected ([#5977](https://redirect.github.com/stellar/go-stellar-sdk/pull/5977)). - `NewSignedPayload` rejects empty payloads, matching CAP-40 (the protocol fails such signers with `SET_OPTIONS_BAD_SIGNER`/`txMALFORMED`) and keeping `SignedPayload.Encode` output decodable. - Length re-checks that `Decode` now subsumes were removed from `xdr.AccountId.SetAddress`, `xdr.MuxedAccount.SetAddress`, `xdr.SignerKey.SetAddress`, `xdr.ClaimableBalanceId.DecodeFromStrkey`, `strkey.DecodeMuxedAccount`, `strkey.MuxedAccount.SetAccountID`, and txnbuild contract-address parsing. For wrong-length inputs, the xdr and txnbuild callers now return strkey's `invalid payload length` error instead of their own; the strkey muxed-account helpers keep their generic `invalid muxed account` / `invalid ed25519 public key` errors; `xdr.MuxedAccount.SetAddress` is unchanged (it rejects on encoded string length before decoding). - `keypair.ParseAddress` wraps every decode failure with `ErrInvalidKey`, so `errors.Is(err, ErrInvalidKey)` keeps matching wrong-length keys (and now also matches checksum/encoding failures, which previously returned the bare strkey error). - `DecodeSignedPayload` delegates structure validation to `Decode`; structurally invalid inputs now uniformly error with `invalid signed payload` (previously `signed payload too short: ...` or `invalid signed payload padding`). - xdr: `Asset.LessThan` now orders assets the way the protocol does — by the raw 32-byte issuer key — instead of by base32 strkey text, and `xdr.NewPoolId` requires strictly `a < b`, rejecting reversed and identical pairs ([#5974](https://redirect.github.com/stellar/go-stellar-sdk/pull/5974)) - txnbuild: liquidity pool operations reject asset pairs that are not strictly ordered; see the [txnbuild changelog](https://github.com/stellar/go-stellar-sdk/blob/main/txnbuild/CHANGELOG.md) ([#5974](https://redirect.github.com/stellar/go-stellar-sdk/pull/5974)) ### Bug Fixes - processors/token_transfer: trustline revocation now compares liquidity pool assets by value instead of pointer identity, fixing wrong-leg selection when burning pool shares ([#5974](https://redirect.github.com/stellar/go-stellar-sdk/pull/5974)) ## [0.7.0] ### New Features - xdr: Protocol 28 support (CAP-0083, CAP-0085). XDR regenerated from [stellar-xdr@9c9c1459](stellar/stellar-xdr@9c9c145), the commit stellar-core 28.0.0 pins; both CAPs are ungated upstream so `XDR_FEATURES` is now empty. ### Commits - [`b46a463`](stellar/go-stellar-sdk@b46a463) strkey: enforce SEP-23 payload lengths in Decode and DecodeAny ([#5977](https://redirect.github.com/stellar/go-stellar-sdk/issues/5977)) - [`f8cd5df`](stellar/go-stellar-sdk@f8cd5df) txnbuild: consolidate liquidity pool ordering guards; xdr and ingest cleanups... - [`d2f530f`](stellar/go-stellar-sdk@d2f530f) xdr: compare assets by their XDR encoding, and use Equals for asset equality ... - [`3114a80`](stellar/go-stellar-sdk@3114a80) ingest: one ledger walk — ExtractLedgerTxParts + EventsFromTxParts/FeesFromTx... - [`3c3872f`](stellar/go-stellar-sdk@3c3872f) stellartoml: validate domain in GetStellarToml for parity with sibling ([#5970](https://redirect.github.com/stellar/go-stellar-sdk/issues/5970)) - [`2b16db0`](stellar/go-stellar-sdk@2b16db0) Protocol 28 Support ([#5969](https://redirect.github.com/stellar/go-stellar-sdk/issues/5969)) - [`e5d0cb9`](stellar/go-stellar-sdk@e5d0cb9) Merge main into protocol-next ahead of the Protocol 28 GA merge - [`149b994`](stellar/go-stellar-sdk@149b994) Finalize Protocol 28: pin stellar-xdr @ `9c9c1459` ([#5968](https://redirect.github.com/stellar/go-stellar-sdk/issues/5968)) - [`82df764`](stellar/go-stellar-sdk@82df764) Protocol 28 (CAP-0085) XDR regeneration ([#5965](https://redirect.github.com/stellar/go-stellar-sdk/issues/5965)) - [`8dd9cad`](stellar/go-stellar-sdk@8dd9cad) Update captive-core-pubnet.cfg: swap SP with Obsrvr ([#5963](https://redirect.github.com/stellar/go-stellar-sdk/issues/5963)) - Additional commits viewable in [compare view](stellar/go-stellar-sdk@v0.6.0...v0.7.2) Updates `golang.org/x/crypto` from 0.54.0 to 0.55.0 ### Commits - [`f44d03d`](golang/crypto@f44d03d) go.mod: update golang.org/x dependencies - [`5ed4944`](golang/crypto@5ed4944) crypto/internal/poly1305: provide optimised assembly for riscv64 - [`b07833c`](golang/crypto@b07833c) ssh: return window credit for discarded extended data - [`d701c51`](golang/crypto@d701c51) acme: fix nil pointer dereference in pebble test error reporting - [`999d053`](golang/crypto@999d053) ssh: fix parsing of GSSAPI payloads offering multiple mechanisms - [`90f76b8`](golang/crypto@90f76b8) ssh: reject certificate signature keys before recursing - [`b53964a`](golang/crypto@b53964a) ssh: permit empty but non-nil HostKeyAlgorithms, KeyExchanges, Ciphers, MACs - [`626e40f`](golang/crypto@626e40f) ssh: drain stderr on forwarded TCP and Unix channels - [`31914c6`](golang/crypto@31914c6) x509roots/fallback: update bundle - [`f2135b8`](golang/crypto@f2135b8) all: clean up minor issues found by staticcheck - Additional commits viewable in [compare view](golang/crypto@v0.54.0...v0.55.0) Updates `golang.org/x/net` from 0.57.0 to 0.58.0 ### Commits - [`acc78e0`](golang/net@acc78e0) go.mod: update golang.org/x dependencies - [`90d10f0`](golang/net@90d10f0) internal/http3: delete invalid Content-Length if declared in server handler - [`08abf4d`](golang/net@08abf4d) internal/http3: infer headers when Content-Encoding is set but is empty - [`8d10596`](golang/net@8d10596) http2: avoid deadlocks in wrapped ClientConn state callback - [`99c3b0a`](golang/net@99c3b0a) http2/hpack: build the table lookup maps lazily, only for encoders - [`5a920b1`](golang/net@5a920b1) http3: rework registration to allow using a fake network - [`7fd2842`](golang/net@7fd2842) quic: return an error from Accept after PacketConn reader exits - [`825111d`](golang/net@825111d) quic: avoid busy-loop when keep-alive is blocked by congestion control - [`a02ddfa`](golang/net@a02ddfa) http/httpproxy: prioritize lowercase proxy environment variables - [`574e5eb`](golang/net@574e5eb) quic: halt conn goroutines on close when listener exits early - Additional commits viewable in [compare view](golang/net@v0.57.0...v0.58.0) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. --- You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove all of the ignore conditions of the specified dependency ```
What
Adds the view-based, zero-copy twins of the parsed transaction path, for the full-history ingestion / read use case. Each one reads directly off the generated XDR
*Viewaccessors (which alias the source buffer) and never callsUnmarshalBinary.LedgerCloseMetaViewDispatch(DispatchLedgerCloseMetaView) — version dispatch over V0/V1/V2:Header(),TxProcessing()(unifiedTxResultMetaViewiterator),Envelopes(),TxProcessingHashLedgerTransactionReaderingestTransactionEventsView+TransactionEventsFromMeta/DiagnosticEventsFromMetaLedgerTransaction.GetTransactionEvents/GetDiagnosticEventsingestTransactionView+TransactionViewByHash/TransactionViewRange(by-hash envelope pairing, V3 soroban gate)LedgerTransaction/LedgerTransactionReaderingestTransactionViewHasher+HashTransactionInEnvelopeViewHashTransactionInEnvelopenetworkLedgerCloseMetaView.LedgerCloseTimeLedgerCloseMeta.LedgerCloseTimexdrTransactionResultView.SuccessfulTransactionResult.SuccessfulxdrTransactionEventsViewmirrorsingest.TransactionEventsbut carries raw wire bytes ([][]byte/[][][]byte) instead of decoded values, and omitsDiagnosticEvents(returned separately, because the two sets gate differently — see below).Why
These are general-purpose XDR navigation primitives — turning a raw
LedgerCloseMetainto per-transaction events, hashes, and details without a full decode. They were first written inside stellar-rpc's full-history work (stellar/stellar-rpc#778), which initially concluded "nothing belongs in the SDK." This PR reverses that call: the navigation is not RPC-specific, it's the zero-copy counterpart of what the SDK already ships for the parsed path, and the import graph (xdr⊂network⊂ingest) places each piece at the layer its dependencies require. stellar-rpc full-history (stellar/stellar-rpc#778, stellar/stellar-rpc#779) becomes a thin consumer.Design notes
LedgerCloseMetaView; callers copy what they retain. The hasher reuses onesha256state + scratch buffers, so hashing allocates nothing per envelope.metaEventRawsis the one version-dispatched pass shared by both event extractors and the read path, so contract events and diagnostics can't drift on version support; a futureTransactionMetaV5 is added in exactly one switch.TransactionEventsFromMetaemitsSorobanMeta.EventswheneverSorobanMetais present (the events-index path relies on the trusted-input invariant "SorobanMeta present ⟺ soroban tx"); the read path re-applies theIsSorobanTxgate downstream, where the paired envelope is in hand — matchingGetTransactionEvents. Diagnostics are ungated, matching the standaloneGetDiagnosticEvents.TransactionMetaV0 (pre-Soroban) is treated as event-free rather than rejected, because full-history backfills from genesis.Testing
Differential tests assert the view path is wire-identical to the parsed reference (
LedgerTransactionReader,HashTransactionInEnvelope,GetTransactionEvents/GetDiagnosticEvents,TransactionResult.Successful) across:TransactionMetaV0–V4getTransactionscursor edges (start/limit slicing, past-end, negative, extreme limit)go test ./ingest/... ./network/... ./xdr/...,go vet,gofmt— green.Notes
ingest.TransactionViewis the zero-copy read-path detail; it's distinct from the parsedingest.LedgerTransaction(doc comments cross-reference).