-
Notifications
You must be signed in to change notification settings - Fork 5.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
REVERT instruction #206
Merged
Merged
REVERT instruction #206
Changes from all commits
Commits
Show all changes
17 commits
Select commit
Hold shift + click to select a range
a0ef90d
Draft EIP for the REVERT opcode
axic bb13681
Assign EIP140 to REVERT
axic f1af1f3
Add test case for REVERT
axic 729b590
Swap the stack items for REVERT to be in line with RETURN
axic c7944c4
Remove rationale (it is already explained twice)
axic 4455e2c
Mention that the execution is considered as failed
axic 793f88b
Rename eip-draft_revert_opcode.md to eip-140.md
cdetrio efd2333
Some clarifications.
chriseth 8740170
REVERT returns 0 in CALL/CREATE
axic 5051d0f
Mark REVERT as accepted
axic 3355c09
Limit the backward compatibility
pirapira 1d93a80
Change the status to Final
pirapira 8e92d5b
Improvements after a week of silence on https://github.com/ethereum/E…
pirapira a5eb63d
Merge branch 'master' into revert
pirapira f0298a1
Merge branch 'master' into revert
pirapira bccf7d1
Simplify the title
axic 75121e2
Update eip-140.md
pirapira File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,58 @@ | ||
Reserved for https://github.com/ethereum/EIPs/pull/206 | ||
## Preamble | ||
|
||
EIP: 140 | ||
Title: REVERT instruction | ||
Author: Alex Beregszaszi, Nikolai Mushegian (nikolai@nexusdev.us) | ||
Type: Standard Track | ||
Category: Core | ||
Status: Final | ||
Created: 2017-02-06 | ||
|
||
## Simple Summary | ||
|
||
The `REVERT` instruction provides a way to stop execution and revert state changes, without consuming all provided gas and with the ability to return a reason. | ||
|
||
## Abstract | ||
|
||
The `REVERT` instruction will stop execution, roll back all state changes done so far and provide a pointer to a memory section, which can be interpreted as an error code or message. While doing so, it will not consume all the remaining gas. | ||
|
||
## Motivation | ||
|
||
Currently this is not possible. There are two practical ways to revert a transaction from within a contract: running out of gas or executing an invalid instruction. Both of these options will consume all remaining gas. Additionally, reverting an EVM execution means that all changes, including LOGs, are lost and there is no way to convey a reason for aborting an EVM execution. | ||
|
||
## Specification | ||
|
||
On blocks with `block.number >= BYZANTIUM_FORK_BLKNUM`, the `REVERT` instruction is introduced at `0xfd`. It expects two stack items, the top item is the `memory_offset` followed by `memory_length`. It does not produce any stack elements because it stops execution. | ||
|
||
The semantics of `REVERT` with respect to memory and memory cost are identical to those of `RETURN`. The sequence of bytes given by `memory_offset` and `memory_length` is called "error message" in the following. | ||
|
||
The effect of `REVERT` is that execution is aborted, considered as failed, and state changes are rolled back. The error message will be available to the caller in the returndata buffer and will also be copied to the output area, i.e. it is handled in the same way as the regular return data is handled. | ||
|
||
The cost of the `REVERT` instruction equals to that of the `RETURN` instruction, i.e. the rollback itself does not consume all gas, the contract only has to pay for memory. | ||
|
||
In case there is not enough gas left to cover the cost of `REVERT` or there is a stack underflow, the effect of the `REVERT` instruction will equal to that of a regular out of gas exception, i.e. it will consume all gas. | ||
|
||
In the same way as all other failures, the calling opcode returns `0` on the stack following a `REVERT` opcode in the callee. | ||
|
||
In case `REVERT` is used in the context of a `CREATE` or `CREATE2` call, no code is deployed, `0` is put on the stack and the error message is available in the returndata buffer. | ||
|
||
The content of the optionally provided memory section is not defined by this EIP, but is a candidate for another Informational EIP. | ||
|
||
## Backwards Compatibility | ||
|
||
This change has no effect on contracts created in the past unless they contain `0xfd` as an instruction. | ||
|
||
## Test Cases | ||
|
||
``` | ||
6c726576657274656420646174616000557f726576657274206d657373616765000000000000000000000000000000000000600052600e6000fd | ||
``` | ||
|
||
should: | ||
- return `0x726576657274206d657373616765` as `REVERT` data, | ||
- the storage at key `0x0` should be left as unset and | ||
- use 20024 gas in total. | ||
|
||
## Copyright | ||
|
||
Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this mean here (for
CREATE
andCREATE2
) that the error message is available ONLY in the returndata buffer for these opcodes, or is implicitly the output area implied?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The creation opcodes do not have an output area.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here, @chriseth means an output area as a range of the memory in the frame that executes
CREATE
orCREATE2
.