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?
Hay algunos cambios con la bifurcación de Byzantium: getTransactionReceipt(...).status
ahora 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.
eth.getTransaction("{txhash}")
y eth.getTransactionReceipt("{txhash}")
le proporcionará los detalles.
El .blockNumber
campo será null
hasta 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.
Los siguientes son algunos ejemplos del uso de eth.getTransaction(...)
y eth.getTransactionReceipt(...)
para averiguar el estado de la transacción.
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
}
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
}
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
}
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
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=21000
en 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
}
Amán C
privacidadisahumanright.eth
Amán C
privacidadisahumanright.eth
John
gas(666666) < gasUsed(106824)
esto es lo contrario? no ? La transacción es exitosa sigas(666666) > gasUsed(106824)
máx.
status
campoIteración 122442
máx.
Iteración 122442
máx.
privacidadisahumanright.eth
byzantiumBlock
el archivo de génesis para que el campo de estado esté activo; consulte github.com/bokkypoobah/DeveryCrowdsale/blob/master/test/…ruso
privacidadisahumanright.eth