¿Cómo saber si una transacción se realizó o no? (sin gasolina)

Aparentemente, cuando se envían transacciones desde una cuenta en lugar de una billetera, el gas gastado es pequeño (21K) y no es suficiente para enviar ether a una billetera de contrato (sin gasolina, por así decirlo).

Cuando esto sucede, la transacción no debería realizarse (o cancelarse , como se dice aquí ), sin embargo, parece que todavía está registrada en la cadena de bloques, ¿por qué? ejemplo _

¿Etherscan.io no proporciona ninguna pista sobre si la transacción terminó siendo válida o no? En este caso debería estar marcado como CANCELADO/NO VÁLIDO en esa URL, según tengo entendido.

ok, gracias, por cierto, ¿hay alguna manera de saber este estado a través de RPC? debo abrir una nueva pregunta sobre esto o ya hay una?
Podría ser similar a esta pregunta ethereum.stackexchange.com/q/1181/42 ? RPC eth_getTransactionReceipt y verificar el gas utilizado es una buena manera de averiguarlo. Lo siento, no marcaré si abres una nueva pregunta.

Respuestas (5)

Uso del explorador de cadena de bloques etherscan

En etherscan, busque el TxReceipt Statusque tendrá Failen rojo o Successen verde.

Ejemplo de falla: https://ropsten.etherscan.io/tx/0x67a5f6442f49a5da6ff8682250a8eef899d9dc0c5adf20b683709433902b5956

Usando el recibo

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 }

Más detalles aquí .


Histórico

Para ver si una transacción se quedó sin gas, puede ingresar la transacción (hash) en https://live.ether.camp y luego hacer clic en "VM Trace". (Para la red de prueba Morden, use https://morden.ether.camp )

O inserte la transacciónHash en esta url:

https://live.ether.camp/transaction/<transactionHash>/vmtrace#0

Para la transacción mencionada en la pregunta,022f440fa96eb469363804d7b6c52321d4f409fa76578cdbdc5f04ff494b1321

aquí está la salida https://live.ether.camp/transaction/022f440fa96eb469363804d7b6c52321d4f409fa76578cdbdc5f04ff494b1321/vmtrace#0

ingrese la descripción de la imagen aquí

Esta transacción se quedó sin combustible de inmediato. Algunas transacciones pueden quedarse sin gas después de hacer algunos cálculos, y al hacer clic en Operaciones se mostrará cada paso que se está realizando y cuándo ocurre la falta de gas.

¿Cómo es posible que el estado falle, pero el contrato aún se implemente? ¿No debería revertirse la transacción en caso de falla?
@k06a Piense que debería ser una pregunta nueva e incluya el hash de su transacción para que la comunidad pueda ayudar a depurar.

Entonces, su transacción se realizó en el sentido de que se transmitió a la red y se incluyó en un bloque. Sin embargo, como ya sugirió, la gasolina que pagó no fue suficiente para esta transacción. Para evitar estados corruptos en este caso , se revertirán todos los efectos de una transacción . El único efecto es que los costos del gas (en Ether) se reducirán de su cuenta y se acreditarán al minero que incluyó la transacción en un bloque.

En https://etherscan.io/ no hay una indicación clara de si el gas fue suficiente o no. Sin embargo, el sitio indica el "Gas acumulado utilizado" y si es igual al "Gas" (el límite de gas que usted estableció), entonces este es un indicador muy fuerte de que la transacción se quedó sin gas. (En teoría, podría haber usado esa cantidad exacta, pero esto es muy poco probable)

http://frontier.ether.camp/ es un explorador de bloques más sofisticado y aquí puede ver si se lanzó o no la excepción "sin gasolina".

Cuando está de vuelta, creo que el enlace es en realidad live.ether.camp

Solo para aclarar la pregunta anterior, Etherscan ahora muestra si hay un error durante la ejecución del contrato. Un comentario rojo indica un error y un comentario verde indica una invocación de contrato confirmada .

La mayoría de las excepciones para contratos fallidos se deben a "falta de combustible". Y como PaulS + mKoeppelmann ha dicho anteriormente, una forma de determinar si se ha quedado sin gasolina es hacer coincidir el gasSent == gasUsed. Sin embargo, el uso exclusivo de este método sería inexacto, ya que puede haber otras excepciones en las que el contrato llega antes de que se quede sin combustible.

gracias, ¿ejecutas etherscan.io?
genial, pero todavía me preocupa considerar transacciones sin gas cuando exactamente gasSent == gasUsed, en caso de que la operación requiera esa cantidad de gas (y no más) para completarse; puede ser un caso raro, pero podría pasar
A todos los efectos, debe hacerlo. Como dije anteriormente, no es definitivo, aunque lo más probable es que haya otras excepciones y siempre es posible proporcionar suficiente gas.
Entonces, ¿está agregando la advertencia roja incluso en los casos en que podría ser suficiente gasolina?
Ese es uno de los criterios que estoy viendo, pero no el único, sin embargo, de ahí el signo de interrogación "?". La única forma de estar 100% seguro es hacer un vmtrace (ethercamp) o usar la debug.transaction que se lanzará en las futuras versiones de geth (parche hecho por ppratscher). Esto le permitirá reproducir la transacción completa y rastrear cada paso que tomó la máquina virtual. Una vez que esté ampliamente disponible, espero que la mayoría de los exploradores de bloques utilicen esta información actualizada. Solo mejorará con el tiempo :-)
Hay tres casos cuando gasSent == gasUsed. (1) todo el gas se agotó y, por lo tanto, la transacción se quedó sin gas; (2) hubo un 'lanzamiento' en cuyo caso se traga todo el gas; y (3) la ejecución tiene éxito, pero se agotó la cantidad exacta de gas proporcionada. Los tipos de transacción (1) y (2) no tienen éxito. El tipo de transacción (3) sí. El caso (3) es la razón por la cual gasSent == gasUsed no es suficiente para saber si se acabó el gas y la razón por la que debe verificar el seguimiento para estar seguro.

La transacción en sí es válida y, por lo tanto, está en la cadena de bloques y es recogida por todos los exploradores de bloques. Pero debido a que no especificó suficiente gas, el código de contrato de la billetera se revierte y, por lo tanto, no se realiza ninguna transferencia de éter. El gas insuficiente especificado seguirá consumiéndose.

El explorador de bloques https://live.ether.camp/ indicará que la transacción se canceló y, si examina la vista de vmtrace, verá que se quedó sin gas.

Si desea determinar cómo se quedó sin combustible mediante programación, en lugar de realizar una depuración posterior, consulte:

¿Cómo puedo saber cuándo me he quedado sin gasolina programáticamente?