Как обнаружить неудачную транзакцию после византийской вилки, поскольку код REVERT не потребляет весь газ?

Pre Византийская вилка, я мог бы использовать gas == gasUsed, чтобы обнаружить, когда транзакция потерпела неудачу (подробности см. в Как можно определить статус транзакции из сброшенной ошибки, когда газ может быть точно то же, что и газ для успешной транзакции?

После византийской вилки возвратный код операции теперь возвращает намного меньшую сумму газа. Как обнаружить неудачную транзакцию после византийской вилки?

См. также:

30 голосов | спросил The Officious BokkyPooBah 9 +03002017-10-09T15:40:57+03:00312017bEurope/MoscowMon, 09 Oct 2017 15:40:57 +0300 2017, 15:40:57

2 ответа


36

Резюме

После византийской вилки eth.getTransactionReceipt(...) вернет поле status. Поле статуса имеет значение 0, когда транзакция завершилась с кодом кода REVERT и 1, когда транзакция прошла успешно.


Обновление 10 октября 2017 г.

Отвечая на комментарий @ thomas-jay-rush, когда транзакция завершилась неудачей по другой причине, кроме REVERT (т.е. THROW), поле статуса будет иметь значение 0 и gasUsed будет равно gas. В качестве примера см. Tx 0xa0a5e34b .



Подробнее

Я сконфигурировал номер блока Византии в своем блочном блоке dev, используя следующий 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"
    }
  }
}

Вижу византийская вилка активна в следующем сообщении geth:

  

INFO [10-09 | 23: 30: 37] Инициализированная конфигурация цепи config = "{ChainID: Homestead: 1 DAO: DAOSupport: false EIP150: EIP155: EIP158: Византия: 12 Двигатель: неизвестно}"


Недействительные транзакции имеют получение транзакции status Of 0x0

Ниже приведена информация о получении транзакции из неудачной транзакции с кодом кода REVERT:

> eth.getTransactionReceipt("0x6c039439191ed046f8d4a92734bb6c23b92c175df39ce2f089ac84c590b94918")
{
  blockHash: "0xf25b938c85772aa0abbbc9931e6da7a6e46c577619fb5004f2d85fdbe359eb60",
  blockNumber: 89,
  contractAddress: null,
  cumulativeGasUsed: 35983,
  from: "0xa11aae29840fbb5c86e6fd4cf809eba183aef433",
  gasUsed: 35983,
  ...
  status: "0x0",
  to: "0x0e946b999033257976aa5cbe0e3530618ca1582d",
  transactionHash: "0x6c039439191ed046f8d4a92734bb6c23b92c175df39ce2f089ac84c590b94918",
  transactionIndex: 0
}

Тот же статус status: "0x0" возвращается при выполнении команды throw, скомпилированной с помощью Solidity 0.4.11.


Успешные транзакции имеют получение транзакции status Of 0x1

И вот информация о получении транзакции из успешной транзакции:

> 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 не включает поле status.


Может ли статус быть чем-то другим, чем просто 0 (сбой) и 1 (успех)?

Из https: //github .com /Эфириум /ая-Эфириум /BLOB /Master /ядро ​​/типов /receipt.go # L39-L42 :

  • ReceiptStatusFailed = uint(0)
  • ReceiptStatusSuccessful = uint(1)

Существует только статус неудачного (= 0) или успешного (= 1).

См. EIP 658: Внедрение данных возврата транзакций в квитанциях для дальнейшегоинформация.


Как EtherScan в настоящее время обрабатывает статус византийской вилки на Ropsten?

Вот транзакция, которая успешно выполнена - 0x142b8830

И вот транзакция, которая не сработала с помощью кода операции REVERT - 0x67a5f644

Неудачную транзакцию нельзя отличить от успешной транзакции в EtherScan в настоящее время, за исключением того, что неудавшаяся транзакция потребляла меньше газа, чем успешная транзакция, а неудавшаяся транзакция не регистрировала событие, но успешная транзакция сделала.

Я пишу EtherScan об этой потенциальной проблеме.

Обновление 15 октября 2017 г. Теперь на странице транзакций EtherScan отображается поле TxReceipt Status: , на котором отображается Успех или Сбой .

ответил The Officious BokkyPooBah 9 +03002017-10-09T15:40:57+03:00312017bEurope/MoscowMon, 09 Oct 2017 15:40:57 +0300 2017, 15:40:57
0

Ненавижу говорить, но иногда используемый газ и подаваемый газ одинаковы, и ему это удалось.

Не могу вспомнить, что, думаю, это Parity - где оценки на 100% точны.

ответил Dave Appleton 11 +03002017-10-11T02:12:17+03:00312017bEurope/MoscowWed, 11 Oct 2017 02:12:17 +0300 2017, 02:12:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132