EIP-2780 repricing: updating the cost of ETH transfers
Today every transfer pays a flat 21,000 gas, value or not.
We measure the end-to-end cost of each: ZERO_VALUE_TRANSFER for a
plain transfer and VALUE_TRANSFER for one that moves value, plus the
marginal TX_VALUE_COST between them. Each is a separate per-client,
per-case non-negative least squares fit on the runtime of
test_ether_transfers_onchain_receivers,
converted to proposed gas at the
100 Mgas/s anchor. Each
parameter's worst case is the most expensive driver across all clients and cases.
Preliminary results. Clients are still working on their block-access-list (BAL) optimizations, so these gas values are expected to change as that work lands.
Summary
Each row is a gas budget EIP-2780 allots to one parameter over the receiver
cases listed
(TX_BASE_COST = 12,000, COLD_ACCOUNT_ACCESS = 3,000, TX_VALUE_COST = 6,000).
Each cell is that client's worst proposed gas across those
cases: green clears the goal, amber is up to 25% over,
red is further over. Hover a goal name for the component sum behind it, its
parameter(s), and the cases it covers.
| Goal | Target | besu | erigon | geth | nethermind | reth |
|---|---|---|---|---|---|---|
| Transfer to self | 12,000 | 9,586 | 12,953 | 6,883 | 13,131 | 3,954 |
| No-value transfer | 15,000 | 12,638 | 14,416 | 9,629 | 16,643 | 5,947 |
| Transfer | 21,000 | 30,061 | 53,623 | 19,047 | 16,695 | 8,623 |
| No-value transfer to delegated account | 18,000 | 12,013 | 13,597 | 9,164 | 16,217 | 5,590 |
| Transfer to delegated account | 24,000 | 14,887 | 18,712 | 11,493 | 17,465 | 7,842 |
The goals are EIP-2780's own component sums, so they differ by how many accounts
a transfer touches: a self-transfer touches no second account, an ordinary
receiver one (COLD_ACCOUNT_ACCESS) and a delegated receiver two
(the delegating account and the one it points at). Away from self, a
VALUE_TRANSFER goal is the matching no-value goal plus
TX_VALUE_COST; a self-transfer moves value nowhere, so it is
charged the bare base cost either way and its row covers both parameters. A
client with no fit for a goal's cases shows —.
R² caveats: none — all worst-case drivers have R² > 0.5.
p-value caveats: none — all worst-case drivers have p ≤ 0.05.
Charts
Transfer to self — proposed gas per case vs. goal (12,000) (95% CI)
No-value transfer — proposed gas per case vs. goal (15,000) (95% CI)
Transfer — proposed gas per case vs. goal (21,000) (95% CI)
No-value transfer to delegated account — proposed gas per case vs. goal (18,000) (95% CI)
Transfer to delegated account — proposed gas per case vs. goal (24,000) (95% CI)
Model fit quality (R², worse of the two regime fits) per (client, case)
Jumpdest cost
Contract (jumpdest) is excluded from the charts above, but
still fit every run. This chart shows its proposed-gas diff against
Contract (24KB, unique code) — the case it's otherwise
closest to in shape — for both parameters, so the cost of the extra
JUMP is visible on its own.