Frage 1) Stellen wir uns vor, ich habe diesen Code
require(userVotes[msg.sender] == 0);
presidents[_id-1].voteCount++;
userVotes[msg.sender] = _id;
Wenn ich also diese Funktion aufrufe und die Anforderung nicht besteht, passiert in der Metamaske wirklich: Vertrag hat Ausnahme ausgelöst. dann kann ich immer noch auf die Schaltfläche "Senden" klicken. Ich bin neugierig, wird es immer noch Gas von meinem Konto nehmen?
Frage 2) Wenn die Antwort auf die vorherige Frage ja ist, wie viel dann? das Gas, das es brauchte require(userVotes[msg.sender] == 0);
, um diesen Befehl auszuführen? Ich bin immer noch neugierig, obwohl es eine Ausnahme in require gab, es wurde immer noch in einen Block aufgenommen und der Status war fehlgeschlagen. Was genau ist in den Block gekommen? nichts hat sich verändert.
Frage 3) Ich habe versucht, etwas zu schreiben, wie require(userVotes[msg.sender] == 0,"error go away");
ich das im Front-End abfangen möchte. Was ich getan habe, ist, nachdem ich die Transaktion gesendet habe, habe ich event verwendet
.on('error', function(error){
console.log(error);
}
aber es waren nicht diese Worte, die ich in einer Solidität wie ein "Fehler verschwinde" geschrieben habe.
Ich danke dir sehr
Alle Informationen, die ich Ihnen jetzt gebe, finden Sie in den Solidity-Dokumenten ( https://solidity.readthedocs.io/en/v0.4.24/control-structures.html?highlight=require#error-handling-assert-require -Zurücksetzen-und-Ausnahmen )
Die Funktion require(...) ruft revert() auf, wodurch die Ausführung angehalten und der Zustand von EVM zurückgesetzt wird, sodass Ihr Vertragsaufruf effektiv nichts geändert hat. revert() sendet das verbleibende Gas an die Benutzer. Das bedeutet, dass das bis zu Ihrem Bedarfsabruf verbrauchte Gas aufgebraucht ist und nicht erstattet werden kann.
Giorgi Lagidze
meer212