Frage zum Schlüsselwort in Solidität erforderlich

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

Antworten (1)

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.

  1. Die Antwort ist ja
  2. Die Gasmenge bis zur Ausführung des require(...)-Aufrufs geht verloren. Ihre Transaktion ist in einem Block enthalten, hatte aber keine andere Wirkung, als die Nonce zu erhöhen und den Saldo des sendenden Kontos zu verringern. Im Grunde nimmt es ab diesem Zeitpunkt nur noch ewig Speicherplatz in Anspruch und kostet Sie Ether, ohne andere Auswirkungen zu haben.
  3. Soweit ich weiß, ist es noch nicht möglich, die Fehlermeldung von Ihrem Frontend zu erhalten. Diskussion zu diesem Thema: Zurückgeben eines Fehlercodes mit Revert
Wenn ich also eine Funktion habe und vorher ein Schlüsselwort benötige, habe ich Code, der die Variablen (Zustandsvariablen) ändert. Nachdem die Anforderung fehlschlägt, wird immer noch das Gas benötigt, das zum Ausführen von Befehlen vor der Anforderung benötigt wurde, aber wenn die Anforderung eintritt, geht auch jede Änderung verloren, die vor der Anforderung stattfand, und auch das Gas wird von meinem Konto abgezogen. Ich möchte nur genau wissen, dass, wenn ich etwas an Zustandsvariablen vor der Anforderung ändere und wenn die Anforderung eintritt, überhaupt keine Änderung vorgenommen wird, obwohl dies vor der Erfüllung der Anforderung geschah?
@GiorgiLagidze genau