Evaluated on: · Spec revision: 2023-04-13 · 5b909b76ac
Scope at the cutoff. This revision of EIP-4788 adds a 32-byte parent beacon block root to the execution block header, after `withdrawals_root`, starting at FORK_TIMESTAMP. At the start of each post-fork block, before any transactions run, the protocol writes that root into the storage of HISTORY_STORAGE_ADDRESS (0xff..fd). It writes once for every slot from the parent block's slot up to, but not including, the current block's slot, at key `slot % 8192`, so a ring buffer holds the history. A new opcode, BEACON_ROOT (0x48), pops a slot number, charges a constant 20 gas and returns `sload(HISTORY_STORAGE_ADDRESS, slot % 8192)`. A missing value reads as 0. The revision does not define the slot conversion, Engine API delivery, test cases or security considerations.
- Evaluator
- LLMChecklist v3
- Confidence
- Medium
- Under-specified at assessment cutoff
- Yes — 9 criteria affected
- Plausible range
- 21–38 (Medium–High)
- Assessment cutoff
- 2023-04-27 · EIP revision
5b909b76ac(2023-04-13)
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
- Edge/boundary conditions3
- Added system contracts2
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: The revision leaves several things undefined: convert_to_slot, how the root reaches the EL (Engine API), the history account's nonce/code status and empty-account treatment, whether the opcode affects accessed sets, and how large timestamp gaps are bounded. Test Cases, Reference Implementation and Security Considerations are all TODO, and the gas-constant name is inconsistent.
Plausible total
21–38
recorded score 30 · plausible tiers Medium, High
Unresolved questions at the cutoff (6)
- How does convert_to_slot map timestamps to slots (genesis time, slot duration, rounding), and where does the EL get these parameters?
- How does the parent beacon block root reach the EL (Engine API fields/methods, payload attributes for building)?
- Does HISTORY_STORAGE_ADDRESS need a nonce or code, and is it protected from EIP-161 empty-account clearing?
- Does BEACON_ROOT add the history address or slot to EIP-2929 accessed sets or interact with warm/cold pricing?
- Is the skipped-slot write loop capped (for example at SLOTS_PER_HISTORICAL_ROOT) for very large timestamp gaps?
- Is the opcode gas constant G_beacon_root or G_beacon_state_root (both presumably 20)?
Notable ambiguities noted by the assessor (4)
- The text calls the opcode gas constant G_beacon_state_root, but the table defines only G_beacon_root = 20.
- The rationale claims constant work per block, while the pseudocode loops over every skipped slot.
- The opcode reduces any slot modulo 8192, so requests for future or out-of-window slots return aliased stale roots instead of 0.
- The history account is called a contract but has no code or account fields specified.
Criterion breakdown
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| New block / header fields | 3 | An EL execution-header member is added. |
Confidence: High |
| Encoding changes (RLP/SSZ) | 3 | The execution header serialization schema changes. |
Confidence: High |
| Edge/boundary conditionsUnder-specified | 3 | There are several boundary-sensitive mechanisms: the fork-timestamp gate, the write loop over skipped slots with modulo wrap, the opcode's modular read with arbitrary arguments, and the header field's presence by timestamp. The write mechanism forms an elevated matrix: gap length (0, 1, many, at least 8192) × ring-wrap position × fork-boundary parent. These combine to determine which keys hold which roots, so they cannot be tested independently. |
Confidence: Medium Uncertainty: If the gap and wrap dimensions are treated as separable, this would be 2. Undefined slot conversion (rounding of non-aligned timestamps) adds further boundaries. |
| Added system contractsUnder-specified | 2 | Exactly one protocol-designated, stateful (ring-buffer storage) contract location is introduced, which is level 2. |
Confidence: Medium Uncertainty: No code is specified. If a code-less storage account is not treated as an EVM system contract, this could be 0. |
| State-access ordering within opcode executionUnder-specified | 2 | A new state-accessing operation needs an ordering rule: when gas is charged relative to the read, and whether the read adds HISTORY_STORAGE_ADDRESS or its slot to the accessed sets. This meets level 2. No existing opcode class's ordering changes. |
Confidence: Medium Uncertainty: The spec gives no ordering or access-set rule. With a constant charge the ordering may be trivial (low end 0). |
| Block syncing changesUnder-specified | 2 | Header decoding and structural validation must require the 32-byte field from FORK_TIMESTAMP onward and reject it before then. This is one rule that depends on another field (timestamp), so it is complex (level 2). |
Confidence: Medium Uncertainty: If treated as a simple local length/presence check this would be 1. The EL cannot validate the value itself. |
| New invariant on pre-existing tests | 2 | Every post-fork block-level test must account for the new header field and the history-storage write. The change is gated by timestamp, so pre-fork vectors do not need re-deriving. A universal assertion without pre-fork changes is level 2. |
Confidence: High |
| Security risks | 2 | The change creates a bounded cross-layer trust interaction: CL-provided roots enter EL state and consensus, and contracts are invited to rely on them. It also adds DoS surfaces (an underpriced read and unmetered writes) and the reserved-address state. Each needs targeted integration review. |
Confidence: Medium |
| Performance risksUnder-specified | 2 | Two bounded interactions need targeted integrated benchmarks. First, gas-unmetered storage writes proportional to skipped slots during block processing, up to and beyond 8192 slots. Second, a 20-gas trie storage read that contracts can repeat across many keys. |
Confidence: Medium Uncertainty: Whether implementations cap the loop at 8192 iterations is unspecified. |
| Unspecified behavior requiring cross-client consensus | 2 | Several localized, consensus-visible outcomes have competing interpretations and need client agreement: how slots are converted, whether and how the history account exists (and so the state root), whether the opcode warms accessed sets, and loop behavior for large gaps. This is level 2. |
Confidence: High |
| Added opcodes | 1 | Exactly one simple instruction is introduced (fixed stack effects, no immediate data, constant gas). |
Confidence: High Uncertainty: The gas constant is named inconsistently (G_beacon_root vs G_beacon_state_root), but both refer to the single value 20. |
| EVM Gas rule changesUnder-specified | 1 | No new accounting mechanism is added. There is a new constant gas entry for an instruction that reads state outside the existing cold/warm storage pricing, and the system writes are unmetered. This fits a parameter-level change (level 1) rather than a new mechanism. |
Confidence: Medium Uncertainty: The spec does not say whether the read is subject to EIP-2929 warm/cold charging. If it were, a new accounting interaction would push this toward 2. A strict reading that a new opcode's fixed cost is not an accounting change would give 0. |
| Engine API changesUnder-specified | 1 | The EL can only obtain the parent beacon block root from the CL, so at least one Engine API field must carry it. The revision specifies no field or endpoint, so the minimum supported reading is used. |
Confidence: Low Uncertainty: Delivery (new versioned methods, payload attributes for block building) is entirely unspecified. Plausible range is 0–3. |
| Transition-tool interface changesUnder-specified | 1 | The tool's environment needs one new field, the parent beacon block root, with no new exchange mechanism (level 1). |
Confidence: Medium Uncertainty: If convert_to_slot needs genesis time or slot-duration parameters, or the parent timestamp must be supplied newly, multiple fields would change (2). No tool evidence was supplied. |
| Patterns affecting pre-existing tests | 1 | Rework is confined to boundary cases in one family: invalid/undefined-opcode tests that cover 0x48, plus incidental use of the newly reserved address. The universal header and storage-write effects belong under INV. |
Confidence: Medium Uncertainty: If expected post-state roots in all blockchain tests are counted as rework rather than a new assertion, this could be 2. |
| New test-framework primitives | 1 | The existing header and environment primitives need a local extension for the beacon root field, plus a helper to model expected ring-buffer contents. No shared new abstraction is clearly required. |
Confidence: Medium Uncertainty: An expected-history-storage modeling abstraction across tests could be argued as level 2. |
| Cross-EIP interactions | 1 | Only local compatibility checks are needed. The header field must sit after withdrawals_root. If EIP-2935 were also active, its history address and BLOCKHASH behavior would need to stay unaffected. The target's behavior can otherwise be tested on its own. |
Confidence: Medium Uncertainty: EIP-2935 is not part of the assessed Cancun baseline, and the evidence does not establish that it is scheduled alongside this EIP. Interacting EIPs: EIP-2935 |
Show 11 zero-score criteria
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| Modified opcodes | 0 | No existing defined instruction changes semantics. 0x48 was undefined, so it counts under added opcodes. |
|
| Added precompiles | 0 | No new precompile. |
|
| Modified precompiles | 0 | No precompile is modified. |
|
| Modified system contracts | 0 | No existing system contract's rules change. |
|
| Blob gas accounting changes | 0 | Blob-gas accounting does not change. |
|
| State gas accounting changes | 0 | No state-gas accounting mechanism or parameter is introduced or changed. |
|
| New EVM gas refund | 0 | There is no new refund mechanism. |
|
| New transaction types | 0 | No new transaction envelope. |
|
| New or modified transaction validity mechanisms | 0 | Transaction validity is unchanged. |
|
| New fork activation mechanismUnder-specified | 0 | Starting recurring block processing does not count. No activation-specific state conversion or code installation is specified. |
Uncertainty: The account's nonce/code status at activation is unspecified. A required activation-time installation (for example, to avoid empty-account clearing) would make this 3. |
| Cryptography | 0 | The EL adds or changes no cryptographic verification, hashing or proof rule. The root is opaque data. |
|
Assessment provenance
- Assessed EIP revision
ethereum/EIPs@5b909b76acEIPS/eip-4788.md committed 2023-04-13 · information cutoff 2023-04-27- 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/cancun/eip-4788.yaml· sha256833491eb91fd - Supporting documents supplied with the EIP
supporting/eip-2935.md,supporting/ethereum-consensus-specs--ssz-simple-serialize.md