forked from DecentralizedClimateFoundation/DCIPs
87 lines
2.7 KiB
Markdown
87 lines
2.7 KiB
Markdown
|
---
|
||
|
eip: 3978
|
||
|
title: Gas refunds on reverts
|
||
|
description: Reprice reverted SSTORE/CREATE/SELFDESTRUCT/LOGX operations gas via gas refund mechanism
|
||
|
author: Anton Bukov (@k06a), Mikhail Melnik (@ZumZoom)
|
||
|
discussions-to: https://ethereum-magicians.org/t/eip-3978-gas-refunds-on-reverts/7071/
|
||
|
status: Stagnant
|
||
|
type: Standards Track
|
||
|
category: Core
|
||
|
created: 2021-09-16
|
||
|
updated: 2022-02-14
|
||
|
requires: 2929
|
||
|
---
|
||
|
|
||
|
## 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](./eip-3298.md), 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
|
||
|
Copyright and related rights waived via [CC0](../LICENSE.md).
|