Primary retrospective result
Does Predicted Complexity Track Time to Mainnet?
At fork level, the study compares the time from development underway in earnest—the first devnet with at least two independent execution-layer clients—to mainnet against three summaries of predicted complexity.
Predicted Complexity by Fork
The primary prediction is the score sum for EIPs included by each fork’s evaluation cutoff. EIPs added afterward could not have informed that initial prediction, so the stacked chart reports their complexity as a separate increment. Both subtotals reflect the number and splitting of EIPs.
- Included by cutoff (primary prediction)
- Added after cutoff
Values: score at cutoff, added-later score, and final-scope score per fork
| Fork | EIPs by cutoff | Score at cutoff | EIPs added later | Added-later score | Final-scope score |
|---|---|---|---|---|---|
| Shanghai / Shapella | 4 | 65 | 1 | 3 | 68 |
| Cancun / Dencun | 5 | 126 | 1 | 9 | 135 |
| Prague / Pectra | 8 | 216 | 3 | 38 | 254 |
| Osaka / Fusaka | 8 | 105 | 4 | 35 | 140 |
| Amsterdam / Glamsterdam | 13 | 243 | 2 | 44 | 287 |
The at-cutoff subtotal is used in the shipping-time comparison; later additions remain visible as a separate segment. Hegotá is excluded because it is a forward-looking evaluation. Hover or focus a segment for its EIP count and share.
Which Kinds of Complexity Made Each Fork Heavy?
Each bar stacks the criterion scores of the EIPs included by the fork’s evaluation cutoff, so a segment is that criterion’s total contribution to the fork’s predicted complexity. Absolute mode keeps the shared scale used elsewhere on this page; composition mode normalizes each fork to 100% so the mix can be compared independently of size. Colours, names, and order match every per-EIP bar on the site.
Composition table: points per criterion and fork
| Criterion | Shanghai | Cancun | Prague | Osaka | Amsterdam |
|---|---|---|---|---|---|
| Added opcodes | 1 · 2% · 1 EIP | 6 · 5% · 4 EIPs | 0 | 0 | 4 · 2% · 2 EIPs |
| Modified opcodes | 3 · 5% · 1 EIP | 3 · 2% · 1 EIP | 3 · 1% · 1 EIP | 0 | 9 · 4% · 3 EIPs |
| Added precompiles | 0 | 1 · 1% · 1 EIP | 5 · 2% · 2 EIPs | 1 · 1% · 1 EIP | 0 |
| Modified precompiles | 0 | 0 | 0 | 3 · 3% · 2 EIPs | 0 |
| Added system contracts | 0 | 2 · 2% · 1 EIP | 4 · 2% · 2 EIPs | 0 | 2 · 1% · 1 EIP |
| Modified system contracts | 0 | 0 | 2 · 1% · 1 EIP | 0 | 2 · 1% · 1 EIP |
| EVM Gas rule changes | 5 · 8% · 3 EIPs | 6 · 5% · 4 EIPs | 9 · 4% · 4 EIPs | 3 · 3% · 3 EIPs | 13 · 5% · 8 EIPs |
| State-access ordering within opcode execution | 2 · 3% · 1 EIP | 2 · 2% · 1 EIP | 3 · 1% · 2 EIPs | 0 | 2 · 1% · 1 EIP |
| Blob gas accounting changes | 0 | 3 · 2% · 1 EIP | 0 | 2 · 2% · 2 EIPs | 0 |
| State gas accounting changes | 0 | 0 | 0 | 0 | 3 · 1% · 1 EIP |
| New transaction types | 0 | 3 · 2% · 1 EIP | 3 · 1% · 1 EIP | 0 | 0 |
| New or modified transaction validity mechanisms | 2 · 3% · 1 EIP | 3 · 2% · 1 EIP | 5 · 2% · 2 EIPs | 2 · 2% · 1 EIP | 11 · 5% · 5 EIPs |
| New block / header fields | 3 · 5% · 1 EIP | 6 · 5% · 2 EIPs | 9 · 4% · 3 EIPs | 0 | 6 · 2% · 2 EIPs |
| Encoding changes (RLP/SSZ) | 3 · 5% · 1 EIP | 6 · 5% · 2 EIPs | 15 · 7% · 5 EIPs | 6 · 6% · 2 EIPs | 6 · 2% · 2 EIPs |
| Block syncing changes | 2 · 3% · 1 EIP | 3 · 2% · 2 EIPs | 9 · 4% · 3 EIPs | 1 · 1% · 1 EIP | 4 · 2% · 2 EIPs |
| New fork activation mechanism | 0 | 3 · 2% · 1 EIP | 6 · 3% · 2 EIPs | 3 · 3% · 1 EIP | 3 · 1% · 1 EIP |
| Engine API changes | 1 · 2% · 1 EIP | 2 · 2% · 2 EIPs | 4 · 2% · 3 EIPs | 0 | 3 · 1% · 2 EIPs |
| Transition-tool interface changes | 1 · 2% · 1 EIP | 4 · 3% · 2 EIPs | 10 · 5% · 4 EIPs | 0 | 7 · 3% · 4 EIPs |
| Patterns affecting pre-existing tests | 7 · 11% · 4 EIPs | 9 · 7% · 5 EIPs | 16 · 7% · 7 EIPs | 11 · 10% · 8 EIPs | 27 · 11% · 13 EIPs |
| New invariant on pre-existing tests | 3 · 5% · 1 EIP | 4 · 3% · 2 EIPs | 9 · 4% · 4 EIPs | 1 · 1% · 1 EIP | 10 · 4% · 5 EIPs |
| New test-framework primitives | 2 · 3% · 1 EIP | 3 · 2% · 2 EIPs | 6 · 3% · 4 EIPs | 2 · 2% · 1 EIP | 6 · 2% · 3 EIPs |
| Security risks | 7 · 11% · 4 EIPs | 11 · 9% · 5 EIPs | 20 · 9% · 8 EIPs | 13 · 12% · 7 EIPs | 26 · 11% · 12 EIPs |
| Performance risks | 3 · 5% · 2 EIPs | 10 · 8% · 5 EIPs | 19 · 9% · 8 EIPs | 13 · 12% · 7 EIPs | 23 · 9% · 11 EIPs |
| Edge/boundary conditions | 8 · 12% · 4 EIPs | 15 · 12% · 5 EIPs | 22 · 10% · 8 EIPs | 17 · 16% · 8 EIPs | 28 · 12% · 13 EIPs |
| Cryptography | 0 | 4 · 3% · 2 EIPs | 3 · 1% · 2 EIPs | 3 · 3% · 2 EIPs | 1 · 0% · 1 EIP |
| Cross-EIP interactions | 7 · 11% · 4 EIPs | 8 · 6% · 4 EIPs | 14 · 6% · 7 EIPs | 12 · 11% · 7 EIPs | 28 · 12% · 11 EIPs |
| Unspecified behavior requiring cross-client consensus | 5 · 8% · 2 EIPs | 9 · 7% · 4 EIPs | 20 · 9% · 8 EIPs | 12 · 11% · 7 EIPs | 19 · 8% · 9 EIPs |
| Total | 65 | 126 | 216 | 105 | 243 |
Criterion legend for the fork composition bars
Every stacked bar, comparison matrix, and criterion table on this site uses the same criterion colours, abbreviations, and order. Colour marks the criterion group; the abbreviation and name identify the criterion. Scores are 0–3 per criterion (4 is exceptional; cross-EIP interactions is uncapped).
EVM surface
Opcodes, precompiles, and system contracts that are added or modified.
- Added opcodesIntroduces new opcodes
- Modified opcodesModifies pre-existing opcodes
- Added precompilesIntroduces new precompiles
- Modified precompilesModifies pre-existing precompiles logic or gas-accounting
- Added system contractsIntroduces new system contract, stateful or not
- Modified system contractsModifies pre-existing system contracts
Gas and accounting
Execution, blob, and state gas rules, refunds, and where charges happen inside opcodes.
- EVM Gas rule changesNew EVM gas accounting rules
- State-access ordering within opcode execution · Checklist revision 2 onlyChanges *where inside an opcode's execution* state is accessed, or where gas is charged relative to that access. Because a state access is recorded in the block-level access list only if execution had enough gas to reach it, this ordering is consensus-critical: moving it changes the BAL at every gas boundary of every affected opcode.
- Blob gas accounting changesNew Blob gas accounting rules which potentially affect pre-existing tests
- State gas accounting changes · Checklist revision 2 onlyNew state gas accounting rules. State gas is the cost of *writing* state, as opposed to accessing or executing it: `StateGasCosts`, `COST_PER_STATE_BYTE`, the block-level state gas budget, and the spill path into execution gas.
- New EVM gas refundNew gas-refund mechanism
Blocks, transactions, and encoding
Transaction types and validity, block and header fields, encodings, syncing, and activation-time changes.
- New transaction typesIntroduces a new transaction type
- New or modified transaction validity mechanismsCreates new or modifies pre-existing transaction types' validation mechanisms
- New block / header fieldsIntroduces new block or block header fields
- Encoding changes (RLP/SSZ)Introduces encoding changes at the transaction/block/interfaces level
- Block syncing changesModifies block RLP validation mechanisms that require test client syncing.
- New fork activation mechanismModifies state, internal variables, or similar, at the fork activation block
Client interfaces
Engine API and transition-tool interface changes.
- Engine API changesIntroduces new fields to the Engine API directives
- Transition-tool interface changesModifies or adds new fields to the transition tool interface.
Testing impact
Rework, new invariants, and new primitives required in the test framework.
- Patterns affecting pre-existing testsImplements a new validation mechanism or rule that translates in reworking pre-existing tests
- New invariant on pre-existing tests · Checklist revision 2 onlyTests that are **not about this EIP** must nonetheless assert something this EIP produces. Their logic does not change; they gain a new thing to check.
- New test-framework primitives · Checklist revision 2 onlyRequires new abstractions in the test framework itself — expectation types, modifiers, helpers — beyond writing test functions with what already exists.
Risk and validation
Security, performance, boundary conditions, and cryptography that need validation.
- Security risksIntroduces or modifies mechanisms that could compromise the security of the chain, users, validators, or other stakeholders, if not implemented properly.
- Performance risksIntroduces or modifies mechanisms and requires performance validation.
- Edge/boundary conditionsFeature contains edge/boundary conditions.
- CryptographyIntroduces new cryptography mechanisms or modifies existing functionality that involves cryptography
Coordination
Cross-EIP interactions and behavior that clients must agree on before tests exist.
- Cross-EIP interactionsIntroduces or modifies mechanisms that affect other EIPs in either the same or past forks.
- Unspecified behavior requiring cross-client consensus · Checklist revision 2 onlyThe EIP text does not determine the answer for cases a test can construct. Clients must agree on a previously unspecified detail before tests can be baselined. The cost here is coordination and re-baselining, not test writing.
Fork Shipping Time Versus Predicted Complexity
- To estimate when Execution Layer development began in earnest, we define the start date as the launch of the first devnet running at least two independent Execution Layer implementations.
- Filled points represent the four shipped forks; the open Amsterdam point uses the projected 15 December 2026 mainnet date.
- Each plot contains the same five forks, uses only complexity included by the evaluation cutoff, and differs only in how that predicted complexity is summarized.
Loading interactive chart…
Loading interactive chart…
Loading interactive chart…
| Shanghai / Shapella | withdrawals-devnet-0 2022-12-09 | 2023-04-12 | 124 | 65 | 53 | EIP-4895: 30 | 3 |
| Cancun / Dencun | dencun-devnet-4 2023-01-23 | 2024-03-13 | 415 | 126 | 86 | EIP-4844: 48 | 9 |
| Prague / Pectra | pectra-devnet-0 2024-05-17 | 2025-05-07 | 355 | 216 | 165 | EIP-7002: 38 | 38 |
| Osaka / Fusaka | fusaka-devnet-0 2025-05-26 | 2025-12-03 | 191 | 105 | 24 | EIP-7594: 24 | 35 |
| Amsterdam / Glamsterdam (projected) | bal-devnet-0 2025-11-04 | 2026-12-15 | 405 | 243 | 123 | EIP-7928: 40 | 44 |
Cancun is the only fork whose ≥2-EL start differs from its first EL devnet: devnets 1–3 ran a single patched geth fork, so this clock begins at dencun-devnet-4. Cancun also largely distinguishes the total-load and critical-path readings in this five-fork sample.
EIP-level observed proxies
As a separate view, each retrospective fork–EIP relationship is compared with two score-blind counts derived from public artifacts:
- Specification rework counts substantive revisions committed after the assessment cutoff and before mainnet. Clarifications can count, and author commit practices can affect the total.
- New EIP interactions counts distinct
requiresorinteracts_withrelationships first evidenced after the assessment cutoff. It captures newly documented interaction surface, not necessarily a dependency that first arose at that moment.
Amsterdam is omitted from these plots because it had not reached mainnet when the data was frozen, so its counts were still incomplete.
Loading interactive chart…
Loading interactive chart…
| Metric | N | Pooled Spearman ρ |
|---|---|---|
| Specification rework | 34 | 0.75 |
| New EIP interactions | 34 | 0.56 |