estado de la transacción

Una pregunta muy elemental, ¿cómo obtengo un estado de transacción después de activar la transacción? Quiero decir, supongamos que hago una transacción de envío donde transfiero una cantidad de éter de una cuenta a otra, ¿cómo puedo verificar el estado de la transacción usando su hash?

Respuestas (1)

Actualización 21 de octubre de 2017

Hay algunos cambios con la bifurcación de Byzantium: getTransactionReceipt(...).statusahora devuelve 0 para una transacción fallida y 1 para una transacción exitosa. EtherScan.io muestra este estado en el campo TxReceipt Status: para transacciones. Consulte ¿Cómo detecto una transacción fallida después de la bifurcación de Byzantium ya que el código de operación REVERT no consume todo el gas? para mayor información.



Resumen

eth.getTransaction("{txhash}")y eth.getTransactionReceipt("{txhash}")le proporcionará los detalles.

El .blockNumbercampo será nullhasta que la transacción se incluya en un bloque minado.

Los ejemplos a continuación muestran algunas de las formas de detectar el estado de una transacción.

Tenga en cuenta que podría haber un problema al detectar si una transacción ha fallado debido a un error lanzado, ya que la situación se puede detectar comprobando si gas = gasUsed. Creé la pregunta ¿Cómo se puede detectar el estado de la transacción de un error lanzado cuando el gas puede ser exactamente el mismo que el gas utilizado para una transacción exitosa? para intentar resolver esta duda.

Y a partir de los resultados de las preguntas y respuestas anteriores, aquí hay un breve código para determinar el estado de su transacción.

> var status = debug.traceTransaction("0x9ee86a200528de32a695f1e2dd0d94a3871fefc7e49c5fd24a4a37eab1b99f7a")
undefined
> status.structLogs[status.structLogs.length-1].error
"invalid jump destination (PUSH1) 2"

El valor de retorno anterior será ""si no hay errores o "Out of gas"si te quedas sin gasolina.



Detalles - Estado de la transacción

Los siguientes son algunos ejemplos del uso de eth.getTransaction(...)y eth.getTransactionReceipt(...)para averiguar el estado de la transacción.


Transacción pendiente, no minada en blockchain en el momento de la consulta

Aquí está la salida cuando no hay transacciones pendientes

// eth.getBlock("pending").transactions[0] = null
> eth.getTransaction(eth.getBlock("pending").transactions[0])
invalid or missing value for params[0]
    at web3.js:3119:20
    at web3.js:6023:15
    at web3.js:4995:36
    at <anonymous>:1:1

Y aquí hay una transacción pendiente. .blockNumber = null.

> eth.getTransaction(eth.getBlock("pending").transactions[0])
{
  blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  blockNumber: null,
  from: "0xea674fdde714fd979de3edf0f56aa9716b898ec8",
  gas: 90000,
  gasPrice: 20000000000,
  hash: "0xdfa60d4e97c242c5222a11b485c051bbdeb133c99baccd34dc33ceae1dc0cd67",
  input: "0x",
  nonce: 181930,
  to: "0x4ac944f4e8ab60f9481bcecd78a9915ed3eb98ba",
  transactionIndex: null,
  value: 1005685497455181600
}



Transacción extraída con éxito, estado de transacción bueno

Esta transacción se ejecutó con éxito. gas(666666) < gasUsed(106824).

> eth.getTransaction(eth.getBlock("latest").transactions[1])
{
  blockHash: "0x425a4d04ac0185863266b0d1b000f579f9675a37c5c6df3bf3cf72e0bc9a94e7",
  blockNumber: 1701040,
  from: "0x81747eb1afd9e2670aa6883ed80973ffcb531e1f",
  gas: 666666,
  gasPrice: 20000000000,
  hash: "0x6ef5b459ed945fbabfc3a5ef34fb0087752002c319649ff44c3b2759d13a517d",
  input: "0xf04fd2f3000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000001e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
  nonce: 16,
  to: "0x2cac6e4b11d6b58f6d3c1c9d5fe8faa89f60e5a2",
  transactionIndex: 1,
  value: 0
}

> eth.getTransactionReceipt("0x6ef5b459ed945fbabfc3a5ef34fb0087752002c319649ff44c3b2759d13a517d")
{
  blockHash: "0x425a4d04ac0185863266b0d1b000f579f9675a37c5c6df3bf3cf72e0bc9a94e7",
  blockNumber: 1701040,
  contractAddress: null,
  cumulativeGasUsed: 127824,
  from: "0x81747eb1afd9e2670aa6883ed80973ffcb531e1f",
  gasUsed: 106824,
  logs: [{
      address: "0x2cac6e4b11d6b58f6d3c1c9d5fe8faa89f60e5a2",
      blockHash: "0x425a4d04ac0185863266b0d1b000f579f9675a37c5c6df3bf3cf72e0bc9a94e7",
      blockNumber: 1701040,
      data: "0x00000000000000000000000081747eb1afd9e2670aa6883ed80973ffcb531e1f000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000010b000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000047e364",
      logIndex: 0,
      topics: ["0xa8061486280834731cc1ef340255cc5d9880ad748d20cb766f43cb7562ec2c16"],
      transactionHash: "0x6ef5b459ed945fbabfc3a5ef34fb0087752002c319649ff44c3b2759d13a517d",
      transactionIndex: 1
  }, {
      address: "0x2cac6e4b11d6b58f6d3c1c9d5fe8faa89f60e5a2",
      blockHash: "0x425a4d04ac0185863266b0d1b000f579f9675a37c5c6df3bf3cf72e0bc9a94e7",
      blockNumber: 1701040,
      data: "0x000000000000000000000000c3a48462221f4525dd2823853b0d04cf373fe42e00000000000000000000000081747eb1afd9e2670aa6883ed80973ffcb531e1f000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000001c7000000000000000000000000000000000000000000000000000000000000010b000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000a03e8",
      logIndex: 1,
      topics: ["0x68a83b20dde5c87dee07cc8d46d46e2fda6f176227f8b1f20dcb93752557df0e"],
      transactionHash: "0x6ef5b459ed945fbabfc3a5ef34fb0087752002c319649ff44c3b2759d13a517d",
      transactionIndex: 1
  }, {
      address: "0x2cac6e4b11d6b58f6d3c1c9d5fe8faa89f60e5a2",
      blockHash: "0x425a4d04ac0185863266b0d1b000f579f9675a37c5c6df3bf3cf72e0bc9a94e7",
      blockNumber: 1701040,
      data: "0x00000000000000000000000081747eb1afd9e2670aa6883ed80973ffcb531e1f000000000000000000000000c3a48462221f4525dd2823853b0d04cf373fe42e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000001c7000000000000000000000000000000000000000000000000000000000000010b00000000000000000000000000000000000000000000000000000000000001840000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000272000000000000000000000000000000000000000000000000000000000047e558",
      logIndex: 2,
      topics: ["0x61a43b8785d66f3a53c7b8ab814b4c2e4ff15a1a6f8d24d08818e1f426e13906"],
      transactionHash: "0x6ef5b459ed945fbabfc3a5ef34fb0087752002c319649ff44c3b2759d13a517d",
      transactionIndex: 1
  }, {
      address: "0x2cac6e4b11d6b58f6d3c1c9d5fe8faa89f60e5a2",
      blockHash: "0x425a4d04ac0185863266b0d1b000f579f9675a37c5c6df3bf3cf72e0bc9a94e7",
      blockNumber: 1701040,
      data: "0x00000000000000000000000000000000000000000000000000075fbf48b22000",
      logIndex: 3,
      topics: ["0x8f22ef5ca888de3e246c690a13b066ad49cbf2768b0449441dd6f5bae826a1b1"],
      transactionHash: "0x6ef5b459ed945fbabfc3a5ef34fb0087752002c319649ff44c3b2759d13a517d",
      transactionIndex: 1
  }],
  root: "30353b57e937cfc71f0c97d5c98573be1eff440e3db62987bd9cd66b0f3030c4",
  to: "0x2cac6e4b11d6b58f6d3c1c9d5fe8faa89f60e5a2",
  transactionHash: "0x6ef5b459ed945fbabfc3a5ef34fb0087752002c319649ff44c3b2759d13a517d",
  transactionIndex: 1
}    



Transacción extraída con éxito, pero la ejecución del contrato falló

Aquí hay un ejemplo de una transacción que se extrajo con éxito en la cadena de bloques, pero la ejecución del contrato falló.

gas(50878) == gasUsed(50878)En este caso

Esto ocurre porque el código de contrato inteligente llamado por la transacción detectó un error y lanzó una excepción y esto consume TODO el gas.

Ver ¿Por qué un lanzamiento de Solidity consume todo el gas? para obtener más información sobre el lanzamiento de errores y el uso de gas.

Y tenga en cuenta que posiblemente podría darse el caso de que un contrato inteligente se ejecute sin ningún error y consuma EXACTAMENTE la misma cantidad de gas que se especifica con los detalles de la transacción enviada.

> eth.getTransaction("0x93f39d4213bc48d9e6adda181ddd468d18163ae894ffc3f1a81d34ea33629f84")
{
  blockHash: "0x43403d50e782e2e4f0e9c94e43ce417b2adaf0e0f9fbb4147c2b288fe3c9dc75",
  blockNumber: 1596065,
  from: "0x46fbf1e97365513bb5bdb894259877e026b7f27d",
  gas: 50878,
  gasPrice: 32210000000,
  hash: "0x93f39d4213bc48d9e6adda181ddd468d18163ae894ffc3f1a81d34ea33629f84",
  input: "0x",
  nonce: 2,
  to: "0xbb9bc244d798123fde783fcc1c72d3bb8c189413",
  transactionIndex: 0,
  value: 211417498879620000000
}
> eth.getTransactionReceipt("0x93f39d4213bc48d9e6adda181ddd468d18163ae894ffc3f1a81d34ea33629f84")
{
  blockHash: "0x43403d50e782e2e4f0e9c94e43ce417b2adaf0e0f9fbb4147c2b288fe3c9dc75",
  blockNumber: 1596065,
  contractAddress: null,
  cumulativeGasUsed: 50878,
  from: "0x46fbf1e97365513bb5bdb894259877e026b7f27d",
  gasUsed: 50878,
  logs: [],
  root: "d6771cfbad8d1f2f7cf413a48e968654ec7626797d3ac0ee6cfac26bba09e352",
  to: "0xbb9bc244d798123fde783fcc1c72d3bb8c189413",
  transactionHash: "0x93f39d4213bc48d9e6adda181ddd468d18163ae894ffc3f1a81d34ea33629f84",
  transactionIndex: 0
}



Transacción regular que falla, no se extrae en la cadena de bloques

Estoy enviando más éteres de los que hay disponibles en mi cuenta. El error se detecta antes de que la transacción se extraiga en la cadena de bloques.

> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(50000000, "ether")})
Insufficient funds for gas * price + value
    at web3.js:3119:20
    at web3.js:6023:15
    at web3.js:4995:36
    at <anonymous>:1:1

Estoy enviando a una dirección no válida. Nuevamente, el error se detecta antes de que la transacción se extraiga en la cadena de bloques.

> eth.sendTransaction({from: eth.accounts[0], to: "0x12345", value: web3.toWei(50, "ether")})
invalid address
    at web3.js:3887:15
    at web3.js:3716:22
    at web3.js:4939:28
    at web3.js:4938:12
    at web3.js:4964:18
    at web3.js:4989:23
    at <anonymous>:1:1



Transacción extraída con éxito, estado de la transacción bueno, gas=gasUsed

Aquí hay un ejemplo en el que gas(21000) == gasUsed(21000)la transacción se realizó con éxito.

Inventé esto ya que el gas requerido para una transacción regular es 21000 y lo especifiqué gas=21000en los detalles de la transacción.

> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1.2345, "ether"), gas: 21000})
"0xc7c63b67747c0c825229ce3d36d226423adb8cab6bebe12b6d5001e0dc3f79b3"
> eth.getTransaction("0xc7c63b67747c0c825229ce3d36d226423adb8cab6bebe12b6d5001e0dc3f79b3")
{
  blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  blockNumber: null,
  from: "0xa7857047907d53a2e494d5f311b4b586dc6a96d2",
  gas: 21000,
  gasPrice: 20000000000,
  hash: "0xc7c63b67747c0c825229ce3d36d226423adb8cab6bebe12b6d5001e0dc3f79b3",
  input: "0x",
  nonce: 55,
  to: "0x4d5bbe7fbc80933ffa90ece988a764e41ee6d018",
  transactionIndex: null,
  value: 1234500000000000000
}
> eth.getTransactionReceipt("0xc7c63b67747c0c825229ce3d36d226423adb8cab6bebe12b6d5001e0dc3f79b3")
{
  blockHash: "0xf0af8236ceec7ad1839d67c9934ab062a8d95fa1f88b06139f97dbdfbd1cd842",
  blockNumber: 2234,
  contractAddress: null,
  cumulativeGasUsed: 21000,
  from: "0xa7857047907d53a2e494d5f311b4b586dc6a96d2",
  gasUsed: 21000,
  logs: [],
  root: "3280f47a0de1149ad5c5fda421faaf95f303da8a77e83c8ec6ac2b3d8ca27abc",
  to: "0x4d5bbe7fbc80933ffa90ece988a764e41ee6d018",
  transactionHash: "0xc7c63b67747c0c825229ce3d36d226423adb8cab6bebe12b6d5001e0dc3f79b3",
  transactionIndex: 0
}
Entonces, si una transacción tiene un número de bloque, ¿significa que no se ha producido un error?
Es un poco más complicado. Intentaré responder esto en unas pocas horas cuando tenga más tiempo.
Gracias por una respuesta elaborada. Miré la otra pregunta ( ethereum.stackexchange.com/questions/6007/… ) que había publicado, entonces, ¿podemos estar seguros de ver el último campo de error del estado debug.traceTransaction de que la transacción ha fallado o no?
Debiera ser. Pruebe mi teoría e informe si no funciona.
gas(666666) < gasUsed(106824)esto es lo contrario? no ? La transacción es exitosa sigas(666666) > gasUsed(106824)
Agregue a su respuesta que la versión del cliente debe ser 1.7.3 o superior. Los clientes más antiguos todavía no proporcionan statuscampo
@Max Esto no parece ser cierto, uso Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9 y no tengo la propiedad de estado
@Andromelus, ¿estás en la red principal de Ethereum?
@Max No, red privada.
¿Controla todos los nodos de la red?
@Andromelus, deberá configurar byzantiumBlockel archivo de génesis para que el campo de estado esté activo; consulte github.com/bokkypoobah/DeveryCrowdsale/blob/master/test/…
Entonces, si gas <= gasUsed, ¿entonces la transacción es exitosa? Por favor, aclare. Gracias