Wie man aus der Gasausnahme herauskommt

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 throwVertragscode schreiben, wird eine out-of-gasAusnahme 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 thowVerwendung 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 throwAnweisung stößt, wird es Intrinsic gas too lowvor dem Senden der Transaktion angezeigt. Ich möchte das gleiche von tun geth.

Antworten (2)

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.

Ich kenne die Fakten, die Sie erwähnt haben, aber das löst mein Problem nicht. Wahrscheinlich hast du mich falsch verstanden. Ich habe nach dem Abfangen der Ausnahme gefragt out-of-gas, damit ich eine Nachricht wie Mist anzeigen kann.
das meine ich mit Try/Catch-Mechanismus, Solidity hat das nicht bereitgestellt.
Sie könnten Ereignisse verwenden, wenn Sie erwarten, dass eine Ausnahme ausgelöst wird
Ich habe mich gefragt, ob es keinen solchen Mechanismus gibt, wie Mist eine Fehlermeldung anzeigen kann, wenn eine Ausnahme auftritt
Eigenes Gas zu niedrig, dies ist keine Ausnahme. MIST überprüft einfach die Gasmenge und gibt dann diesen Fehler aus
Sehen Sie, egal wie viel Gas Sie bereitstellen, wann immer wir throweine Ausnahme machen, wird das gesamte Gas verbraucht und daher zeigt Nebel Intrinsic gas too low. Wenn Sie jedoch dieselbe Transaktion von ausführen geth console, werden die Transaktionen gesendet, aber nach dem Mining beim Debuggen wird invalid 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.

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.

Ja, das ist die einzige Lösung, aber wie kann ich die Vertragsmethode mit aufrufen web3.eth.call. Ich meine, wie man dataParameter bekommt, wenn ich eine Funktion wie transfer("to_addr", amount, { from: "accnt_addr});mit aufrufen möchte web3.eth.call().
eth_estimateGas gibt mir die geschätzte Menge an Gas, aber wie erfahre ich, dass meine Transaktion das gesamte Gas verbraucht hat?
Wenn Sie das tun .call(param, { gas:3000000 }), wird es das Gas auf schätzen 3000000? 3000000 ist viel.
Ja, aber was ist, wenn die Funktion, die ich aufrufe, throwin irgendeiner Zeile verwendet wird? Es wird alles Gas verbrauchen, egal wie groß der Wert ist. Wenn ich also wissen möchte, ob mein Code throwsin 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?
Ich habe die Frage aktualisiert und hoffe, dass dies dazu beiträgt, den Fall besser zu verstehen.
Wenn Sie Gas von 3000000 oder 4700000 geben, je nachdem, was das maximale Gas des Blocks ist, geben Sie ihm das maximal mögliche Gas für Ihre Transaktion. Wenn es also wirft, verbraucht es das gesamte Gas, egal wie groß der Wert ist. Aber weil Sie den maximalen Wert angegeben haben, wissen Sie, dass es geworfen hat.
Ich spreche nicht davon, die Transaktion von Mist zu senden, sondern von 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.
Großartig, jetzt habe ich es verstanden, eigentlich immer, wenn eine Transaktion die 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?
Der Begriff, den Sie bei Google benötigen, lautet "Blockgaslimit".
Danke für die Hilfe. Ich stecke jetzt bei der Verwendung eth_estimateGasfü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.