From d17412d14fff7611aa52965971834e37c17589f5 Mon Sep 17 00:00:00 2001 From: pdobacz <5735525+pdobacz@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:35:21 +0200 Subject: [PATCH] Remove initcode/runtime definitions and simplify wording --- spec/eof.md | 14 +++++--------- spec/eof_future_upgrades.md | 4 ++-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/spec/eof.md b/spec/eof.md index da078c0..8525ba1 100644 --- a/spec/eof.md +++ b/spec/eof.md @@ -141,7 +141,7 @@ Creation transactions (tranactions with empty `to`), with `data` containing EOF - Find `intcontainer` size by reading all section sizes from the header and adding them up with the header size to get the full container size. 3. Validate the `initcontainer` and all its subcontainers recursively. - unlike in general validation `initcontainer` is additionally required to have `data_size` declared in the header equal to actual `data_section` size. - - validation includes checking that the container is an "initcode" container as defined in the validation section, that is, it does not contain `RETURN` or `STOP` + - validation includes checking that the `initcontainer` does not contain `RETURN` or `STOP` 4. If EOF header parsing or full container validation fails, transaction is considered valid and failing. Gas for initcode execution is not consumed, only intrinsic creation transaction costs are charged. 5. `calldata` part of transaction `data` that follows `initcontainer` is treated as calldata to pass into the execution frame 6. execute the container and deduct gas for execution @@ -201,7 +201,7 @@ The following instructions are introduced in EOF code: - pops `value`, `salt`, `input_offset`, `input_size` from the stack - peform (and charge for) memory expansion using `[input_offset, input_size]` - load initcode EOF subcontainer at `initcontainer_index` in the container from which `EOFCREATE` is executed - - let `initcontainer_size` be the size of this EOF subcontainer in bytes + - let `initcontainer` be that EOF container, and `initcontainer_size` its length in bytes - deduct `6 * ((initcontainer_size + 31) // 32)` gas (hashing charge) - check call depth limit and whether caller balance is enough to transfer `value` - in case of failure returns 0 on the stack, caller's nonce is not updated and gas for initcode execution is not consumed. @@ -291,19 +291,15 @@ The following instructions are introduced in EOF code: - the first code section must have a type signature `(0, 0x80, max_stack_height)` (0 inputs non-returning function) - `EOFCREATE` `initcontainer_index` must be less than `num_container_sections` - `EOFCREATE` the subcontainer pointed to by `initcontainer_index` must have its `len(data_section)` equal `data_size`, i.e. data section content is exactly as the size declared in the header (see [Data section lifecycle](#data-section-lifecycle)) -- `EOFCREATE` the subcontainer pointed to by `initcontainer_index` must be an "initcode" subcontainer, that is, it *must not* contain either a `RETURN` or `STOP` instruction. +- `EOFCREATE` the subcontainer pointed to by `initcontainer_index` *must not* contain either a `RETURN` or `STOP` instruction. - `RETURNCONTRACT` `deploy_container_index` must be less than `num_container_sections` -- `RETURNCONTRACT` the subcontainer pointed to `deploy_container_index` must be a "runtime" subcontainer, that is, it *must not* contain a `RETURNCONTRACT` instruction. +- `RETURNCONTRACT` the subcontainer pointed to `deploy_container_index` *must not* contain a `RETURNCONTRACT` instruction. - `DATALOADN`'s `immediate + 32` must be within `pre_deploy_data_size` (see [Data Section Lifecycle](#data-section-lifecycle)) - the part of the data section which exceeds these bounds (the `dynamic_aux_data` portion) needs to be accessed using `DATALOAD` or `DATACOPY` - no unreachable code sections are allowed, i.e. every code section can be reached from the 0th code section with a series of CALLF / JUMPF instructions, and section 0 is implicitly reachable. - it is an error for a container to contain both `RETURNCONTRACT` and either of `RETURN` or `STOP`. -- it is an error for a subcontainer to never be referenced in code sections of its parent container +- it is an error for a subcontainer to never be referenced in its parent container - it is an error for a given subcontainer to be referenced by both `RETURNCONTRACT` and `EOFCREATE` -- for terminology purposes, the following concepts are defined: - - an "initcode" container is one which does not contain `RETURN` or `STOP` - - a "runtime" container is one which does not contain `RETURNCONTRACT` - - note a container can be both "initcode" and "runtime" if it does not contain any of `RETURN`, `STOP` or `RETURNCONTRACT` (for instance, if it is only terminated with `REVERT` or `INVALID`). ## Stack Validation diff --git a/spec/eof_future_upgrades.md b/spec/eof_future_upgrades.md index d5d0add..04a458b 100644 --- a/spec/eof_future_upgrades.md +++ b/spec/eof_future_upgrades.md @@ -52,11 +52,11 @@ The [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) `ReceiptPayload` for thi - loads the initcode EOF container from the transaction `initcodes` array which hashes to `tx_initcode_hash` - fails (returns 0 on the stack) if such initcode does not exist in the transaction, or if called from a transaction of `TransactionType` other than `INITCODE_TX_TYPE` - caller's nonce is not updated and gas for initcode execution is not consumed. Only `TXCREATE` constant gas was consumed - - let `initcontainer_size` be the length of that EOF container in bytes + - let `initcontainer` be that EOF container, and `initcontainer_size` its length in bytes - in addition to hashing charge as in `EOFCREATE`, deducts `2 * ((initcontainer_size + 31) // 32)` gas (EIP-3860 charge) - just before executing the initcode container: - **validates the initcode container and all its subcontainers recursively** - - validation includes checking that the container is an "initcode" container as defined in the validation section, that is, it does not contain `RETURN` or `STOP` + - validation includes checking that the `initcontainer` does not contain `RETURN` or `STOP` - in addition to this, checks if the initcode container has its `len(data_section)` equal to `data_size`, i.e. data section content is exactly as the size declared in the header (see [Data section lifecycle](#data-section-lifecycle)) - fails (returns 0 on the stack) if any of those was invalid - caller’s nonce is not updated and gas for initcode execution is not consumed. Only `TXCREATE` constant, EIP-3860 gas and hashing gas were consumed