A mismatch in the gas refund logic of EIP-7702's implementation between the geth
and reth
Ethereum client implementations resulted in inconsistent gas accounting on OP Mainnet, causing a chain split between op-geth
and op-reth
.
User assets are safe, and this issue only affects OP Mainnet node operators running op-reth
.
0xf45b336f9025585fbb560553dd4d0c5b80e8d2af535d4866a676eef9602d2020
136526192
The discrepancy originated from how each client handled refunds during transaction processing. Specifically:
This resulted in a 12,500 difference in gasUsed
, causing inconsistencies between clients’ view of the chain.
Reth correctly implemented the EIP-7702 specification, checking if an account is "empty" (per EIP-161's definition,) whereas geth's implementation of the EIP-7702 pre-execution checks checked if the account existed within the state. This discrepancy cannot affect Ethereum Mainnet, because empty accounts are unable to be persisted within the state following EIP-161 (included within the Spurious Dragon hardfork,) and all known empty accounts were cleared from the state with https://etherscan.io/tx/0xf955834bfa097458a9cf6b719705a443d32e7f43f20b9b0294098c205b4bcc3d.
The issue was traced back to legacy empty accounts that originated from Optimistic Virtual Machine (OVM) prior to the November 2021 regenesis and persisted through the Bedrock migration. Four known empty accounts were identified:
0x44D61821a42C175894707bEbB46B81535eB68Dd0
0x640e7cc27b750144ED08bA09515F3416A988B6a3
0xB34F9785E71B3903389A880C175E9c912520c1c6
0xbe5A1359666a15144e10A3A6081653339ba2BD9D