Evaluated on: · Spec revision: 2022-05-06 · 9e393a79d9
Scope at the cutoff. This early, Stagnant revision of EIP-2935 makes the protocol store each parent block hash in storage at `HISTORY_STORAGE_ADDRESS` (0xff…fe). Before any transactions run in every block after `FORK_BLKNUM`, the protocol performs `sstore(HISTORY_STORAGE_ADDRESS, block.number - 1, block.prevhash)`. Once `block.number > FORK_BLKNUM + 256`, `BLOCKHASH` changes: it returns that stored value for any `arg` with `FORK_BLKNUM <= arg < block.number`, and 0 otherwise. This extends `BLOCKHASH` past the 256-block window. The revision specifies no contract code, gas changes, account-creation rules, access-list behaviour or test cases.
- Evaluator
- LLMChecklist v3
- Confidence
- Medium
- Under-specified at assessment cutoff
- Yes — 8 criteria affected
- Plausible range
- 14–28 (Medium–High)
- Assessment cutoff
- 2024-04-11 · EIP revision
9e393a79d9(2022-05-06)
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
- Modified opcodes3
- Edge/boundary conditions3
- Added system contracts2
- New invariant on pre-existing tests2
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 revision is a short Stagnant draft. It leaves out gas for the new BLOCKHASH read and the system write, access-list effects, how the history account is created or what its status is (nonce/code), how block-number activation fits timestamp-based forks, and any test cases.
Plausible total
14–28
recorded score 21 · plausible tiers Medium, High
Unresolved questions at the cutoff (5)
- Is HISTORY_STORAGE_ADDRESS created with a nonce or code? If not, is it an 'empty' account that can be deleted when touched, wiping the stored history?
- Does BLOCKHASH's sload add the address or slot to the accessed sets, and does it change BLOCKHASH's gas cost?
- Does the block-start sstore consume block gas, and does it touch or warm the account?
- How does FORK_BLKNUM map onto timestamp-based activation in the post-Merge baseline?
- Can calls or value transfers to 0xff…fe change its state, and how does that interact with any existing protocol use of this address?
Notable ambiguities noted by the assessor (5)
- Activation is by block number (FORK_BLKNUM) and BLOCKHASH switches 256 blocks later, while the Cancun baseline activates forks by timestamp.
- No code is given for HISTORY_STORAGE_ADDRESS, so whether it is a 'system contract' or just a protocol storage account is ambiguous.
- The address 0xff…fe may coincide with an address used by baseline system-call machinery; the document does not address this.
- Security Considerations expects the mechanism to be temporary (later replaced by an eth2 accumulator), but this has no normative testing consequence.
- The Test Cases and Implementation sections are TBD.
Criterion breakdown
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| Modified opcodes | 3 | BLOCKHASH's return values change: it now returns stored hashes beyond 256 blocks and reads state. |
Confidence: High |
| Edge/boundary conditions | 3 | There are several boundary-sensitive mechanisms: the write starting at FORK_BLKNUM+1, the BLOCKHASH switch at FORK_BLKNUM+257, and the new argument range. These form an elevated matrix. The result depends jointly on block.number relative to FORK_BLKNUM+256 and on arg relative to FORK_BLKNUM, block.number-256 and block.number. For example, arg=FORK_BLKNUM or arg=block.number-257 gives a different result before and after the switch, and arg=FORK_BLKNUM-1 must return 0. |
Confidence: Medium Uncertainty: Whether these dimensions count as an elevated matrix rather than independent boundaries is a judgement call; 2 is defensible. |
| Added system contractsUnder-specified | 2 | Exactly one protocol-designated stateful account is introduced: it has persistent storage written every block and read by BLOCKHASH. |
Confidence: Medium Uncertainty: No code is specified, so the account may not count as an EVM 'contract'. Under that reading the score would be 0. |
| New invariant on pre-existing tests | 2 | Every post-fork block test, and every state test if the tool performs the pre-transaction write, has a new protocol-mandated storage entry in its post-state. Pre-fork vectors are unaffected, so the universal-assertion case is level 2. |
Confidence: Medium Uncertainty: Whether single-transaction state tests apply the block-start write depends on test-harness conventions not given in the documents. |
| Security risksUnder-specified | 2 | Testing must show that user activity cannot corrupt or erase the history storage. Examples: touching the account while it has no nonce, code or balance (baseline empty-account cleanup), value transfers, and SELFDESTRUCT beneficiaries. Testing must also cover the changed BLOCKHASH assumption for contracts. This is a bounded interaction between the new storage and baseline account-lifecycle rules, needing targeted integration cases. |
Confidence: Medium Uncertainty: The account's existence and emptiness status is not specified. If the account were properly installed, this would mostly reduce to local checks (level 1). |
| Performance risksUnder-specified | 2 | BLOCKHASH keeps its baseline low gas charge but now does a storage read over a large, growing storage trie with an attacker-chosen key. Blocks that spam BLOCKHASH with distinct old arguments need integrated benchmarks against the state database. This is a bounded interaction between the opcode and the state backend. |
Confidence: Medium Uncertainty: Whether any additional gas is intended is unspecified. With an appropriate storage-read charge, component benchmarks (level 1) might be enough. |
| Unspecified behavior requiring cross-client consensus | 2 | Several localized, consensus-visible outcomes have competing readings: (1) whether the storage-only account counts as empty and can be deleted on touch; (2) the access-list and gas effects of BLOCKHASH's read; (3) whether the system write consumes block gas or changes the account. Expected state roots and gas results cannot be fixed until clients agree on these. |
Confidence: Medium |
| State-access ordering within opcode executionUnder-specified | 1 | Only BLOCKHASH changes. Tests must fix whether its storage read warms HISTORY_STORAGE_ADDRESS or the slot under the baseline access-list rules, and whether it is charged as cold or warm. No general ordering rule for an opcode class changes. |
Confidence: Low Uncertainty: Warm/cold and access-list effects are not specified. If no access-list effect is intended, this could be 0. If it is treated as a new state-accessing operation needing its own ordering rule, it could be 2. |
| Transition-tool interface changesUnder-specified | 1 | The tool must know the numeric activation block for the BLOCKHASH range and switch-over condition, and must have the parent hash for the write. One new semantic input (activation block) is most likely needed. The parent hash may already be derivable from existing block-hash inputs. |
Confidence: Low Uncertainty: No tool evidence is supplied. The change could be none (if FORK_BLKNUM is derived internally) or two fields (if the parent hash is also a new input). |
| Patterns affecting pre-existing tests | 1 | Rework is limited to BLOCKHASH out-of-range boundary cases in post-activation chains: queries older than 256 blocks that previously expected 0. This is a boundary subset of one family. The new storage write in every block's post-state is assessed under INV. |
Confidence: Medium |
| New test-framework primitives | 1 | Tests need long post-fork chains and fork-transition fixtures keyed to a block number. The Cancun baseline activates forks by timestamp, so existing chain-building and transition-fork primitives need a local extension. No new expectation abstraction is required. |
Confidence: Medium Uncertainty: How well the existing framework supports block-number activation after the Merge is not evidenced. |
| Cross-EIP interactionsUnder-specified | 1 | The candidate EIPs are citations only. The unnumbered interactions with baseline storage-access warmth and account-emptiness rules need local compatibility checks, such as BLOCKHASH followed by accesses to the address, and touches of the address. |
Confidence: Low Uncertainty: These interactions follow from baseline semantics, not from explicit text. They could be 0 if not counted, or 2 if coordinated cases are needed. |
Show 16 zero-score criteria
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| Added opcodes | 0 | No new instruction. |
|
| Added precompiles | 0 | None. |
|
| Modified precompiles | 0 | None. |
|
| Modified system contracts | 0 | No baseline system contract's rules change according to the supplied text. |
Uncertainty: The address 0xff…fe may coincide with an address used by baseline Cancun system-call machinery. The document does not mention this. |
| EVM Gas rule changesUnder-specified | 0 | No execution-gas accounting rule or parameter is changed by the text. BLOCKHASH keeps its baseline charge, and the protocol-level write has no stated gas. |
Uncertainty: The text does not say whether the internal sload adds storage-access gas to BLOCKHASH, or whether the system sstore uses block gas. Either reading would make this level 1. |
| Blob gas accounting changes | 0 | Blob-gas accounting is untouched. |
|
| State gas accounting changes | 0 | A protocol storage write is added, but no state-byte cost, budget or spill rule is introduced or changed. |
|
| New EVM gas refund | 0 | No new refund is introduced. |
|
| New transaction types | 0 | None. |
|
| New or modified transaction validity mechanisms | 0 | Transaction validity is unchanged. |
|
| New block / header fields | 0 | No header or block field is added. |
|
| Encoding changes (RLP/SSZ) | 0 | No serialized schema changes; the new storage entries use the existing format. |
|
| Block syncing changes | 0 | Only execution rules change; block structure validation is untouched. |
|
| New fork activation mechanismUnder-specified | 0 | Starting a recurring block-start write does not count as an activation-specific transition, and no one-time installation is specified. |
Uncertainty: If clients had to create or install the account (for example, set a nonce or code) at activation to protect it from empty-account rules, this would become 3. The text does not require it. |
| Engine API changes | 0 | The Engine API is unchanged. |
|
| Cryptography | 0 | Existing block hashes are stored without change. No cryptographic rule changes. |
|
Assessment provenance
- Assessed EIP revision
ethereum/EIPs@9e393a79d9EIPS/eip-2935.md committed 2022-05-06 · information cutoff 2024-04-11- 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-2935.yaml· sha256d1e021e9534c