Wie kann man wissen, ob eine Transaktion durchgeführt wurde oder nicht? (kein Treibstoff mehr)

Anscheinend ist das verbrauchte Gas beim Senden von Transaktionen von einem Konto statt von einem Wallet gering (21.000) und nicht genug, um Ether an ein Contract Wallet zu senden (sozusagen ohne Gas).

Wenn dies passiert, sollte die Transaktion nicht durchgeführt werden (oder abgebrochen werden , wie es hier heißt ), aber sie scheint immer noch in der Blockchain aufgezeichnet zu sein, warum? Beispiel .

Gibt etherscan.io keinen Hinweis darauf, ob die Transaktion gültig war oder nicht? In diesem Fall sollte es meines Wissens in dieser URL als CANCELLED/INVALID gekennzeichnet sein.

ok danke, BTW gibt es eine Möglichkeit, diesen Status über RPC zu erfahren? Soll ich dazu eine neue Frage aufmachen oder gibt es schon eine?
Es könnte dieser Frage ähnlich sein ethereum.stackexchange.com/q/1181/42 ? RPC eth_getTransactionReceipt und die Überprüfung des verwendeten Gases ist eine gute Möglichkeit, dies herauszufinden. Entschuldigung, ich werde nicht markieren, wenn Sie eine neue Frage öffnen.

Antworten (5)

Verwenden des Etherscan-Blockchain-Explorers

Suchen Sie in Etherscan nach dem TxReceipt Status, das Failrot oder Successgrün sein wird.

Beispiel für einen Fehler: https://ropsten.etherscan.io/tx/0x67a5f6442f49a5da6ff8682250a8eef899d9dc0c5adf20b683709433902b5956

Verwendung der Quittung

eth.getTransactionReceipt(transactionHash)gibt ein statusFeld zurück, das einen Wert hat, 0wann eine Transaktion fehlgeschlagen ist und 1wann die Transaktion erfolgreich war.

Hier ist ein Beispiel, das das statusFeld zeigt:

{ 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 }

Näheres hier .


Historisch

Um zu sehen, ob einer Transaktion das Gas ausgegangen ist, können Sie die Transaktion (Hash) in https://live.ether.camp eingeben und dann auf „VM Trace“ klicken. (Für das Testnetz Morden verwenden Sie https://morden.ether.camp )

Oder fügen Sie den TransactionHash in diese URL ein:

https://live.ether.camp/transaction/<transactionHash>/vmtrace#0

Für die in der Frage erwähnte Transaktion022f440fa96eb469363804d7b6c52321d4f409fa76578cdbdc5f04ff494b1321

Hier ist die Ausgabe https://live.ether.camp/transaction/022f440fa96eb469363804d7b6c52321d4f409fa76578cdbdc5f04ff494b1321/vmtrace#0

Geben Sie hier die Bildbeschreibung ein

Diese Transaktion war sofort leer. Bei einigen Transaktionen kann nach einigen Berechnungen das Gas ausgehen, und wenn Sie auf die Operationen klicken, wird jeder Schritt angezeigt, der ausgeführt wird, und wann das Gas ausgeht.

Wie ist es möglich, dass der Status fehlgeschlagen ist, der Vertrag aber dennoch bereitgestellt wird? Sollte die Transaktion im Falle eines Fehlers nicht rückgängig gemacht werden?
@k06a Denken Sie, das sollte eine neue Frage sein, und fügen Sie Ihren Transaktions-Hash hinzu, damit die Community beim Debuggen helfen kann.

Ihre Transaktion ist also in dem Sinne durchgegangen, dass sie an das Netzwerk gesendet und in einen Block aufgenommen wurde. Wie Sie jedoch bereits angedeutet haben, war das von Ihnen bezahlte Benzin für diese Transaktion nicht ausreichend. Um korrupte Zustände zu vermeiden, werden in diesem Fall alle Auswirkungen einer Transaktion rückgängig gemacht . Der einzige Effekt ist, dass die Kosten für das Gas (in Ether) von Ihrem Konto abgezogen und dem Miner gutgeschrieben werden, der die Transaktion in einen Block aufgenommen hat.

Auf https://etherscan.io/ gibt es keinen klaren Hinweis darauf, ob das Gas ausreichend war oder nicht. Auf der Website wird jedoch der „Kumulative Gasverbrauch“ angegeben, und wenn er dem „Gas“ (dem von Ihnen festgelegten Gaslimit) entspricht, ist dies ein sehr starker Indikator dafür, dass bei der Transaktion das Gas ausgegangen ist. (Theoretisch hätte es tatsächlich genau diese Menge verwenden können, aber das ist sehr unwahrscheinlich)

http://frontier.ether.camp/ ist ein ausgefeilterer Block-Explorer, und hier können Sie sehen, ob die Ausnahme "Kein Gas" ausgelöst wurde oder nicht.

Wenn es wieder verfügbar ist, denke ich, dass der Link tatsächlich live.ether.camp ist

Nur um die obige Frage zu verdeutlichen, Etherscan zeigt jetzt an , ob während der Vertragsausführung ein Fehler aufgetreten ist . Ein roter Vermerk weist auf einen Fehler und ein grüner Vermerk auf einen bestätigten Vertragsaufruf hin .

Die meisten Ausnahmen für gescheiterte Verträge sind auf „Gasmangel“ zurückzuführen. Und wie PaulS + mKoeppelmann oben gesagt hat, besteht eine Möglichkeit, um festzustellen, ob Ihnen das Gas ausgegangen ist, darin, gasSent == gasUsed abzugleichen. Die ausschließliche Verwendung dieser Methode wäre jedoch ungenau, da es andere Ausnahmen geben kann, die der Vertrag zuerst trifft, bevor ihm das Gas ausgeht

Danke, führen Sie etherscan.io aus?
cool, aber ich bin immer noch besorgt darüber, Transaktionen ohne Gas in Betracht zu ziehen, wenn genau gasSent == gasUsed, falls die Operation diese Menge an Gas (und nicht mehr) erfordert, um abgeschlossen zu werden; es mag ein seltener Fall sein, aber es könnte passieren
Für alle Zwecke sollten Sie. Wie ich oben sagte, ist es nicht definitiv, aber höchstwahrscheinlich, da es andere Ausnahmen gibt und es immer möglich ist, gerade genug Benzin bereitzustellen.
Also fügen Sie die rote Warnung auch in den Fällen hinzu, in denen es gerade genug Benzin sein könnte?
Das ist eines der Kriterien, die ich betrachte, aber nicht das einzige, daher das Fragezeichen "?". Der einzige Weg, um 100% sicher zu sein, ist ein vmtrace (ethercamp) oder die Verwendung der debug.transaction, die in zukünftigen Versionen von geth veröffentlicht wird (Patch von ppratscher). Auf diese Weise können Sie die gesamte Transaktion wiedergeben und jeden Schritt verfolgen, den die VM ausgeführt hat. Sobald dies allgemein verfügbar ist, erwarte ich, dass die meisten Blockexplorer diese aktualisierten Informationen verwenden werden. Das wird mit der Zeit immer besser :-)
Es gibt drei Fälle, in denen gasSent == gasUsed ist. (1) das gesamte Gas war aufgebraucht und daher ging der Transaktion das Gas aus; (2) es gab einen „Wurf“, in welchem ​​Fall das gesamte Gas verschlungen wird; und (3) die Exekution erfolgreich ist, aber die genaue bereitgestellte Gasmenge aufgebraucht wurde. Die Transaktionstypen (1) und (2) sind nicht erfolgreich. Transaktionstyp (3) tut es. Fall (3) ist der Grund, warum gasSent == gasUsed nicht ausreicht, um festzustellen, ob das Gas ausgegangen ist, und der Grund, warum Sie den Trace überprüfen müssen, um sicherzugehen.

Die Transaktion selbst ist gültig und befindet sich daher in der Blockchain und wird von allen Block-Explorern erfasst. Da jedoch nicht genügend Gas angegeben wurde, wird der Wallet-Vertragscode zurückgesetzt und es findet keine Ether-Übertragung statt. Das angegebene unzureichende Gas wird trotzdem verbraucht.

Der Block-Explorer https://live.ether.camp/ zeigt an, dass die Transaktion abgebrochen wurde, und wenn Sie die vmtrace-Ansicht untersuchen, werden Sie sehen, dass ihr das Benzin ausgegangen ist.

Wenn Sie programmgesteuert feststellen möchten, wie Ihnen das Benzin ausgegangen ist, anstatt nachträglich zu debuggen, lesen Sie:

Woher weiß ich, dass mir programmgesteuert das Benzin ausgegangen ist?