Transaktionsstatus

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?

Antworten (1)

Aktualisierung vom 21. Oktober 2017

Es gibt einige Änderungen mit dem Byzantium-Fork - getTransactionReceipt(...).statusgibt 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.



Zusammenfassung

eth.getTransaction("{txhash}")und eth.getTransactionReceipt("{txhash}")wird Ihnen die Einzelheiten mitteilen.

Das .blockNumberFeld bleibt bestehen, nullbis 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.



Details - Transaktionsstatus

Im Folgenden finden Sie einige Beispiele für die Verwendung von eth.getTransaction(...)und eth.getTransactionReceipt(...)zum Ermitteln des Transaktionsstatus.


Ausstehende Transaktion, zum Zeitpunkt der Abfrage nicht in Blockchain abgebaut

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
}



Transaktion erfolgreich abgebaut, Transaktionsstatus gut

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
}    



Transaktion erfolgreich abgebaut, Vertragsausführung jedoch fehlgeschlagen

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
}



Reguläre Transaktionen, die fehlschlagen, werden nicht in die Blockchain geschürft

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



Transaktion erfolgreich abgebaut, Transaktionsstatus Gut, gas=gasUsed

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=21000in 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
}
Wenn also eine Transaktion eine Blocknummer hat, bedeutet das, dass sie nicht fehlgeschlagen ist?
Es ist ein bisschen komplizierter. Ich werde versuchen, dies in ein paar Stunden zu beantworten, wenn ich mehr Zeit habe.
Danke für eine ausführliche Antwort. Ich habe mir die andere Frage ( ethereum.stackexchange.com/questions/6007/… ) angesehen, die Sie gepostet haben. Können wir also mit Sicherheit im letzten Fehlerfeld der debug.traceTransaction angeben, dass die Transaktion fehlgeschlagen ist oder nicht?
Sollte sein. Teste meine Theorie und berichte, wenn es nicht funktioniert.
gas(666666) < gasUsed(106824)das ist das gegenteil? nein ? Die Transaktion ist erfolgreich, wenngas(666666) > gasUsed(106824)
Bitte fügen Sie Ihrer Antwort hinzu, dass die Client-Version 1.7.3 oder höher sein sollte. Ältere Clients stellen immer noch kein statusFeld bereit
@Max Das scheint nicht zu stimmen, ich verwende Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9 und habe die status-Eigenschaft nicht
@Andromelus bist du im Ethereum Mainnet?
@Max Nein, privates Netzwerk.
Kontrollieren Sie alle Knoten im Netzwerk?
@Andromelus, Sie müssen byzantiumBlockin der Genesis-Datei festlegen, dass das Statusfeld aktiv ist - siehe github.com/bokkypoobah/DeveryCrowdsale/blob/master/test/…
Also, wenn gas <= gasUsed, dann ist die Transaktion erfolgreich? Bitte klären Sie. Vielen Dank