Evaluated on: · Spec revision: 2022-03-11 · 1ce607ac37
Scope at the cutoff. At the supplied revision, EIP-4895 adds a new block-level "operation", the `Withdrawal`. Each withdrawal is RLP([index uint64, address 20 bytes, amount uint256 wei]) and is supplied by the consensus layer. Blocks gain a `withdrawals` list, and the header gains a `withdrawals_root` commitment built like the transactions root (an MPT keyed by list position), with a new block-validity check that the two match. From `FORK_TIMESTAMP` onward, withdrawals are processed after all user transactions as unconditional, gas-free balance increases that MUST NOT fail. Whether withdrawals emit logs or receipts is left as a TODO.
- Evaluator
- LLMChecklist v3
- Confidence
- Medium
- Under-specified at assessment cutoff
- Yes — 5 criteria affected
- Plausible range
- 22–30 (Medium–High)
- Assessment cutoff
- 2022-03-11 · EIP revision
1ce607ac37(2022-03-11)
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
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: This draft leaves several consensus-visible details open. Logs and receipts for withdrawals are an explicit TODO. Element positions in the block and header RLP lists are not given. It does not say whether the EL validates index monotonicity or bounds the withdrawal count. Zero-amount and empty-account semantics, and amount overflow, are unspecified. The Engine API transport for withdrawals is not specified, although CL supply is required.
Plausible total
22–30
recorded score 26 · plausible tiers Medium, High
Unresolved questions at the cutoff (7)
- Do withdrawals emit logs or receipts, and is there a receipts commitment for them?
- Must the EL validate that withdrawal indices are monotonically increasing or contiguous across blocks?
- What is the maximum number of withdrawals per block, and must the EL enforce it?
- Does a zero-amount withdrawal to a nonexistent account create or touch it, and how do empty-account deletion rules apply?
- Where do withdrawals and withdrawals_root sit in the block and header RLP lists, and how is their absence or presence validated around FORK_TIMESTAMP?
- How are withdrawals transported over the Engine API for payload validation and for block building?
- What happens if a credit would overflow a 256-bit balance, given that the operation MUST NOT fail?
Notable ambiguities noted by the assessor (6)
- The 'TODO: add logs?' in State transition leaves the receipt structure undecided.
- The state transition uses lowercase 'should increase the balance' but follows it with 'MUST not fail'.
- Block validity begins with 'Assuming the block is well-formatted' without defining the well-formedness rules for the new fields.
- The index is described as 'monotonically increasing', but no EL validation of this is stated.
- The rationale calls withdrawals a 'new transaction type' in a heading, while the specification defines them as non-transaction operations.
- The count bound on withdrawals is enforced only by the CL, per the rationale; no EL-side limit is given.
Criterion breakdown
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| New block / header fields | 3 | The execution header gains withdrawals_root, and the block body gains a withdrawals member. |
Confidence: High |
| Encoding changes (RLP/SSZ) | 3 | Block and header schemas gain serialized fields, and a new Withdrawal RLP object is defined. |
Confidence: High Uncertainty: The exact position of the new elements within the block and header lists is not specified. |
| Block syncing changes | 3 | Several structural rules change: body decoding with the new withdrawals list, header decoding with the new field (timestamp-gated presence), and Withdrawal element decoding. The root-matches-body check depends on another field (the body list), so at least one rule is complex. That is level 3. |
Confidence: High |
| Engine API changesUnder-specified | 2 | The withdrawals list has to cross the EL/CL boundary in executed payloads and in build requests. That is one distinct semantic field, and in practice new or versioned payload exchange behavior. Endpoint behavior with at most one field change is level 2. |
Confidence: Low Uncertainty: This revision does not specify the Engine API at all. The endpoint and field shape is inferred from the requirement that the CL supply the withdrawals. |
| Transition-tool interface changesUnder-specified | 2 | The transition tool needs a new input (the withdrawals list, applied after transactions). By analogy with the transactions root, it also plausibly needs a new output, withdrawalsRoot. That makes multiple semantic fields with no new exchange mechanism, which is level 2. |
Confidence: Medium Uncertainty: No transition-tool documentation was supplied. If the framework computes the root itself, only the input field changes (level 1). |
| New invariant on pre-existing tests | 2 | Every blockchain/import test in the fork has to produce and check the new header commitment, even when its withdrawals list is empty. Because activation is gated by fork timestamp, pre-fork vectors do not need to be re-derived. Under the template's note, a universal assertion without pre-fork vector changes is level 2. |
Confidence: High Uncertainty: If the logs/receipts TODO were resolved by adding receipts for withdrawals, a further commitment assertion would follow. That would still be level 2. |
| New test-framework primitives | 2 | The framework needs a Withdrawal construction abstraction, block builders that attach withdrawals and compute withdrawals_root, and post-state balance expectations driven by withdrawals. These are new construction and expectation abstractions within the target's suite. Other families only see an empty default list, so level 3 is not met. |
Confidence: Medium |
| Security risks | 2 | The EL now credits ETH on CL authority, which changes EL supply and balance assumptions at the CL/EL trust boundary. It also adds a new path for balance changes without code execution that contracts may not expect, though coinbase credits are an existing analog. This bounded cross-layer interaction needs targeted integration review and fuzzing of the withdrawals commitment and processing. |
Confidence: Medium |
| Edge/boundary conditionsUnder-specified | 2 | There are several independent boundary-sensitive rules: the fork-timestamp activation boundary for the block/header structure; field-width bounds on index and amount in decoding; and the amount/recipient boundaries (zero amount, nonexistent or empty recipient, list empty versus many). No interacting matrix whose combinations change the result is clearly established, so this is level 2. |
Confidence: Medium Uncertainty: How zero-amount credits to empty accounts behave, and whether amount overflow is possible, is unspecified. This could create a combined matrix (amount × account state × same-block transaction effects). |
| Unspecified behavior requiring cross-client consensus | 2 | Several localized outcomes have competing interpretations: logs and receipts (observable through the receipts root), EL enforcement of index monotonicity, empty-account creation or touch semantics for zero amounts, and the element positions in the block and header. These need specification agreement before expected results can be fixed. They are localized rather than a cross-family re-baselining. |
Confidence: Medium Uncertainty: Empty-account semantics might be defined by baseline rules that were not supplied (an evidence gap rather than a pure omission). |
| Patterns affecting pre-existing testsUnder-specified | 1 | Baseline header and block-structure validation cases (for example field-count and malformed-header RLP cases, and fork-transition block shapes) need reworked inputs and expectations for post-fork blocks. This is confined to one family: block structure/import validation. Ordinary state-execution tests keep their behavior. The new commitment value itself is counted under INV. |
Confidence: Medium Uncertainty: Whether regenerating block hashes in every post-fork blockchain test counts as rework or only as the new-commitment assertion is a matter of interpretation. I attribute it to INV. |
| Performance risksUnder-specified | 1 | The new workload consists of gas-free balance credits and the withdrawals trie root, outside gas-limit bounds. Component benchmarks of processing the maximum withdrawal count are enough, since the rationale states the cost is negligible next to block execution. |
Confidence: Medium Uncertainty: The maximum count is not given in the supplied text. A large bound could require integrated benchmarks; a trivially small one might need none. |
| Cross-EIP interactions | 1 | The target interacts with existing block-processing behavior, needing local compatibility checks: credits to the coinbase after fee crediting, to accounts destroyed or created earlier in the block, and to empty accounts. Its core behavior can otherwise be tested on its own. EIP-4863 is a superseded alternative, and EIP-4788 is a cited alternative not established in the same-fork scenario, so neither needs target-specific cases. |
Confidence: Medium Uncertainty: If EIP-4788 were scheduled in the same fork, block-start beacon-root writes and block-end withdrawals would need joint block-structure and processing checks. The supplied text does not establish that scenario. |
Show 15 zero-score criteria
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| Added opcodes | 0 | No new opcode. |
|
| Modified opcodes | 0 | No instruction's semantics or availability change. |
|
| Added precompiles | 0 | No new precompile. |
|
| Modified precompiles | 0 | No precompile changes. |
|
| Added system contracts | 0 | No system contract is introduced. |
|
| Modified system contracts | 0 | No system contract exists in the baseline, and none is modified. |
|
| EVM Gas rule changes | 0 | No execution-gas charging, metering, limit or settlement rule changes. Withdrawals sit outside gas accounting entirely. |
|
| State-access ordering within opcode execution | 0 | No opcode's state-access or gas-charge ordering changes. The withdrawal balance credit is a block-level operation, not an instruction, and there is no access-list concept involved. |
|
| Blob gas accounting changes | 0 | No blob-gas accounting rule changes. |
|
| State gas accounting changes | 0 | No state-gas mechanism, rate or budget is introduced or changed. |
|
| New EVM gas refund | 0 | No refund mechanism is introduced. |
|
| New transaction types | 0 | Withdrawals are not in the transaction list and have no EIP-2718 discriminator. This contrasts with the EIP-4863 alternative. |
|
| New or modified transaction validity mechanisms | 0 | No transaction validity rules change. |
|
| New fork activation mechanism | 0 | There is no one-time state conversion or code installation at activation. Timestamp-based rule selection and starting recurring withdrawal processing do not count. |
|
| Cryptography | 0 | An existing primitive and commitment scheme are reused unchanged. No cryptographic verification or rule changes. |
|
Assessment provenance
- Assessed EIP revision
ethereum/EIPs@1ce607ac37EIPS/eip-4895.md committed 2022-03-11 · information cutoff 2022-03-11T12:28:57Z- 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/shanghai/eip-4895.yaml· sha2566f7400ba7c34 - Supporting documents supplied with the EIP
supporting/eip-4788.md,supporting/eip-4863.md