¿Por qué el protocolo Ethereum no tiene un indicador para una transacción que falló?

¿Por qué el protocolo Ethereum no tiene un indicador claro para una transacción que se revierte?

Hay una heurística aquí , así como una solución alternativa usando Geth . Pero probablemente hay formas en que el protocolo podría proporcionar un indicador claro. Por ejemplo, ¿el recibo de una transacción podría tener una propiedad booleana para outofgas?

¿Qué podría hacer el protocolo para proporcionar un indicador de falta de gas y por qué no se implementó ninguno?

Siento que podría usarse en un ataque para hacer que un nodo haga un trabajo adicional de forma gratuita. No sé
¿No sería una buena idea hacer un EIP?
Creo que es una muy buena idea tener esa información en el recibo de la transacción.

Respuestas (2)

La mayor parte del protocolo (y más particularmente el recibo de la transacción) es fundamental para el consenso. La cantidad de información que maneja debe ser lo más limitada posible y estable. Un mensaje de error realmente no se ajusta a esos requisitos.

Por otro lado, las implementaciones pueden generar fácilmente ese tipo de información. Al menos tanto Ethereumj como Geth lo hacen. Para ver un ejemplo, consulte la propiedad "execution_error" aquí:

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

Para Geth, ¿estás usando debug.traceTransactiono algo más donde una nueva respuesta a ethereum.stackexchange.com/questions/6007/… ayudaría?

Se actualizó el protocolo en el bloque 4370000 (Byzantium) por lo que statusse ha agregado un indicador a los recibos.

eth.getTransactionReceipt(transactionHash)devolverá un statuscampo que tiene un valor de 0cuando una transacción ha fallado y 1cuando la transacción ha tenido éxito.

Aquí hay un ejemplo que muestra el statuscampo:

{ 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 }

(Los bloques anteriores a 4370000 tendrán un statusvalor nulo).

Más detalles aquí .

¿Qué obtiene en el campo de estado si llama a eth.getTransactionReceipt(transactionHash) antes de que se extraiga el bloque asociado con el hash Tx?