Почему в протоколе Ethereum нет индикатора неудачной транзакции?

Почему в протоколе Ethereum нет четкого индикатора отмененной транзакции?

Здесь есть эвристика , а также обходной путь с использованием Geth . Но, вероятно, есть способы, которыми протокол может предоставить четкий индикатор. Например, может ли квитанция о транзакции иметь логическое свойство outofgas?

Что может сделать протокол, чтобы обеспечить индикатор Out of Gas, и почему ничего не реализовано?

Я чувствую, что это может быть использовано в атаке, чтобы заставить узел выполнять дополнительную работу бесплатно. Я не знаю
Не лучше ли сделать EIP?
Я думаю, что это очень хорошая идея иметь эту информацию в квитанции о транзакции.

Ответы (2)

Большая часть протокола (и, в частности, квитанция о транзакции) имеет решающее значение для достижения консенсуса. Объем обрабатываемой информации должен быть максимально ограниченным и стабильным. Сообщение об ошибке не соответствует этим требованиям.

С другой стороны, реализации могут легко всплывать в виде всплывающей подсказки. По крайней мере, так делают и Ethereumj, и Geth. В качестве примера см. свойство «execution_error» здесь:

http://api.blockcypher.com/v1/eth/main/txs/0x63b904db45e52924ff37e998a5553e2c9993bb89c0922c869fb7af8139af33ad

Для Geth, вы используете или что-то еще, где поможет debug.traceTransactionновый ответ на ethereum.stackexchange.com/questions/6007/… ?

Обновлен протокол в блоке 4370000 (Византия) так, что statusв квитанции добавлен индикатор.

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

Вот пример, показывающий statusполе:

{ blockHash: '0xb1fcff633029ee18ab6482b58ff8b6e95dd7c82a954c852157152a7a6d32785e',
  blockNumber: 4370000,
  contractAddress: null,
  cumulativeGasUsed: 21000,
  gasUsed: 21000,
  logs: [],
  logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
  root: null,
  status: 1, // **** HERE IS THE STATUS FIELD *****
  transactionHash: '0x1421a887a02301ae127bf2cd4c006116053c9dc4a255e69ea403a2d77c346cf5',
  transactionIndex: 0 }

(Блоки до 4370000 будут иметь statusнулевое значение.)

Подробнее здесь .

Что вы получите в поле статуса, если вызовете eth.getTransactionReceipt(transactionHash) до того, как блок, связанный с хэшем Tx, будет добыт?