Skip to content

fix: TxEffect deserializability - #25109

Merged
mverzilli merged 1 commit into
merge-train/fairies-v5from
martin/fix-tx-effect-deserialization
Aug 5, 2026
Merged

mverzilli merged 1 commit into
merge-train/fairies-v5from
martin/fix-tx-effect-deserialization

Conversation

@mverzilli

Copy link
Copy Markdown
Contributor

The batch oracle aztec_utl_getTxEffects, added by #24636 , returned a value that no Noir contract could read.

Its Noir wrapper get_tx_effects handed back an EphemeralArray<Option<TxEffect>>, but every method that reads an element out of that array requires the element type to implement Deserialize, and TxEffect did not . A contract can obtain the array and ask for its length; any attempt to read an element fails to compile.

This PR tags TxEffect as Deserializable, which makes the oracle usable.

@mverzilli
mverzilli requested review from nchamo and nventuro August 5, 2026 13:15
@mverzilli
mverzilli requested a review from LeilaWang as a code owner August 5, 2026 13:15
@mverzilli mverzilli added the port-to-next Forward-port this merged PR into next label Aug 5, 2026
@mverzilli
mverzilli enabled auto-merge (squash) August 5, 2026 13:31
@mverzilli
mverzilli merged commit 358245c into merge-train/fairies-v5 Aug 5, 2026
22 of 26 checks passed
@mverzilli
mverzilli deleted the martin/fix-tx-effect-deserialization branch August 5, 2026 13:47
@AztecBot

AztecBot commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

❌ Failed to cherry-pick to next due to conflicts. (🤖) View backport run.

aminsammara added a commit that referenced this pull request Aug 17, 2026
Promotes `v5-next` onto `v5` for the **v5.2.0** release.

Frozen at `ee5d2d367e` — the `v5-next` tip at cut time. Both
`merge-train/spartan-v5` and `merge-train/fairies-v5` are drained to
that same commit, so nothing staged is left behind.

### Testnet validation

This branch was cut at `a4db216abf`, which is byte-identical to the
`v5.2.0-nightly.20260815` tag — same commit, same tree
(`0b22572eace2419ede6bbab173514d6965d4e0d0`). That nightly's CI3 run is
green, its artifacts are published to npm and Docker Hub, and it has
been **running healthily on testnet since 2026-08-15**:

| Component | Image / reported version |
|---|---|
| validators, prover node, prover broker, prover agents (`testnet` ns) |
`aztecprotocol/aztec:5.2.0-nightly.20260815` |
| `v5.testnet.rpc.aztec-labs.com` | `nodeVersion=5.2.0-nightly.20260815`
|
| `canonical.testnet.rpc.aztec-labs.com` |
`nodeVersion=5.2.0-nightly.20260815` |

Chain advancing normally, no prunes or reorgs, no WARN/ERROR across node
pods since rollout.

The branch has since been fast-forwarded to `ee5d2d367e` to pick up
#25242 (configurable RPC server HTTP timeouts and CORS allowed-headers).
That is the only delta from the soaked tree — 8 files, +131/−10, no
nightly covers it yet. Its config defaults were checked against Node's
built-ins (`keepAliveTimeout` 5000 ms, `headersTimeout` 60000 ms) and
match exactly, and the CORS default path resolves to the same `cors()`
call as before, so a node that sets none of the new env vars behaves
identically. It touches no circuits, protocol contracts, or generated
constants.

### Manifest

`.release-please-manifest.json` reads `5.2.0` on this branch, which is
the released version — correct as-is, no change needed in this PR.
`v5-next` moves to `5.3.0` separately in #25240; this branch is frozen
and cannot pick that up, so the two can merge in either order.

`v5` is a strict ancestor of `v5-next` this cycle, so there was no
manifest conflict to pre-resolve.

### Scope

139 commits (86 non-merge, 23 PR-level) spanning 2026-07-14 to
2026-08-17.

| Area | Theme |
|---|---|
| `prover-node` / `prover-client` | Epoch-proving robustness:
retry-to-converge with failure declared only at submission-window
expiry, ticker-driven expiry, per-checkpoint post-mortem upload,
checkpoint-only re-proving, prune-induced fault handling (#24678,
#24982, #24983, #24990, #25027) |
| `pxe` | Sync performance: hash-pinned node read cache (#24969),
anchor-bounded tag log caching (#25074), note/event validation from
cached tx data (#25076), constrained tag sync (#24275), sender tagging
finalization from log blocks (#25045) |
| `p2p` / `validator-client` | Gossip tx validation no longer stalls
behind tx-pool finalization (#25148); startup fails when p2p fails to
start (#25177); slashing/proposing/health/`sendTx` gated on p2p
connectivity (#25185); duplicate time-sensitive proposal validation
removed (#25207); `ValidatedProposal` branding (#25222) |
| `ethereum` / `aztec-node` | L1 watchers poll `getLogs` instead of
`eth_newFilter` (#25176); block stream sync no longer resolves against
an earlier pass (#25206) |
| `stdlib` / `foundation` | Deserialization bounds hardening (#25026,
#25028, #25029, #25109); checkpoint block-shape and block-count
validation (#25229); JSON-RPC cookies (#25231) |
| `archiver` | Removed-block cleanup and ownership-checked tx-effect
deletes (#24765); L2→L1 witness from a single store snapshot (#24754) |
| `aztec` | Declarative deployment framework at `@aztec/aztec/deploy`
(#24685) |
| `slasher` | Own-validator slash-target warnings and metrics (#25058) |
| telemetry | JSON-RPC metrics (#25159) |
| JSON-RPC server | Configurable HTTP keep-alive / headers timeouts and
CORS allowed-headers, defaults preserving current behaviour (#25242) |
| toolchain | Noir bumped to `v1.0.0-beta.25` (#24907) |

**One breaking change**, inherited from the Noir bump: note types
declared directly inside a `contract` module must now be `pub`.
Everything else is additive or internal.

### Protocol constants

Built from source and compared against `v5` — a cache-free rebuild of
every protocol circuit with each ref's own nargo and bb, then
regeneration of `vk_tree.ts` and `protocol_contract_data.ts`:

- `vkTreeRoot` =
`0x2b3b6ea4412b9c8f6457a37f91a2870306f8641e07e16a49b68bda6f8bc02892` —
unchanged from v5.1.0
- `protocolContractsHash` =
`0x2c075866eafc88a1f6f9addc7e337c6e64e45d1cb7fd7c0d612ebcec72aab2ca` —
unchanged from v5.1.0

The Noir beta.24 → beta.25 bump does not reach the circuits: the release
build consumes the committed `pinned-build.tar.gz`, which is
bit-identical between v5.1.0 and this commit (blob `3bedcb1fd1…`), so
the protocol-circuit bytecode is frozen rather than recompiled. The 47
verification keys were recomputed locally from that pinned bytecode with
the cache disabled, and all 47 `check_pinned_vk` checks passed.
`protocolContractsHash` is likewise backed by the new
`pinned-protocol-contracts.tar.gz`, whose three artifacts were
byte-compared against the build. Both values were also confirmed inside
the published `@aztec/protocol-contracts` and
`@aztec/noir-protocol-circuits-types` packages for
`5.2.0-nightly.20260815`.

That makes v5.2.0 a drop-in upgrade against the current rollup rather
than a coordinated one.

✅ **Gate re-run against `ee5d2d367e` (the current head) and passed** —
both values reproduced exactly from a build at this commit, with
`vkTreeRoot` numerically evaluated rather than inferred.
`29556326ce..ee5d2d3` touches no `noir-projects/**`,
`l1-contracts/src/**`, `ConstantsGen.sol`, `constants.gen.ts` or
`constants.nr`. Scope of the check: it verifies that the pinned circuit
bytecode plus locally recomputed VKs agree with the pin — not that a
from-source recompile reproduces v5.1.0's bytecode.

<details>
<summary>Commits added after the original constants check at
2955632</summary>

`#25207` `#25222` `#25206` `#25185` `#25176` `#25163` `#25229` `#25159`
`#25162` `#25231` `#25224` `#25228` `#25230` `#25242` plus their merge
commits.
</details>

### Known gap

Migration notes carry entries under `## TBD` that arrived with the docs
baseline backport (#25017) and describe `next`-line changes not present
on the v5 line — protocol contracts removed from
`@aztec/noir-contracts.js`, and the `at(wallet)` → `withWallet(wallet)`
deprecation. Neither exists on this branch. There is also no `## 5.1.0`
heading, and the entries that ship in v5.2.0 sit under `## TBD` rather
than a version heading.

This ships in the release docs, so it is worth correcting on `v5-next`
and backporting to `v5` before the tag, rather than after.
mverzilli added a commit to aztec-labs-eng/aztec-node that referenced this pull request Aug 26, 2026
…ec-packages#25109) (#86)

* fix: port TxEffect deserializability test coverage (AztecProtocol/aztec-packages#25109)

Ports the labs half of the original PR: the TxEffectOracleTest contract gains a
batch get_tx_effects_hashes utility and a TXE test checking batch results match
the singular oracle. The Deserialize derive on TxEffect itself lives in
protocol_types, consumed from aztec-packages at a pinned nightly tag; this
compiles once the pin advances past a tag containing that derive.

* chore: bump toolchain pins to 6.0.0-nightly.20260826

Advances the aztec-packages pin past AztecProtocol/aztec-packages#25295 so
protocol_types carries the Deserialize derive on TxEffect that the
tx_effect_oracle_test_contract batch oracle test requires. Noir pin is
unchanged: the noir submodule is identical between the two nightlies.
loglapa pushed a commit to loglapa/aztec-packages that referenced this pull request Sep 3, 2026
…AztecProtocol#25295)

Forward-ports AztecProtocol#25109 to `next`.

The batch oracle's Noir wrapper `get_tx_effects` returns an
`EphemeralArray<Option<TxEffect>>`, but reading an element out of an
`EphemeralArray` requires the element type to implement `Deserialize`,
which `TxEffect` does not — so a contract can obtain the array and ask
for its length, but any attempt to read an element fails to compile.

AztecProtocol#25109 fixed this on the v5 line (shipped in v5.2.0), but the fnd/labs
split (AztecProtocol#25007) copied `tx_effect.nr` to its new location on `next`
before the fix landed there, so `next` never received it. This applies
the same change; the resulting file is byte-identical to the one shipped
in v5.2.0.

The contract-side test coverage from the original PR is ported to the
labs repo (aztec-labs-eng/aztec-node), where it is blocked on a nightly
tag containing this change.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

port-to-next Forward-port this merged PR into next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants