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.
En etherscan, busque el TxReceipt Status
que tendrá Fail
en rojo o Success
en verde.
Ejemplo de falla: https://ropsten.etherscan.io/tx/0x67a5f6442f49a5da6ff8682250a8eef899d9dc0c5adf20b683709433902b5956
eth.getTransactionReceipt(transactionHash)
devolverá un status
campo que tiene un valor de 0
cuando una transacción ha fallado y 1
cuando la transacción ha tenido éxito.
Aquí hay un ejemplo que muestra el status
campo:
{ 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í .
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
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.
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".
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.
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?
tocar
ética