Nach meinem Wissen gibt es keine benutzerdefinierten Ausnahmen in Bezug auf die Solidität. Die einzige Ausnahme ist Out of Gas
. Überall dort, wo wir throw
Vertragscode schreiben, wird eine out-of-gas
Ausnahme ausgelöst.
Aber gibt es eine Möglichkeit, diese Ausnahme abzufangen? Ich meine, wenn ich ein Stück Code ausführen kann, wenn eine Ausnahme auftritt? Selbst bei der Arbeit mit der Geth-Konsole habe ich keine Benachrichtigung darüber erhalten, ob eine Ausnahme aufgetreten ist. Ich denke, es ist ziemlich möglich, eine solche Ausnahme abzufangen, da Mist in der Lage ist, Fehlermeldungen
anzuzeigen , wenn eine Ausnahme auftritt, also muss es diese Ausnahme irgendwo behandelt haben. Edit: Grundsätzlich ist die Frage:Intrinsic gas too low
Wie können wir vor dem Senden der Transaktion wissen, dass diese Transaktion das gesamte bereitgestellte Gas verbraucht?
Ich frage nicht, wie ich ausreichend Gas für meine Transaktion bereitstellen kann, sondern wie kann ich wissen, dass meiner Transaktion das Gas ausgehen wird.
Eine Möglichkeit, dies zu tun, besteht darin, die Transaktion zu senden, sie schürfen zu lassen und dann zu prüfen gasUsed=gasSend
, ob eine thow
Verwendung vorliegt debug.traceTransaction
.
Aber ich möchte wissen, ob meine Transaktion durchgeführt wird oder nicht, ohne die Transaktion zu senden. In Mist, wenn ich versuche, eine Transaktion zu senden, die auf eine throw
Anweisung stößt, wird es Intrinsic gas too low
vor dem Senden der Transaktion angezeigt. Ich möchte das gleiche von tun geth
.
Solidity bot keinen Ausnahmeverwaltungsmechanismus wie try/catch (für Java/c#).
Aufgrund eines ungültigen EVM-Codes verbraucht throw alle bereitgestellten Gasterminierungen und macht alle Änderungen am Zustand, die durch die aktuelle Vertragsausführung vorgenommen wurden, und an den Ether-Guthaben rückgängig. Dieses Konzept soll Spamming im Netzwerk verhindern.
im gelben papier steht folgendes:
Genau wie bei der Vertragserstellung wird, wenn die Ausführung auf außergewöhnliche Weise angehalten wird (dh aufgrund eines erschöpften Gasvorrats, eines Stapelunterlaufs, eines ungültigen Sprungziels oder einer ungültigen Anweisung), kein Gas an den Anrufer zurückerstattet und der Zustand wird auf den Punkt zurückgesetzt unmittelbar vor der Saldenübernahme (d. h. σ)
als Information für die Meldung „Eigengas zu niedrig“.
Mist überprüft die Gasmenge, ohne einen Code auszuführen, und teilt Ihnen mit, dass die Transaktion fehlschlagen wird, weil Sie nicht genügend Gas bereitgestellt haben, um die Transaktion auszuführen.
Wenn Sie Gas wie Mist schätzen möchten, können Sie dies aufrufeneth_estimateGas
:
Tätigt einen Anruf oder eine Transaktion, die nicht zur Blockchain hinzugefügt wird, und gibt das verbrauchte Gas zurück, das zur Schätzung des verbrauchten Gases verwendet werden kann.
web3.eth.call
. Ich meine, wie man data
Parameter bekommt, wenn ich eine Funktion wie transfer("to_addr", amount, { from: "accnt_addr});
mit aufrufen möchte web3.eth.call()
..call(param, { gas:3000000 })
, wird es das Gas auf schätzen 3000000
? 3000000 ist viel.throw
in irgendeiner Zeile verwendet wird? Es wird alles Gas verbrauchen, egal wie groß der Wert ist. Wenn ich also wissen möchte, ob mein Code throws
in irgendeiner Zeile steht oder nicht, ist der beste Weg, dies zu tun, meiner Meinung nach, zu überprüfen, ob bei der Transaktion das Gas ausgegangen ist. Ich frage nicht weiterhow can I provide sufficient gas for my transaction but How can I know beforehand that my transaction will run out of gas?
geth console
. Woher soll ich in diesem Fall wissen, ob meine Transaktion fehlschlagen kann, bevor ich die Transaktion sende?eth.estimateGas({ from: account, to: myContract.address, data: myContract.myFunction.getData(param1, param2) })
ist verfügbar in geth console
.Estimated gas=50000000
. Also kann ich einen Haken setzen wie if(EstimatedGas=50000000){console.log("transaction may fail")};
. Aber das erhob sich eine neue Frage nach dem Warum 50000000
? Ist es das maximale Gaslimit der Ethereum-Transaktion?eth_estimateGas
für Funktionen fest, die keine Eingabeparameter annehmen. Um hier Diskussionen zu vermeiden, habe ich eine neue Frage geöffnet: Wie schätzt man Gas für eine Funktion ohne Eingabeparameter? . Bitte sieh dir das mal an.
Prashant Prabhakar Singh
out-of-gas
, damit ich eine Nachricht wie Mist anzeigen kann.Badr Bellaj
Badr Bellaj
Prashant Prabhakar Singh
Badr Bellaj
Badr Bellaj
Prashant Prabhakar Singh
throw
eine Ausnahme machen, wird das gesamte Gas verbraucht und daher zeigt NebelIntrinsic gas too low
. Wenn Sie jedoch dieselbe Transaktion von ausführengeth console
, werden die Transaktionen gesendet, aber nach dem Mining beim Debuggen wirdinvalid jump destination (PUSH1) 2
. Was ich möchte, ist, dass ich verhindern kann, dass Transaktionen gesendet werden, genau wie Mist, wenn irgendwo Ausnahmen ausgelöst werden oder die Transaktion das gesamte Gas verbraucht.