fix: make world-state hash queries reorg-aware to close getWorldState race#23677
Merged
PhilWindle merged 3 commits intoMay 29, 2026
Merged
Conversation
PhilWindle
approved these changes
May 29, 2026
This was referenced May 29, 2026
danielntmd
pushed a commit
to danielntmd/aztec-packages
that referenced
this pull request
Jun 4, 2026
BEGIN_COMMIT_OVERRIDE test(e2e): unskip pipelining related e2e tests (AztecProtocol#23642) fix(archiver): prune blocks without proposed checkpoint by end of build slot (AztecProtocol#23606) test: migrate benchmarks to pipelining setup (AztecProtocol#23647) fix(p2p): fall back to archiver in BLOCK_TXS response validation (AztecProtocol#23624) docs(slashing): align operator and slasher docs with AZIP-7 (AztecProtocol#23494) fix(p2p): do not penalize peers that signal a missing block with Fr.ZERO (AztecProtocol#23672) chore: adjust metrics deployment (AztecProtocol#23676) fix(cheat-codes): warpL2TimeAtLeastBy advances relative to leading clock (AztecProtocol#23675) chore: tighten node pool sizes (AztecProtocol#23678) chore: remove archival nodes (AztecProtocol#23630) chore: merge blob sink duties into RPC node (AztecProtocol#23631) fix: sync avm-transpiler Cargo.lock with noir submodule (AztecProtocol#23683) fix(spartan): set validator lag env vars in tps-scenario (AztecProtocol#23684) fix: make world-state hash queries reorg-aware to close getWorldState race (AztecProtocol#23677) fix: pin noir submodule to next's version on merge-train/spartan (AztecProtocol#23690) fix: ensure image ref is used by bench runner (AztecProtocol#23682) fix(ci): retry aztec-nr nargo dependency clone on transient network flake (AztecProtocol#23653) chore: run one-off jobs on network nodes (AztecProtocol#23701) fix: simulate proposals inside target slot (AztecProtocol#23692) chore: smaller eth-devnet (AztecProtocol#23704) chore: enable testnet autoscaling (AztecProtocol#23705) feat(api)!: redesign node log retrieval API around tag-based queries (AztecProtocol#23625) fix(sequencer): set own proposed checkpoint locally instead of via p2p loopback (AztecProtocol#23659) END_COMMIT_OVERRIDE
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
AztecNodeService.getWorldState({ hash })can intermittently throweven when no reorg happened. This surfaced as a flake in oxide /
e2e_frozen_notes_refunde2e tests proving a tx that reads existing notes (private-kernel reset resolving a read request anchored on an early block).Root cause
getWorldStatedid its world-state sync via#syncWorldState(), which only synced to the archiver's latest height and ignored any requested block hash. It then:getSnapshot(N)and read theARCHIVEleaf at indexNto double-check the hash.The synchronizer reports
syncedTo >= Nas soon as the height advances, but the archive-tree commit for blockNmay not yet be visible in the snapshot view. A snapshot taken in that window has populated note/nullifier trees but a half-written archive tree, sogetLeafValue(ARCHIVE, N)returnsundefinedand the double-check throws. The sync-status height and the archive-tree write were not barriered against each other.Fix
Make the hash-anchored path reorg-aware, as the existing synchronizer plumbing already supports (
syncImmediate(targetBlockNumber, blockHash)):(blockNumber, hash).WorldStateSynchronizer.syncImmediatereads the committedARCHIVEleaf for that block; if it is missing or mismatched it forces ablockStream.sync()and re-checks, only throwing on a genuine reorg. This barriers on the archive-tree commit actually landing, closing the race window, and turns real reorgs into a clearblock_hash_mismatchinstead of a confusing snapshot error.Block-number / tag queries are unchanged: they still sync to latest height with no hash.
The existing snapshot double-check is kept as a backstop.
Tests
Added unit tests in
server.test.tsasserting that a hash-anchored query forwards the resolved(blockNumber, hash)tosyncImmediate, and that block-number queries still sync to latest height with no hash. Fullyarn-projectinstall/bootstrap (which builds the barretenberg/noir portal packages) was not available in this session, so the suite was not executed here — worth a CI run before merge.Created by claudebox · group:
slackbot