Evaluated on: · Spec revision: 2023-06-29 · 28cbb0162f
Scope at the cutoff. This revision of EIP-7002 adds a stateful native precompile at an address not yet chosen (TBD). The precompile accepts a 48-byte validator_pubkey and a value-bearing CALL, checks an EIP-1559/4844-style exponential exit fee, increments a per-block exit count and appends (msg.sender, pubkey) to a storage queue. It then returns any overpayment through a CALL with a 2300-gas stipend. Starting at FORK_TIMESTAMP, the block body gets a new list of RLP-encoded exits and the header gets a new exits_root trie commitment. Block validity requires that the body exits equal the first min(queue length, 16) queue entries. End-of-block processing advances or resets the queue pointers, updates excess_exits against a target of 2 and resets the exit count. Gas cost and address are TBD, and the EL-side Engine API changes are only sketched through the consensus-layer ExecutionPayload.
- Evaluator
- LLMChecklist v3
- Confidence
- Medium
- Under-specified at assessment cutoff
- Yes — 11 criteria affected
- Plausible range
- 26–43 (High)
- Assessment cutoff
- 2024-01-18 · EIP revision
28cbb0162f(2023-06-29)
Score bands · Checklist revision 3
- Low <12
- Medium 12–22
- High ≥23
28 criteria scored 0–3 (4 in exceptional cases; cross-EIP interactions is uncapped); nominal maximum 84.
Complexity profile
Each segment is one criterion's contribution to the LLM total. Hover or focus a segment for its score and rationale.
Top complexity drivers
- New block / header fields3
- Encoding changes (RLP/SSZ)3
- Block syncing changes3
- Edge/boundary conditions3
Under-specified at assessment cutoff: Yes
The EIP text available at the assessment cutoff left material behavior unresolved. The affected criteria and the plausible total range record that uncertainty.
Why: Gas cost and address are TBD. The queue storage layout contradicts itself: a stride of 3 when writing versus 2 when reading, and pubkey reconstruction reads the wrong slots. The return_excess_payment call has the wrong arity. Failure semantics are unspecified for wrong input length, static/delegate calls, insufficient gas and a failed excess return, as are return data, address storage alignment and whether the precompile account must exist. Engine API changes are only implied by the CL sketch.
Plausible total
26–43
recorded score 31 · plausible tiers High
Affected criteria (11)
- Added precompiles (1)
- EVM Gas rule changes (0)
- State-access ordering within opcode execution (2)
- New fork activation mechanism (0)
- Engine API changes (2)
- Transition-tool interface changes (2)
- Patterns affecting pre-existing tests (1)
- New test-framework primitives (2)
- Security risks (2)
- Performance risks (2)
- Cross-EIP interactions (1)
Unresolved questions at the cutoff (8)
- Is the queue slot stride 3 (as written in insert_exit_to_queue) or 2 (as read in block validity), and how is the 48-byte pubkey read back?
- How is the 20-byte source_address aligned within its 32-byte storage slot?
- What is the precompile's gas cost, and is it fixed or dynamic?
- What happens on input that is not exactly 48 bytes, under STATICCALL, DELEGATECALL or CALLCODE, or when the fee is insufficient (revert versus consuming all gas)?
- Does a failed excess-return CALL revert the whole exit, including queue and count writes?
- Must the precompile account be created or kept non-empty at activation, and does end-of-block processing touch it?
- What Engine API methods and fields carry exits, and is exits_root included in the payload?
- What return data, if any, does the precompile produce?
Notable ambiguities noted by the assessor (7)
- The queue stride differs between insertion (*3) and validation (*2), and the pubkey reconstruction concatenates slot+1 four times.
- trigger_exit calls return_excess_payment(msg.value), but the helper takes (fee_sent, source_address).
- The exit fee compares msg.value against MIN_EXIT_FEE=1 with no units stated (presumably wei).
- The rationale refers to the 'blob gas price', apparently carried over from EIP-4844.
- excess_exits is updated from exit_count (calls made this block), not from the number of exits dequeued.
- The relative order of the end-of-block update versus withdrawal processing is unspecified.
- The supplied EIP-4788 revision describes a stateful precompile, which is the only evidence of how such a precompile behaves in the baseline.
Criterion breakdown
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| New block / header fields | 3 | The execution header gains exits_root and the block body gains an exits list. |
Confidence: High |
| Encoding changes (RLP/SSZ) | 3 | The block body RLP gains an exits list of a new exit RLP structure, and the header gains exits_root. Per the CL sketch, the ExecutionPayload SSZ also gains an exits list. |
Confidence: High |
| Block syncing changes | 3 | Several rules change: decoding of the new body list and header field, the exits_root consistency check, which depends on the body, and the equality with the state-derived queue. The latter two are complex, so this is level 3. |
Confidence: High |
| Edge/boundary conditions | 3 | Several boundary-sensitive mechanisms are introduced: the fee threshold, the 16-exit dequeue cap, the target-2 excess update with its zero floor, the 48-byte input, the pointer reset on an empty queue, and the excess return (zero versus positive, and the stipend limit). These form an elevated matrix. Exits per block (versus target and max), the backlog carried across blocks, and the pointer-reset condition combine to determine body contents, pointer values and later fees. excess_exits counts calls while dequeue is capped, so the dimensions cannot be tested independently. |
Confidence: High |
| State-access ordering within opcode executionUnder-specified | 2 | The precompile is a new state-accessing operation. It reads and writes four or more storage slots, transfers value and makes a nested call to the caller. It therefore needs an ordering rule covering gas charging versus storage writes, out-of-gas before or after writes, and cold/warm status of its slots and the callee. No existing opcode's own ordering changes, so this is level 2 rather than level 3. |
Confidence: Low Uncertainty: The template excludes precompile internals from instruction ordering. If the stateful precompile is not treated as a 'new state-accessing operation', this would be 0. |
| Engine API changesUnder-specified | 2 | The ExecutionPayload carried over the Engine API must gain an exits field containing source_address and validator_pubkey. This likely requires new versioned payload methods. The target does not specify Engine API methods, so this is scored as an endpoint change with one field change. |
Confidence: Low Uncertainty: No Engine API text is supplied. The range is 1 (field only) to 3 (new methods plus an exits_root or other fields). |
| Transition-tool interface changesUnder-specified | 2 | Several output fields are needed: the exits list, with source_address and validator_pubkey entries, and exits_root. The exchange sequence stays the same, since end-of-block processing is internal to the tool, so no new mechanism is counted. |
Confidence: Medium Uncertainty: No transition-tool specification was supplied. If exits must be passed in for validation-style runs, the interface could need a new mechanism (level 3). |
| New invariant on pre-existing tests | 2 | All post-fork blockchain tests must produce and check exits_root (the empty-list root) and the exits body list, which is a new block commitment. No evidence requires pre-fork vectors to be re-derived, so this is level 2. |
Confidence: High |
| New test-framework primitivesUnder-specified | 2 | The test suite needs new abstractions: an exit-operation type in the block-body model, an expectation for per-block dequeued exits and queue state, and a fee-calculation helper for constructing calls with value. The shared block and header representation must carry exits and exits_root. This is comparable to adding any body or header list field and does not clearly change how other families are built, so it stays at level 2. |
Confidence: Medium Uncertainty: If the shared block model change counts as altering construction of all blockchain families, this could be level 3. |
| Security risksUnder-specified | 2 | The EL now produces authorization data, source_address, that the CL trusts to authorize exits. Correct attribution must hold under CALL, DELEGATECALL, CALLCODE and STATICCALL. Other EL-side boundaries are reentrancy through the excess-return call, fee bypass, rollback of queue state on revert, and body-versus-queue consistency. This is a bounded EL-to-CL interaction that needs targeted integration and fuzzing (level 2). |
Confidence: Medium Uncertainty: If the move of exit authorization from the BLS key to EL withdrawal credentials is treated as a shared invariant across multiple EL components, this could be level 3. |
| Performance risksUnder-specified | 2 | Targeted integrated benchmarks are needed for a bounded interaction. The cost of a native precompile doing four SSTOREs plus a value CALL must be measured to set its price. End-of-block dequeue processing and queue growth under maximum-call blocks also need validation. |
Confidence: Medium Uncertainty: The gas cost is TBD, so the workload bound cannot be fixed yet (range 1–2). |
| Unspecified behavior requiring cross-client consensus | 2 | These are localized but competing outcomes and contradictions in the precompile's storage layout and queue-reading rules, plus unspecified failure semantics: wrong input length, static/delegate calls, whether a failed excess return reverts the exit, and return data. All are consensus-visible through state roots and block body contents and need agreement before expected results can be fixed. They are confined to the new mechanism rather than requiring re-baselining across families, so this is level 2. |
Confidence: Medium |
| Added precompilesUnder-specified | 1 | One precompile is added at one (TBD) address, with a fixed 48-byte input and an intended constant gas cost. That meets the template's definition of simple, which gives level 1 even though the precompile is stateful, accepts value and makes a nested call. |
Confidence: Medium Uncertainty: Gas is TBD. If it becomes dynamic, for example from SSTORE or warm/cold pricing, the precompile is complex (level 2). |
| Patterns affecting pre-existing testsUnder-specified | 1 | Baseline tests that call or inspect the newly designated address (empty-account or non-precompile behavior) would change. That rework is confined to particular address cases. With no exits, end-of-block writes store zeros, so ordinary state expectations should not change. |
Confidence: Medium Uncertainty: It is unspecified whether the precompile account must exist in state. If end-of-block processing creates or touches it, every post-fork state root changes (up to level 2). |
| Cross-EIP interactionsUnder-specified | 1 | Only local compatibility checks are needed. The exit fee must be shown to be separate from EIP-1559 gas payment and refunds. exits_root must be appended after the Cancun header fields, including EIP-4788's parent_beacon_block_root, and both stateful system writes must coexist in the same block. The target's behavior can otherwise be tested on its own. |
Confidence: Medium Uncertainty: Interactions without an EIP number (warm precompile address and storage, static-call restrictions, empty-account touching, body ordering after withdrawals) could need coordinated cases, which would raise this to level 2. Interacting EIPs: EIP-1559, EIP-4788 |
Show 13 zero-score criteria
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| Added opcodes | 0 | No new opcode. |
|
| Modified opcodes | 0 | Callee behavior changes, but no instruction's semantics change. |
|
| Modified precompiles | 0 | No change to existing precompiles. |
|
| Added system contracts | 0 | No EVM system contract is introduced. The stateful precompile is assessed under +PC. |
|
| Modified system contracts | 0 | No existing system contract's rules or surrounding behavior change. |
|
| EVM Gas rule changesUnder-specified | 0 | No execution-gas charging, metering or settlement rule is actually specified. The exit fee is paid in ETH through msg.value, not gas, and the precompile's own gas schedule (TBD) belongs under +PC. How the nested 2300-stipend CALL inside a native precompile is metered is unresolved, so it is recorded as under-specified rather than scored. |
Uncertainty: If the final cost charges the nested stipend CALL or the SSTOREs dynamically, a new accounting mechanism would be introduced (level 2). |
| Blob gas accounting changes | 0 | Blob-gas charging, pricing and limits are unchanged. |
|
| State gas accounting changes | 0 | No state-gas accounting mechanism is introduced or changed. |
|
| New EVM gas refund | 0 | No new gas refund mechanism is introduced. |
|
| New transaction types | 0 | No new transaction type. |
|
| New or modified transaction validity mechanisms | 0 | No transaction-validity or intrinsic-gas rule changes. |
|
| New fork activation mechanismUnder-specified | 0 | Storage slots start at zero and processing simply begins at FORK_TIMESTAMP. No one-time migration or code installation is specified, so starting recurring processing alone does not count. |
Uncertainty: It is unspecified whether the stateful precompile account must be created or kept non-empty at activation, for example to avoid empty-account deletion. That would be an activation-specific transition (level 3). |
| Cryptography | 0 | No cryptographic verification, signing or hashing rule is added or changed. |
|
Assessment provenance
- Assessed EIP revision
ethereum/EIPs@28cbb0162fEIPS/eip-7002.md committed 2023-06-29 · information cutoff 2024-01-18- Rubric
- Checklist revision 3 ·
ethspecs/pm@fe2f793b03 - Evaluator
- Opus 5.5 (
claude-opus-5-5) at high effort, one tool-less call per EIP · isolationbubblewrap_claude_p_no_tools_v1 - Source record
- Frozen research record
research/tasks/10-opus-v3-reassessment/retrospective/outputs/assessments/prague/eip-7002.yaml· sha256e9f385280719 - Supporting documents supplied with the EIP
supporting/eip-1559.md,supporting/eip-4788.md