AlertSourceDiscuss
Skip to content

EIP-3978: Gas refunds on reverts

Reprice reverted SSTORE/CREATE/SELFDESTRUCT/LOGX operations gas via gas refund mechanism

🚧 StagnantCore

Stagnant

This EIP has had no recent activity for at least 6 months, and has automatically been marked as stagnant. This EIP should not be used in production.

If you are interested in helping move this EIP to final, create a PR to move this EIP back to Draft and add yourself as an author, and an EIP editor will help guide you through the process. Thank you!

AuthorsAnton Bukov (@k06a), Mikhail Melnik (@ZumZoom)
Created2021-09-16

Abstract ​

For reverted state modification operations, keep access cost, but refund modification cost.

Motivation ​

Reverting a transaction, or any of its sub-calls, drops any state modifications that happened inside. But now, users are being charged for the dropped modifications as if they persisted.

Since EIP-3298, the gas refund mechanism works for storage restores only inside the same transaction. But on revert, the gas refund is not increased; it is completely erased. It can even be cheaper to transfer tokens back at the end of a transaction instead of reverting, to keep the existing gas refund. This should be changed.

  • Reverted SSTORE deserves to be repriced to SLOAD gas (100 gas)
  • Reverted LOG0, LOG1, LOG2, LOG3 and LOG4 deserve to be repriced to 100 gas
  • Reverted CALL with value (positive_value_cost = 9,000 gas) deserves to be repriced to 100 gas
  • Reverted CALL with value and account creation (value_to_empty_account_cost = 25,000 gas) deserves to be repriced to 100 gas
  • Reverted CREATE and CREATE2 (32,000 gas) deserve to be repriced to 100 gas
  • Reverted SELFDESTRUCT (5,000 or 25,000 gas) deserves to be repriced to 100 gas

Moreover, it seems fair to charge CREATE and CREATE2 operations 32,000 fix price conditionally only if returned bytecode is not empty.

Specification ​

For each callframe, track revert_gas_refund, initially 0.

The set of operations that modify revert_gas_refund are:

  • SSTORE
  • LOG0, LOG1, LOG2, LOG3, LOG4
  • CALL
  • CREATE, CREATE2
  • SELFDESTRUCT

They increase revert_gas_refund as follows:

javascript
call.revert_gas_refund += operation.gas - WARM_STORAGE_READ_COST

And in case of revert let's use this value instead of just erasing gas_refund:

javascript
if (call.reverted) {
    // existing behavior
    tx.gas_refund -= call.gas_refund;
    
    // New behavior added to existing according to the EIP-3978
    tx.gas_refund += call.revert_gas_refund;
}

Rationale ​

Gas should reflect the cost of use. The revert cost reflects the cost of access during execution, but not the cost of modification.

Backwards Compatibility ​

No known backward incompatibilities.

Test Cases ​

TBD

Reference Implementation ​

TBD

Security Considerations ​

TBD

Copyright and related rights waived via CC0.

Citation

Please cite this document as:

Anton Bukov, Mikhail Melnik, "EIP-3978: Gas refunds on reverts[DRAFT]," Ethereum Improvement Proposals, no. 3978, 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3978.