Skip to content

Commit

Permalink
Modify eip-2930 gas accounting (ethereum#3521)
Browse files Browse the repository at this point in the history
* modify eip-2930 gas accounting

* add title

* add eip number and discussion link

* typo

* Update EIPS/eip-3521.md

Co-authored-by: Micah Zoltu <micah@zoltu.net>

* Update EIPS/eip-3521.md

* Update EIPS/eip-3521.md

* Update EIPS/eip-3521.md

Co-authored-by: Micah Zoltu <micah@zoltu.net>
  • Loading branch information
2 people authored and PhABC committed Jan 25, 2022
1 parent d764ae6 commit 59c4255
Showing 1 changed file with 105 additions and 0 deletions.
105 changes: 105 additions & 0 deletions EIPS/eip-3521.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
---
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: Draft
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](https://creativecommons.org/publicdomain/zero/1.0/).

0 comments on commit 59c4255

Please sign in to comment.