Summary
After the Byzantium fork, eth.getTransactionReceipt(...)
will return a status
field. The status field has a value of 0
when a transaction has failed with the REVERT
opcode and 1
when the transaction has succeeded.
Update Oct 10 2017
Responding to the comment by @thomas-jay-rush, when a transaction fails for a reason other than REVERT
(i.e. THROW
), the status field will have a value of 0
and gasUsed
will be equal to gas
. See tx 0xa0a5e34b as an example.
Details
I have configured the Byzantium block number in my dev blockchain using the following genesis.json
:
{
"config": {
"homesteadBlock": 1,
"byzantiumBlock": 12
},
"nonce": "0",
"difficulty": "0x400",
"mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x",
"gasLimit": "0x3B4A1B44",
"alloc": {
"0xa00af22d07c87d96eeeb0ed583f8f6ac7812827e": {
"balance": "10000000000000000000000000"
},
"0xa11aae29840fbb5c86e6fd4cf809eba183aef433": {
"balance": "10000000000000000000000000"
}
}
}
I can see the Byzantium fork is active in the following geth
message:
INFO [10-09|23:30:37] Initialised chain configuration config="{ChainID: Homestead: 1 DAO: DAOSupport: false EIP150: EIP155: EIP158: Byzantium: 12 Engine: unknown}"
Failing Transactions Have A Transaction Receipt status
Of 0x0
Here is the transaction receipt information from a failing transaction with the REVERT
opcode:
> eth.getTransactionReceipt("0x6c039439191ed046f8d4a92734bb6c23b92c175df39ce2f089ac84c590b94918")
{
blockHash: "0xf25b938c85772aa0abbbc9931e6da7a6e46c577619fb5004f2d85fdbe359eb60",
blockNumber: 89,
contractAddress: null,
cumulativeGasUsed: 35983,
from: "0xa11aae29840fbb5c86e6fd4cf809eba183aef433",
gasUsed: 35983,
...
status: "0x0",
to: "0x0e946b999033257976aa5cbe0e3530618ca1582d",
transactionHash: "0x6c039439191ed046f8d4a92734bb6c23b92c175df39ce2f089ac84c590b94918",
transactionIndex: 0
}
The same status: "0x0"
is returned when executing a throw
instruction compiled with Solidity 0.4.11 .
Successful Transactions Have A Transaction Receipt status
Of 0x1
And here is the transaction receipt information from a successful transaction:
> eth.getTransactionReceipt("0xbdacfebf6299a260adfa993421aeb26353aa2b4dd0e6f290d2acfd6a9b828a62")
{
blockHash: "0xbda8b2d2850306e8a02be074f11ffe4f2243003df6e9c4adb1bbdcda1faf2e42",
blockNumber: 87,
contractAddress: null,
cumulativeGasUsed: 126952,
from: "0xa11aae29840fbb5c86e6fd4cf809eba183aef433",
gasUsed: 126952,
logs: [{
address: "0x0e946b999033257976aa5cbe0e3530618ca1582d",
blockHash: "0xbda8b2d2850306e8a02be074f11ffe4f2243003df6e9c4adb1bbdcda1faf2e42",
blockNumber: 87,
data: "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000",
logIndex: 0,
removed: false,
topics: ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x000000000000000000000000a33a6c312d9ad0e0f2e95541beed0cc081621fd0", "0x000000000000000000000000a55a151eb00fded1634d27d1127b4be4627079ea"],
transactionHash: "0xbdacfebf6299a260adfa993421aeb26353aa2b4dd0e6f290d2acfd6a9b828a62",
transactionIndex: 0
}, {
...
}],
...
status: "0x1",
to: "0x0e946b999033257976aa5cbe0e3530618ca1582d",
transactionHash: "0xbdacfebf6299a260adfa993421aeb26353aa2b4dd0e6f290d2acfd6a9b828a62",
transactionIndex: 0
}
eth.getTransactionReceipt(...)
pre-Byzantium fork does not include the status
field.
Can The Status Be Anything Other Than Than Just 0 (Fail) And 1 (Success)?
From https://github.com/ethereum/go-ethereum/blob/master/core/types/receipt.go#L39-L42:
ReceiptStatusFailed = uint(0)
ReceiptStatusSuccessful = uint(1)
There is only be a status of failed (=0) or successful (=1).
See EIP 658: Embedding transaction return data in receipts for further information.
How Does EtherScan Currently Handle The Byzantium Fork Status On Ropsten?
Here's a transaction that is successfully executed - 0x142b8830
And here's a transaction that has failed using the REVERT
opcode - 0x67a5f644
The failed transaction cannot be distinguished from the successful transaction in EtherScan currently, except that the failed transaction consumed less gas than the successful transaction, and the failed transaction did not log an event but the successful transaction did.
I've pinged EtherScan about this potential issue.
Update Oct 15 2017 There is now a TxReceipt Status: field on the EtherScan transaction page that displays Success or Fail.