Pipeline giga static block processing#3495
Conversation
PR SummaryHigh Risk Overview Async block jobs start from Execution paths now take optional precomputed static results: synchronous giga and OCC giga short-circuit on static failures, call Tests cover concurrent static prep, multi-height pipeline retention, and same-height job caps; giga executor Reviewed by Cursor Bugbot for commit fd54eac. Bugbot is set up for automated code reviews on this repo. Configure here. |
|
The latest Buf updates on your PR. Results from workflow Buf / buf (pull_request).
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #3495 +/- ##
==========================================
- Coverage 59.16% 59.05% -0.12%
==========================================
Files 2262 2187 -75
Lines 187009 181590 -5419
==========================================
- Hits 110643 107237 -3406
+ Misses 66430 64750 -1680
+ Partials 9936 9603 -333
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 5d8b337. Configure here.
5d8b337 to
87a27a2
Compare
There was a problem hiding this comment.
Cleanly splits state-free EVM tx preparation (envelope checks + sender recovery) from stateful giga execution and pipelines it across blocks via a deduplicated (height,hash) job map; callers, imports, panic recovery, and tests are all in order. No blockers found; a few non-blocking observations.
Findings: 0 blocking | 6 non-blocking | 2 posted inline
Blockers
- None at the file/PR level.
Non-blocking
- Determinism dependency worth a code comment: the static result is started in ProcessProposalHandler (proposal ctx) but deduped-and-consumed in ProcessBlock (which may run under the FinalizeBlock deliver ctx). This is consensus-safe only because prepareGigaStaticTx depends solely on header-derivable values (ctx.BlockHeight/BlockTime/ConsensusParams, chainID, tx bytes) and never touches the KV store. A note on prepareGigaStaticTx / StartGigaStaticBlockProcessing stating 'must remain strictly state-free' would protect against a future change to EvmStatelessChecks or GetVersion (signer-version selection) silently introducing a state dependency and breaking consensus across the two contexts.
- Second-opinion passes produced no material findings: codex-review.md reports 'No material findings' (and notes it could not run
go test ./appdue to a Go 1.24 vs required 1.25.6 mismatch); cursor-review.md is empty. - Minor: in ProcessTxsSynchronousGiga the
staticTx.err != nil('[BUG]') branch calls recordGigaTxProcessed() while the analogous downstream execErr '[BUG]' branch does not — a trivial metrics inconsistency on an unreachable bug path. - Consider asserting
len(staticTxs) == len(typedTxs)/len(txs)more defensively at the entry of ProcessTxsSynchronousGiga; today a short non-nil slice that happens to match length but is internally misaligned would index silently, though current callers always pass either nil or a full-length slice. - 2 suggestion(s)/nit(s) flagged inline on specific lines.
| recordGigaTxProcessed() | ||
| continue | ||
| } | ||
| if staticTx != nil && staticTx.err != nil { |
There was a problem hiding this comment.
[nit] Nit: this [BUG] branch calls recordGigaTxProcessed() but the analogous downstream execErr [BUG] branch (the txResults[i] = {Code:1, Log:"[BUG] giga executor error..."} path) does not record the metric. Harmless and on an unreachable path, but worth making the two [BUG] paths consistent.
| Height: req.Header.Height, | ||
| Time: req.Header.Time, | ||
| } | ||
| app.StartGigaStaticBlockProcessing(ctx, req.Txs, bpreq, typedTxs) |
There was a problem hiding this comment.
[suggestion] Consider a short comment here noting that the static work started with the proposal context is later deduped-and-consumed by ProcessBlock (potentially under the finalize-block context) via the (height,hash) key, and that this is only consensus-safe because prepareGigaStaticTx depends solely on header-derived values (height/time/consensus-params/chainID/tx bytes) and never reads chain state. It guards future maintainers against introducing a true state dependency in EvmStatelessChecks/GetVersion that would diverge between the two contexts.

Summary
Tests
go test ./appmake giga-integration-testmake giga-mixed-integration-testmake autobahn-integration-testmake parquet-integration-test