Implement EIP-7805 (FOCIL)#8003
Conversation
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The spec evaluates the inclusion-list rule against state after all block.transactions have executed, not the parent (pre-execution) state. Checking against parent state is stricter than spec and would refuse blocks accepted by other clients. - InclusionListValidator.IsSatisfied now takes IAccountStateProvider (post-exec) - Drop the snapshot-capture / two-phase InclusionListValidation token - Collapse IBlockValidator.BeginInclusionListValidation + ValidateInclusionList into a single CheckInclusionList(processed, suggested, worldState, options) hook - BlockProcessor calls the hook once after ValidateProcessedBlock - Tests switch to IAccountStateProvider via TryGetAccount stubs and the same-nonce replacement case is inverted to match the new (spec) semantics
|
@claude review |
|
Claude finished @Marchhill's task in 5m 53s —— View job EIP-7805 (FOCIL) PR Review — Round 8Tasks:
Progress since Round 7Both Round 7 Low findings are resolved cleanly (commit
New commits reviewed
Remaining issuesMediumIL satisfaction uses post-execution state — spec citation needed (third reversal) → discussion_r3349038010 Commit If the EIP-7805 spec genuinely uses post-execution state for the appendability check, this is correct and my Rounds 2–4 analysis was wrong. Given this is the third position change on the same question, a direct spec reference (EIP-7805 §Execution Layer or execution-apis PR #609) confirming post-execution semantics is needed before merge to close the loop definitively. LowStale doc comment on
Verdict: not mergeable. The Medium finding (spec citation for post-execution IL semantics) needs to be resolved: either add a direct spec reference confirming post-execution is correct, or revert to the pre-execution approach if the spec text says otherwise. The Low (stale doc) is a one-line fix. |
|
@claude review |
|
Claude finished @Marchhill's task in 5m 9s —— View job EIP-7805 (FOCIL) PR Review — Round 9Tasks:
Progress since Round 8Both Round 8 findings are resolved:
New commits reviewed
Verdict: mergeable. All Critical, High, and Medium findings across all nine review rounds are resolved. No new issues found in the latest commits. |
|
@claude review |
|
Claude finished @Marchhill's task in 9m 29s —— View job EIP-7805 (FOCIL) PR Review — Round 10Tasks:
Progress since Round 9Round 9 reviewed up to
The Remaining issuesLow
For a well-formed IL this is harmless. For an adversarially crafted RecoverData(block.InclusionListTransactions, spec, skipErrors: true);Verdict: mergeable. All Critical, High, and Medium findings from Rounds 1–9 remain resolved. The sole remaining Low item is a one-word fix that converts an adversarial-input exception path into a clean |
The Zisk stateless guest builds with --no-pthread, so System.Threading.Tasks.Parallel isn't available. The earlier dedup that routed TryGetTransactions through TxsDecoder introduced a reference to Parallel.For (via TxsDecoder.DecodeParallel) into the stateless code path, breaking all 7 stateless EF test inputs in CI. Revert TryGetTransactions to the inline serial loop with a remarks block explaining why. TxsDecoder's parallel path stays available for host-side callers that need it (InclusionListDecoder, etc.) and ExecutionPayloadV3's IL decode still uses it, which is safe because SSZ stateless input has no InclusionListTransactions field (so that branch is skipped via the null check). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ctions The Zisk stateless guest builds with --no-pthread and a stripped BCL that lacks System.Threading.Tasks.Parallel. The earlier dedup of ExecutionPayload.TryGetTransactions onto TxsDecoder pulled Parallel.For into the stateless code path, breaking all 7 EF stateless test inputs at type-load time. Wrap TxsDecoder's parallel branch + DecodeParallel helper + Parallel using in #if !ZK_EVM so the stateless DLL only links the serial path. ZK_EVM is the project-wide preprocessor symbol set when EnableZkEvm=true (see Directory.Build.props), which the Zisk guest Makefile passes. Then re-dedup TryGetTransactions to delegate to TxsDecoder.DecodeTxs — safe in both flavors: server gets parallel for ≥16-tx blocks, stateless gets serial. Verified by inspecting the stateless-flavor Nethermind.Serialization.Rlp.dll (no Parallel references) vs the server-flavor (DecodeParallel, ParallelLoopState, etc. present). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ExecutionPayloadV3.TryGetBlock decodes IL transactions via TxsDecoder.DecodeTxs with skipErrors:true (decode only, no sender recovery). The recovery happens later in RecoverSignatures.RecoverData(Block), which was passing skipErrors=false for IL. An adversarial engine_newPayloadV6 carrying a syntactically-valid IL tx with an invalid signature would surface as a JSON-RPC exception instead of cleanly leaving SenderAddress=null and letting the IL validator treat it as not-appendable. Pass skipErrors:true for the IL recovery only — block.Transactions stays default (bad sig in a block tx still invalidates the block, as expected). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The earlier wiring had three #if !ZK_EVM blocks (using, threshold + dispatch, DecodeParallel method). Restructure so: - DecodeTxs becomes a 4-line dispatcher: TryDecodeParallel ?? DecodeSequential - DecodeSequential is named & unconditional - A single #if/#else block at the bottom holds either the real TryDecodeParallel (with embedded threshold check + Parallel.For body) or a stub returning false - using System.Threading.Tasks dropped; Parallel.For fully-qualified at its one call site, removing the need for a conditional using directive Verified the stateless-flavor Nethermind.Serialization.Rlp.dll has zero System.Threading.Tasks references (only the stub method name 'TryDecodeParallel' appears as a string); server-flavor has DecodeParallel, ParallelLoopState, System.Threading.Tasks.Parallel, ParallelLoopResult as expected. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
@claude review |
|
Claude finished @Marchhill's task in 3m 54s —— View job EIP-7805 (FOCIL) PR Review — Round 11Tasks:
Progress since Round 10The Round 10 Low finding has been resolved cleanly (commit
New commits reviewed
The Verdict: mergeable. All Critical, High, and Medium findings across all 11 review rounds are resolved. No new issues found in the latest commits. |
Changes
engine_getInclusionListPayloadAttributesandnewPayloadparametersTypes of changes
What types of changes does your code introduce?
Testing
Requires testing
If yes, did you write tests?
Documentation
Requires documentation update
Requires explanation in Release Notes