Ich arbeite am Frontend, wo ich try / catch verwende, um Fehler zu finden und den Benutzern entsprechende Nachrichten zu geben. Mein Smart Contract hat eine kostenpflichtige Funktion und ich war kurz davor, Fehler beim Gasverbrauch zu finden.
uint[] public theArray;
function myFunction(uint bigNumber) payable public {
if(msg.value == 0.01 ether){
theArray.push(bigNumber);}
else {if (msg.value == .05 ether){
for (int i; i<50;i++)
theArray.push(bigNumber);
}
else {
revert();
}
}}
Wenn ich jetzt versuche, die Fehler abzufangen, kann derselbe Fehler zwei verschiedene „Ausgänge“ haben (err.message). Die Beispiele:
Verwenden von MetaMask im Rinkeby-Testnetzwerk
Wenn ich 0,05 ETH mit 21.000 Gas oder sogar 21.001 (Mindestbetrag) sende, erhalte ich folgende Fehlermeldung:
Zurückgegebener Fehler: Error: Error: [ethjs-rpc] rpc error with payload
Wenn ich jedoch 0,05 ETH mit 25.000 Gas sende (nicht genug Gas, so dass es immer noch fehlschlägt), erhalte ich folgende Fehlermeldung:
Die Transaktion wurde von der EVM rückgängig gemacht
Kann mir jemand erklären, warum sich der Fehler ändert, wenn ich die Gasmenge erhöhe?
Eine andere Sache, die mir aufgefallen ist, ist, dass ich auch bekomme, wenn ich einen ungültigen Betrag wie 0,04 sende
Die Transaktion wurde von der EVM rückgängig gemacht
Basierend auf meiner Beobachtung und meinem Verständnis. Vielleicht nicht die beste Erklärung da draußen.
Zurückgegebener Fehler: Error: Error: [ethjs-rpc] rpc error with payload
-Für diesen Fehler kann es an der Metamaske selbst gelegen haben, vielleicht spielen Sie mit dem gasPrice und/oder gasLimit. Zum besseren Verständnis können Sie hier oder hier verweisen.
Die Transaktion wurde von der EVM rückgängig gemacht
Kann mir jemand erklären, warum sich der Fehler ändert, wenn ich die Gasmenge erhöhe?
-Für diesen Fehler habe ich den Code ausgeführt und festgestellt, dass der mögliche Grund darin besteht, dass die Transaktion stattfindet und fortgesetzt wird. Die Parameter erfüllen diesen Teil des Codes. Doch mitten im Prozess ging das Gas aus, während die for-Schleife läuft, was den größten Teil des von Ihnen bereitgestellten Gases auffrisst. Versuchen Sie vielleicht, das Gaslimit zu erhöhen, und dies wird ohne Fehler abgebaut.
if (msg.value == .05 ether){
for (int i; i<50;i++)
theArray.push(bigNumber);
}
Die Transaktion wurde von der EVM rückgängig gemacht
Beim letzten Szenario hat der Parameter einfach keine der Bedingungen erfüllt, weshalb er direkt zum letzten geht, was ihn revert() macht.
Julian
vhi
Julian