fix(node): fix index misalignment in findLeavesIndexes#21327
fix(node): fix index misalignment in findLeavesIndexes#21327spalladino merged 2 commits intomerge-train/spartanfrom
Conversation
The method filtered undefined entries from maybeIndices to get block numbers, but then used the original maybeIndices index to look up into the shorter blockNumbers array, causing wrong results whenever there were undefined gaps in the results. Fix by using Maps to associate leaf indices to block numbers and block numbers to block hashes, avoiding array index misalignment entirely. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
nventuro
left a comment
There was a problem hiding this comment.
The fix looks correct. Not a huge fan of the style of testing with lots of mocked details, but also don't know what sort of infra you have for these tests.
| const blockNumber = indexToBlockNumber.get(index)!; | ||
| const blockHash = blockNumberToHash.get(blockNumber)!; |
There was a problem hiding this comment.
Not sure what your policiy typically is re. defensive programming. Here the value being undefined would mean that there's a bug in the construction of these maps above (i.e. exactly the kind of bug this PR is fixing) - you may want to fail loudly eg throw new Error("call 911 this should never happen")
| }); | ||
| }); | ||
|
|
||
| describe('findLeavesIndexes', () => { |
There was a problem hiding this comment.
There were NO unit tests?!
There was a problem hiding this comment.
Not a single one 🥳
| // This is the scenario that triggered the index misalignment bug: | ||
| // maybeIndices has undefined gaps, so the filtered indices array is shorter | ||
| // than maybeIndices. The block numbers must be matched to the correct positions. |
There was a problem hiding this comment.
I typically do not include these historical comments
|
@nventuro I've addressed all comments |
## Summary - Fixes a bug in `AztecNodeService.findLeavesIndexes` where the block number lookup used the wrong array index whenever `findLeafIndices` returned `undefined` gaps, causing misaligned results (wrong block numbers/hashes mapped to wrong leaves). - Replaces array-index-based lookups with `Map`s (`indexToBlockNumber`, `blockNumberToHash`) to avoid the misalignment entirely. - Adds 7 unit tests covering: all found, none found, mixed found/not-found (the bug case), multiple leaves in same block, empty input, and error cases. ## Test plan - [x] Unit tests pass: `yarn workspace @aztec/aztec-node test src/aztec-node/server.test.ts -t 'findLeavesIndexes'` - [x] Build passes: `yarn build` - [x] Lint passes: `yarn lint aztec-node` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
✅ Successfully backported to backport-to-v4-staging #21355. |
BEGIN_COMMIT_OVERRIDE chore: chonk proof compression poc (#20645) feat: Update L1 to L2 message APIs (#20913) fix: adapt chonk proof compression for v4 Translator layout (#21067) fix: omit bigint priceBumpPercentage from IPC config in testbench worker (#21086) feat: standby mode for prover broker (#21098) fix(p2p): remove default block handler in favor of block handler (#21105) chore: prepare barretenberg-rs for crates.io publishing (#20496) feat: reenable function selectors + additional validation in public setup allowlist (backport #20909, #21122) (#21129) chore: remove stale aes comments (#21133) chore: remove auto-tag job (#21127) feat: calldata length validation of public setup function allowlist (#21139) feat: run AVM NAPI simulations on dedicated threads instead of libuv pool (#21138) feat: Remove non-protocol contracts from public setup allowlist (#21154) feat!: Expose offchain effects when simulating/sending txs (backport #20563) (#21110) chore: bump minor version (#21171) chore: backport #21161 (tally slashing pruning improvements) to v4 (#21166) chore: More updated Alpha configuration (backport #21155) (#21165) fix(p2p): report most severe failure in runValidations (#21185) feat: add ergonomic conversions for Noir's `Option<T>` (#21107) docs: clarifying Noir fields vs struct fields in event metadata (#21172) fix: bump lighthouse consensus client v7.1.0 -> v8.0.1 (#21170) fix: update dependencies (#20997) chore: New alpha-net environment (#20800) (#21202) chore: code decuplication + refactor (public setup allowlist) (#21200) feat: mask all ciphertext fields with Poseidon2-derived values (backport #21009) (#21140) chore: disable sponsored FPC in testnet (#21235) feat!: exposing pub event pagination on wallet (#21197) refactor(pxe): narrow tryGetPublicKeysAndPartialAddress return type (backport #21208) (#21236) feat: orchestrator enqueues via serial queue (#21247) feat: rollup mana limit gas validation (#21219) chore: deploy SPONSORED_FPC in test networks (#21254) fix(sequencer): fix log when not enough txs (#21297) fix: Simulate gas in n tps test. Set min txs per block to 1 (backport #21312) (#21329) fix(log): do not log validation error if unregistered handler (#21111) fix(node): fix index misalignment in findLeavesIndexes (#21327) fix: limit parallel blocks in prover to max AVM parallel simulations (#21320) fix: use native sha256 to speed up proving job id generation (#21292) fix(validator): wait for l1 sync before processing block proposals (#21336) fix(txpool): cap priority fee with max fees when computing priority (#21279) chore: reduce severity of errors due to HA node not acquiring signature (#21311) fix: (A-643) add buffer to maxFeePerBlobGas for gas estimation and fix bump loop truncation (#21323) END_COMMIT_OVERRIDE
BEGIN_COMMIT_OVERRIDE fix: (A-623) increase committee timeout in scenario smoke test (#21193) feat: orchestrator enqueues via serial queue (#21247) feat: rollup mana limit gas validation (#21219) fix: make e2e HA test more deterministic (#21199) chore: fix chonk_browser lint warning (#21265) chore: deploy SPONSORED_FPC in test networks (#21254) fix: (A-635) e2e bot flake on nonce mismatch (#21288) chore: deflake duplicate attestations and proposals slash tests (#21294) fix(sequencer): fix log when not enough txs (#21297) chore: send env var to pods (#21307) fix: Simulate gas in n tps test. Set min txs per block to 1 (#21312) fix: update dependabot dependencies (#21238) test: run nightly bench of block capacity (#20726) fix: update block_capacity test to use new send() result types (#21345) fix(node): fix index misalignment in findLeavesIndexes (#21327) fix(log): do not log validation error if unregistered handler (#21111) fix: limit parallel blocks in prover to max AVM parallel simulations (#21320) fix: use native sha256 to speed up proving job id generation (#21292) chore: remove v4-devnet-1 (#21044) fix(validator): wait for l1 sync before processing block proposals (#21336) fix(txpool): cap priority fee with max fees when computing priority (#21279) chore: Properly compute finalized block (#21156) fix: remove extra argument in KVArchiverDataStore constructor call (#21361) chore: revert l2 slot time 72 -> 36 on scenario network (#21291) fix(archiver): do not error if proposed block matches checkpointed (#21367) fix(claude): rule to not append echo exit (#21368) chore: reduce severity of errors due to HA node not acquiring signature (#21311) fix: make reqresp batch retry test deterministic (#21322) fix: (A-643) add buffer to maxFeePerBlobGas for gas estimation and fix bump loop truncation (#21323) fix(e2e): use L2 priority fee in deploy_method same-block test (#21373) fix: reqresp flake & add logging (#21334) END_COMMIT_OVERRIDE
Summary
AztecNodeService.findLeavesIndexeswhere the block number lookup used the wrong array index wheneverfindLeafIndicesreturnedundefinedgaps, causing misaligned results (wrong block numbers/hashes mapped to wrong leaves).Maps (indexToBlockNumber,blockNumberToHash) to avoid the misalignment entirely.Test plan
yarn workspace @aztec/aztec-node test src/aztec-node/server.test.ts -t 'findLeavesIndexes'yarn buildyarn lint aztec-node🤖 Generated with Claude Code