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.
Suchen Sie in Etherscan nach dem TxReceipt Status
, das Fail
rot oder Success
grün sein wird.
Beispiel für einen Fehler: https://ropsten.etherscan.io/tx/0x67a5f6442f49a5da6ff8682250a8eef899d9dc0c5adf20b683709433902b5956
eth.getTransactionReceipt(transactionHash)
gibt ein status
Feld zurück, das einen Wert hat, 0
wann eine Transaktion fehlgeschlagen ist und 1
wann die Transaktion erfolgreich war.
Hier ist ein Beispiel, das das status
Feld 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 .
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
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.
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.
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
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?
knokte
eth