Eine sehr elementare Frage, wie erhalte ich einen Transaktionsstatus nach dem Auslösen der Transaktion? Ich meine, angenommen, ich mache eine sendTransaction, bei der ich eine gewisse Menge Ether von einem Konto auf ein anderes übertrage, wie kann ich den Status der Transaktion anhand ihres Hashs überprüfen?
Es gibt einige Änderungen mit dem Byzantium-Fork - getTransactionReceipt(...).status
gibt jetzt 0 für eine fehlgeschlagene Transaktion und 1 für eine erfolgreiche Transaktion zurück. EtherScan.io zeigt diesen Status im Feld TxReceipt Status: für Transaktionen an. Siehe Wie erkenne ich eine fehlgeschlagene Transaktion nach dem Byzantium-Fork, da der REVERT-Opcode nicht das gesamte Gas verbraucht? Für weitere Informationen.
eth.getTransaction("{txhash}")
und eth.getTransactionReceipt("{txhash}")
wird Ihnen die Einzelheiten mitteilen.
Das .blockNumber
Feld bleibt bestehen, null
bis die Transaktion in einen abgebauten Block aufgenommen wird.
Die folgenden Beispiele zeigen einige Möglichkeiten, den Status einer Transaktion zu erkennen.
Beachten Sie, dass es ein Problem geben könnte, zu erkennen, ob eine Transaktion aufgrund eines ausgelösten Fehlers fehlgeschlagen ist, da die Situation erkannt werden kann, indem überprüft wird, ob gas = gasUsed
. Ich habe die Frage erstellt: Wie kann der Transaktionsstatus aus einem ausgelösten Fehler erkannt werden, wenn das Gas genau das gleiche sein kann wie das Gas, das für eine erfolgreiche Transaktion verwendet wird? um zu versuchen, diese Frage zu lösen.
Und aus den Ergebnissen in den obigen Fragen und Antworten folgt hier ein kurzer Code, um den Status Ihrer Transaktion zu bestimmen.
> var status = debug.traceTransaction("0x9ee86a200528de32a695f1e2dd0d94a3871fefc7e49c5fd24a4a37eab1b99f7a")
undefined
> status.structLogs[status.structLogs.length-1].error
"invalid jump destination (PUSH1) 2"
Der obige Rückgabewert ist, ""
wenn keine Fehler vorliegen oder "Out of gas"
wenn Ihnen das Benzin ausgeht.
Im Folgenden finden Sie einige Beispiele für die Verwendung von eth.getTransaction(...)
und eth.getTransactionReceipt(...)
zum Ermitteln des Transaktionsstatus.
Hier ist die Ausgabe, wenn keine ausstehenden Transaktionen vorhanden sind
// 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
Und hier ist eine ausstehende Transaktion. .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
}
Diese Transaktion wurde erfolgreich ausgeführt. 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
}
Hier ist ein Beispiel für eine Transaktion, die erfolgreich in die Blockchain geschürft wurde, aber die Vertragsausführung fehlgeschlagen ist.
In diesem Fall gas(50878) == gasUsed(50878)
.
Dies tritt auf, weil der von der Transaktion aufgerufene Smart Contract-Code einen Fehler erkannt und eine Ausnahme ausgelöst hat und dies ALLES Gas verbraucht.
Siehe Warum verbraucht ein Solidity-Wurf alles Gas? für weitere Informationen über das Werfen von Fehlern und den Gasverbrauch.
Und beachten Sie, dass es möglicherweise den Fall geben könnte, dass ein Smart Contract fehlerfrei ausgeführt wird und GENAU die gleiche Menge an Gas verbraucht, wie in den gesendeten Transaktionsdetails angegeben.
> 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
}
Ich sende mehr Ether als in meinem Konto verfügbar sind. Der Fehler wird abgefangen, bevor die Transaktion in die Blockchain abgebaut wird.
> 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
Ich sende an eine ungültige Adresse. Auch hier wird der Fehler abgefangen, bevor die Transaktion in die Blockchain abgebaut wird.
> 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
Hier ist ein Beispiel gas(21000) == gasUsed(21000)
, bei dem die Transaktion erfolgreich durchgeführt wurde.
Ich habe mir das ausgedacht, da das für eine reguläre Transaktion erforderliche Gas 21000 beträgt und ich das gas=21000
in den Transaktionsdetails angegeben habe.
> 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
}
Amann C
Datenschutz ist ein Menschenrecht.eth
Amann C
Datenschutz ist ein Menschenrecht.eth
John
gas(666666) < gasUsed(106824)
das ist das gegenteil? nein ? Die Transaktion ist erfolgreich, wenngas(666666) > gasUsed(106824)
max
status
Feld bereitWiederholung 122442
max
Wiederholung 122442
max
Datenschutz ist ein Menschenrecht.eth
byzantiumBlock
in der Genesis-Datei festlegen, dass das Statusfeld aktiv ist - siehe github.com/bokkypoobah/DeveryCrowdsale/blob/master/test/…Russo
Datenschutz ist ein Menschenrecht.eth