https://ethereum-magicians.org/t/core-eips-in-an-executable-spec-world/8640
Today, Core EIPs are used to specify changes affecting the execution layer (EL) which need to be activated through coordinated network upgrades (a.k.a. soft/hard forks).
Core EIPs currently serve two purposes: explaining the motivation/rationale/security implications of the change and formally specifying it. While the former is very useful, and helps the Ethereum community understand and debate changes, the latter isn’t ideal for a few reasons:
We now (almost!) have an executable specification for the EL as well (link). Here is a proposal for how we could harmonize the process across EL + CL.
A few things we are trying to optimize for here:
Separate Core EIPs from other EIP categories, and store them directly in the executable and consensus spec repositories. The technical “Specification” section would instead be represented by the accompanying changes to the specification itself, while the other text-based sections would move into reStructuredText files alongside the code changes in the same repository.
Similar to (1), but keep using Core EIPs as a way to describe changes, provide rationale, etc. and link to the EL and/or CL specs for actual implementation details.
Currently all EIPs live in the ethereum/EIPs
repository.
Under this proposal, the specification for changes would instead live in ethereum/execution-specs
and ethereum/consensus-specs
under a subdirectory.
If Core EIPs were moved to the specifications repository as well, they would be formatted with reStructuredText for consistency with the inline documentation.
Make the following changes to the template:
Specification
If Core EIPs remain in the EIP repository, allow links to ethereum/execution-specs
and ethereum/consensus-specs
in this section.
Test Cases
TBD.
Reference Implementation
Make this section optional, for cases where things are easier to express using a different notation, but the implementation(s) in the specs repositories should be considered canonical.
Use branches to highlight EIPs in various stages, specifically:
master
: what is currently live on the Ethereum mainnetforks/$FORK_NAME
: PR target branch for EIPs slated for inclusion in $FORK_NAME
eips/$EIP_NUMBER
: a specific EIP’s specificationWhen an EIP goes from being proposed to being Considered for Inclusion (CFI) for a fork, merge eips/$EIP_NUMBER
into forks/$FORK_NAME
. When $FORK_NAME
is deployed on mainnet, merge forks/$FORK_NAME
into master
.
Note: if a CFI’d EIP is then removed from the fork specification, the merging of it into $FORK_NAME
will have to be reverted.
This means that specifications for historical EIPs will forever live as branches in the executable spec repository. If the EIP wants to be proposed for another fork, an author must update its branch by rebasing it.
Currently, Core EIPs roughly follow this process:
Stage | Name | EIP Location | Description |
---|---|---|---|
0 | Pre-Draft | any git repository | Open PR in ethereum/EIPs , no requirements |
1 | Draft | ethereum/EIPs master |
Meets minimum requirements in EIP-1 |
2 | Review | ethereum/EIPs master |
EIP is fully specified, but changes are expected. |
3 | Last Call | ethereum/EIPs master |
Changes are no longer expected to the EIP. Required before testnet deployements. |
4 | Final | ethereum/EIPs master |
EIP is live on mainnet. Material changes are no longer possible. |
Note that EIPs tend to be made CFI when they are either in Draft or Review.
Instead if we, as an example, combine this with the Executable Specifications flow using a single repository, we get:
Stage | Name | Specification Location | Description |
---|---|---|---|
0 | Pre-Draft | any git repository | Open PR in ethereum/execution-specs , no requirements. |
1 | Draft | ethereum/execution-specs eips/4444 |
Meets minimum requirements in EIP-1 |
2 | Review | ethereum/execution-specs eips/4444 |
EIP is fully specified, but changes are expected. |
3 | Last Call | ethereum/execution-specs eips/4444 |
Changes are no longer expected to the EIP. Required before testnet deployements. |
4 | Final | master |
Material changes are no longer possible. |
If we were to keep Core EIPs alongside Executable Specifications, you would have the following flow:
Stage | Name | Specification Location | Description |
---|---|---|---|
0 | Pre-Draft | any git repositories | Open PR in ethereum/eips and ethereum/execution-specs , no requirements. |
0.5 | Draft | ethereum/EIPs master and any git repository |
Once PR is merged in eips , use the EIP number to name the execution-specs branch. |
1 | Draft | ethereum/EIPs master and ethereum/execution-specs eips/4444 |
Meets minimum requirements in EIP-1, has EIP number assigned. |
2 | Review | ethereum/EIPs master and ethereum/execution-specs eips/4444 |
EIP is fully specified, has a specification in execution-specs , but changes are expected. |
3 | Last Call | ethereum/EIPs master andethereum/execution-specs eips/4444 |
Changes are no longer expected to the EIP. Required before testnet deployements. |
4 | Final | ethereum/EIPs master and ethereum/execution-specs forks/london |
Material changes are no longer possible. |
Note: this would apply across both the EL and CL, implying that CL changes would also require an EIP for specification.
One contentious aspect of moving to executable specifications is whether to keep using Core EIPs in theeips
repository to describe non-code aspects of the change, or whether to exclusively use exectuable specifications for everything.