Evaluated on: · Spec revision: 2024-04-18 · e2a66831fc
Scope at the cutoff. At this revision, EIP-7685 sets up a general framework for execution-layer requests that are passed to the consensus layer. A request is a request_type byte followed by opaque request_data. The block body gains a list of requests, sorted in ascending order by type. The execution header gains a 32-byte requests_root, which is the Merkle-Patricia trie root of that list keyed by index, built the same way as the transactions root. The revision defines no request types, system contracts, sources or validation rules for requests. It also leaves the consensus-layer and Engine API representation to later proposals.
- Evaluator
- LLMChecklist v3
- Confidence
- Medium
- Under-specified at assessment cutoff
- Yes — 5 criteria affected
- Plausible range
- 18–25 (Medium–High)
- Assessment cutoff
- 2024-04-25 · EIP revision
e2a66831fc(2024-04-18)
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
- Transition-tool interface changes2
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 defines only the container (typed request list, body field and header root). It does not define any request type or any rule on where requests come from or how the EL validates them. It does not say where requests_root sits in the header, and it does not specify Engine API or payload transport. The Test Cases section is TODO and Security Considerations reads 'Needs discussion.'
Plausible total
18–25
recorded score 21 · plausible tiers Medium, High
Unresolved questions at the cutoff (6)
- Is a block whose body contains requests valid when no request type is defined, and how must unknown request types be treated?
- Must the EL derive the requests itself and compare them with the body, or only check the body against requests_root?
- Where in the header RLP field order does requests_root sit?
- How are requests carried in the Engine API execution payload, if at all, under this EIP?
- Is a request with empty request_data (type byte only) valid?
- Is explicit validation of ascending type order required, or only the root match?
Notable ambiguities noted by the assessor (4)
- The abstract says requests are 'inherently' exposed to the CL, yet the CL and Engine API representation is left to future proposals.
- The rationale says the type ordering makes it easier to verify that all committed requests were found in the block, but the specification never states that verification rule.
- Intra-type ordering is delegated to future request types, so for now no ordering inside a type can be tested.
- The 'Opaque byte array' rationale mentions 'the transaction payload', apparently meaning the request payload.
Criterion breakdown
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| New block / header fields | 3 | The execution header gains requests_root, and the block body gains a requests list. |
Confidence: High |
| Encoding changes (RLP/SSZ) | 3 | The block body and header schemas both gain serialized fields, and a new typed request encoding is introduced. |
Confidence: High |
| Block syncing changesUnder-specified | 3 | Several structural rules change through block import: header decoding with the new field, body decoding with the requests list, and the requests_root-vs-body match, which is a cross-field (complex) check. Ascending-type ordering adds another rule. Level 3. |
Confidence: Medium Uncertainty: Whether ordering is checked explicitly or only enforced through the root comparison is not stated. Either way, multiple rules are added and one is complex. |
| Transition-tool interface changesUnder-specified | 2 | The t8n tool needs to output requests_root and the requests list. Block-building tooling needs a requests body input. That is multiple field changes with no new exchange mechanism. |
Confidence: Medium Uncertainty: This revision defines no request types and no source for requests. Only the root output might be needed, which would be level 1. |
| New invariant on pre-existing tests | 2 | Every block-producing test in the target fork must additionally produce or check the new requests_root field and the empty requests body list. This is a universal assertion. Pre-fork vectors do not need to be re-derived, so the level is 2. |
Confidence: High |
| Unspecified behavior requiring cross-client consensus | 2 | Clients could disagree on several observable outcomes. One is whether a block whose body carries requests of an undefined type, or any requests at all, is valid. Another is where requests_root sits in the header encoding. These competing outcomes are localized but must be agreed before fixtures can be fixed. |
Confidence: Medium Uncertainty: Request-type EIPs that are not supplied may resolve validity per type. The header position may be assumed to be appended last. |
| Engine API changesUnder-specified | 1 | For the CL to receive the requests and for the EL to rebuild the extended body, the execution payload exchanged over the Engine API presumably needs a requests field. This revision does not specify it, so the score is the minimal plausible single-field change, given low confidence. |
Confidence: Low Uncertainty: The Engine API change is unspecified. It could be none in this EIP (left to request-type EIPs), or it could be several fields or a new versioned method. |
| Patterns affecting pre-existing tests | 1 | Ordinary execution tests do not change behavior. Only baseline block-structure and RLP-decoding cases, such as malformed header or body field counts, must account for the extra fields. This rework is confined to boundary cases within the block-structure family. The new header value that every block must carry is scored under INV. |
Confidence: Medium Uncertainty: Whether changed block hashes in every fixture count as rework or as a new assertion is a judgment call. Here it is treated as the new invariant under INV. |
| New test-framework primitivesUnder-specified | 1 | Existing header and body primitives need local extensions: a new header field, a typed-bytes request list in the body, and an indexed-trie root computed like the transactions root. No new abstraction is required. |
Confidence: Medium Uncertainty: Invalid-block tests that tamper with the request list or its ordering could justify a new body modifier abstraction (level 2). |
| Security risks | 1 | The new security condition is the integrity of the header commitment against the body's request list: blocks with a mismatched or misordered list must be rejected. This can be checked locally at block validation. |
Confidence: Medium Uncertainty: The security section is empty, and request authority and validation are deferred to the CL and to future types. |
| Edge/boundary conditionsUnder-specified | 1 | One boundary-sensitive mechanism is introduced: ascending type ordering of the requests list against its root commitment. Cases include empty, single, equal-type and out-of-order lists. |
Confidence: Medium Uncertainty: If an empty request_data or an unknown type byte is handled as a separate rule, this could be level 2. |
| Cross-EIP interactions | 1 | Only local compatibility checks are needed: the requests body field must be placed after the existing body fields (withdrawals), and the header field after the Cancun header fields. No coordinated cross-EIP scenarios are established, because no request types are defined. The candidate list is empty. |
Confidence: Medium Uncertainty: Future request-type EIPs built on this framework would add coordinated interactions. They are not supplied and not counted. |
Show 16 zero-score criteria
| Criterion | Score | Why this score | Evidence / uncertainty |
|---|---|---|---|
| Added opcodes | 0 | No new instruction. |
|
| Modified opcodes | 0 | No instruction's semantics or availability changes. |
|
| 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 existing system contract changes. |
|
| EVM Gas rule changes | 0 | No rule for charging, metering or settling execution gas is added or changed. |
|
| State-access ordering within opcode execution | 0 | No instruction's state-access or gas-charge ordering changes. |
|
| Blob gas accounting changes | 0 | No change to blob-gas accounting. |
|
| State gas accounting changes | 0 | No change to state-gas accounting. |
|
| New EVM gas refund | 0 | No new refund mechanism. |
|
| New transaction types | 0 | Request types are not transaction types, and no transaction envelope is introduced. |
|
| New or modified transaction validity mechanisms | 0 | Transaction validity is unchanged. |
|
| New fork activation mechanism | 0 | Only rule selection at the fork. No one-time state transition. |
|
| Performance risks | 0 | No request types or sources are defined, so the workload is an indexed trie root over a list that is usually empty. No additional performance validation is established. |
Uncertainty: Future request types could add workload, but that belongs to those EIPs. |
| Cryptography | 0 | The unchanged trie-root primitive is reused. No new cryptographic rule is added. |
|
Assessment provenance
- Assessed EIP revision
ethereum/EIPs@e2a66831fcEIPS/eip-7685.md committed 2024-04-18 · information cutoff 2024-04-25- 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-7685.yaml· sha2565512e651a6af