mirror of
https://github.com/status-im/EIPs.git
synced 2025-02-23 20:28:21 +00:00
I have gone through and updated all existing EIPs to match this rule, including EIP-1. In some cases, people were using markdown citations, I suspect because the long-form was a bit verbose to inline. Since the relative path is quite short, I moved these to inline but I wouldn't be opposed to putting them back to citation format if that is desired by the authors. In doing the migration/cleanup, I found some EIP references to EIPs that don't actually exist. In these cases I tried to excise the reference from the EIP as best I could. It is worth noting that the Readme actually already had this rule, it just wasn't expressed properly in EIP-1 and the "Citation Format" section of the readme I think caused people a bit of confusion (when citing externally, you should use the citation format).
77 lines
3.0 KiB
Markdown
77 lines
3.0 KiB
Markdown
---
|
|
eip: 2677
|
|
title: Limit size of `initcode`
|
|
author: Martin Holst Swende (@holiman), Pawel Bylica (@chfast), Alex Beregszazi (@axic)
|
|
discussions-to: https://ethereum-magicians.org/t/eip-2677-limit-size-of-initcode/4550
|
|
status: Draft
|
|
type: Standards Track
|
|
category: Core
|
|
created: 2020-05-18
|
|
---
|
|
|
|
## Simple Summary
|
|
|
|
Enforce a maximum size limit (`max_initcode_size`) of `49152` (`0xc000`) for `initcode`.
|
|
|
|
## Abstract
|
|
|
|
Enforce a maximum size limit (`max_initcode_size`) for `initcode`. If the size of `initcode` exceeds `max_initcode_size`, then contract creation fails with an out of gas error.
|
|
|
|
Since [EIP-170](./eip-170.md) was implemented, there has been a size limit of `24576` (`0x6000`) on contract code. We propose to also limit the size of executable code to `2x` the above limit, i.e. `49152` (`0xc000`).
|
|
|
|
This also leads to two nice properties:
|
|
|
|
- instruction offset in code fits 16-bit value,
|
|
- code size fits 16-bit value.
|
|
|
|
## Motivation
|
|
|
|
When a client executes `initcode`, the client has to perform a jumpdest analysis. In some cases, the client also performs a `hash` of the code:
|
|
|
|
* To use as a key in a mapping containing result of a jumpdest analysis
|
|
* To use for address calculation within `CREATE2`.
|
|
|
|
The work performed during a jumpdest analysis scales linearly with the size of the code. Currently, a transaction can expand the memory once, and reuse the same memory segment (with minor modifications) to force the client to perform a lot of analysis/hashing, leading to slow block processing.
|
|
|
|
Historically, this was exploited in June 2017, precipitating the 1.6.5-patch release of [geth](https://github.com/ethereum/go-ethereum/releases/tag/v1.6.5)
|
|
|
|
The work performed during address calculation within `CREATE2` is charged in proportion with size of the code.
|
|
|
|
## Specification
|
|
|
|
There are three situations where this is applicable:
|
|
|
|
* `CREATE`,
|
|
* `CREATE2`,
|
|
* creation using a transaction with empty receiver.
|
|
|
|
In all these (and future) cases, the EVM should fail with Out Of Gas error if the code has a length more than `max_initcode_size`.
|
|
|
|
## Rationale
|
|
|
|
TBA
|
|
|
|
## Backwards Compatibility
|
|
|
|
This EIP requires a "network upgrade", since it modifies consenus-rules.
|
|
|
|
## Security Considerations
|
|
|
|
For client implementations, this EIP makes attacks based on jumpdest-analysis or hashing of code less problematic, so should increase the robustness of clients.
|
|
|
|
For layer 2, this EIP introduces failure-modes where there previously were none. There _could_ exist factory-contracts which deploy multi-level contract hierarchies, such that the code for multiple contracts are included in the initcode of the first contract. The author(s) of this EIP are not aware of any such contracts.
|
|
|
|
## Test Cases
|
|
|
|
Test cases should include the following cases,
|
|
|
|
- `CREATE`/`CREATE2`/`tx create` with `initcode_size` at `max_initcode_size`
|
|
- `CREATE`/`CREATE2`/`tx create` with `initcode_size` at `max_initcode_size+1`
|
|
|
|
## Implementation
|
|
|
|
TBA
|
|
|
|
## Copyright
|
|
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/).
|