--- eip: 3521 title: Reduce access list cost author: Matt Garnett (@lightclient) discussions-to: https://ethereum-magicians.org/t/eip-3521-reduce-access-list-cost/6072 status: Stagnant type: Standards Track category: Core created: 2021-04-15 requires: 2028, 2930 --- ## Simple Summary Reduce the cost of declaring `tx.to` storage keys in access lists. ## Motivation Currently, a transaction must read at least 25 distinct storage slots in `tx.to` before it's more expensive to forego an access list. ``` ACCESS_LIST_ADDRESS_COST + (ACCESS_LIST_STORAGE_KEY_COST + WARM_STORAGE_READ_COST) * x = COLD_SLOAD_COST * x x = 24 ``` EIP-2930 requires the address under which the storage keys reside be declared explicitly, since it must be added to the EIP-2929 `accessed_addresses` list. However, `tx.to` is a special case that is added by default, so paying `ACCESS_LIST_ADDRESS_COST` for `tx.to` is essentially paying twice for the same address. Avoiding overpayment here will reduce the differential to just 5 unique reads before using an access list is cheaper -- making them a more attractive option. ## Specification Treat the first occurrence of `tx.to` in an access list as `calldata` for gas accounting purposes. Do not charge `ACCESS_LIST_ADDRESS_COST` for it. Storage keys underneath the address are unaffected. If `tx.to == nil`, `tx.to` is defined be the derived contract address created by the transaction. ## Rationale ### Why charge at all? EIP-2930 is specifically written to make access lists simple to reason about and validate. It may be possible to modify the structure of the access list to avoid including `tx.to` explicitly, but this would renege on the spirit of EIP-2930. ### Why charge as `calldata`? The cost of `calldata` was thoroughly analyzed in EIP-2028 to determine a fair value that is not susceptible to denial-of-service attacks. We consider this the lower bound on how much transaction data should cost. Since there is no computation burden imposed for adding `tx.to` to the `accessed_addresses` map (it's added by default by [EIP-2929](./eip-2929.md)), there is no reason to charge more than the absolute minimum for the data. ## Test Cases ``` { "0xffffffffffffffffffffffffffffffffffffffff": [] } cost = 320 { "0x00ffffffffffffffffffffffffffffffffffffff": [] } cost = 308 { "0xffffffffffffffffffffffffffffffffffffffff": [] "0xffffffffffffffffffffffffffffffffffffffff": [] } cost = 2720 { "0xffffffffffffffffffffffffffffffffffffffff": [ "0x00" ] "0xffffffffffffffffffffffffffffffffffffffff": [] } cost = 4620 { "0xffffffffffffffffffffffffffffffffffffffff": [ "0x00" ] "0xffffffffffffffffffffffffffffffffffffffff": [ "0x00" ] } cost = 6520 ``` ## Backwards Compatibility No issues. ## Security Considerations None. ## Copyright Copyright and related rights waived via [CC0](../LICENSE.md).