Solidity: Wie können wir eine Fehlermeldung in "require" schreiben?

Ich lerne Solidität. Soweit mir bekannt ist, wird empfohlen, "require" zu verwenden, um Fehler zu behandeln. Aber ich möchte die Benutzer über die Art von Fehlern informieren, die sie machen, z. B. ein Argument ist ungültig oder außerhalb des gültigen Bereichs usw.

Frage : Wie schreibe ich eine Fehlermeldung in Fehlerbehandlungsfunktionen wie "require"?


Außerdem muss ich wissen, ob es sinnvoll ist, solche Fehlermeldungen im Vertrag zu haben?

Schlagen Sie vor, dass Sie eine Antwort akzeptieren, damit Sie sich einen Namen machen und die hilfreichen Antworten belohnen können.

Antworten (6)

Es ist enthalten seit Solidity 0.4.22. Es gibt einen zusammengeführten Zweig , der diese Funktion im Meilenstein hinzufügt.

Die Dokumentation besagt

Es gibt zwei weitere Möglichkeiten, Exceptions auszulösen: Die Revert-Funktion kann verwendet werden, um einen Fehler zu kennzeichnen und den aktuellen Aufruf rückgängig zu machen. In Zukunft könnte es möglich sein, auch Details über den Fehler in einen Aufruf zum Zurücksetzen aufzunehmen. Alternativ zu revert() kann auch das Schlüsselwort throw verwendet werden.

In der Vergangenheit wurde es so verwendet

require(
    msg.sender == _account
);

Und in Solidity 0.4.22und neuer kann es so verwendet werden

require(
    msg.sender == _account,
    "Sender not authorized."
);

Hinzufügen des Grundes als zweiten Parameter

Wo siehst du das aber?

Sie können Ereignisse verwenden , um Fehlermeldungen zu protokollieren. Es gibt nichts Besseres als die print-Anweisung in solidity, daher können Sie den Benutzern die Fehlermeldungen nicht direkt mitteilen. Ereignisse funktionieren jedoch ähnlich wie Protokolle in anderen Sprachen, was hilft, solche Fälle zu protokollieren und Fehler zu melden.

In einem meiner Projekte haben wir uns entschieden, Statuscodes für die verschiedenen Fehlertypen zu haben, und dann haben wir diese Statuscodes jedes Mal in Fehlerfällen mit Hilfe von Ereignissen protokolliert.

Sie können eine Implementierung hier in diesem Repo sehen -

Vertragscode – https://github.com/Imaginea/lms/blob/master/contracts/MembersLibrary.sol#L27

Hinweis: Auf diese Statuscodes kann auch über die Antwort zugegriffen werden, wie hier gezeigt -

https://github.com/Imaginea/lms/blob/master/test/testOrganisation.js#L45 (Testfall)

Hoffe das hilft.

Danke für die Antwort! Mir ist aufgefallen, dass Sie in Ihrem Code einen Wert von einem Bruchteil (floating) erhalten. Können Sie mir sagen, wie das in Solidity geht?
Ich habe es nicht getan, muss ich herausfinden. Ich komme darauf zurück.
@Sanchit Könnten Sie nicht auf ein Problem stoßen, bei dem Sie das Fehlerereignis nicht generieren können, weil Sie nicht genug Benzin haben? Ich glaube, dass das Stipendium nicht ausreicht, um die Generierung eines Events abzudecken, wenn ich das richtig sehe.
Leider funktionieren beide Links nicht mehr.
Imaginea wurde von einem anderen Unternehmen übernommen, daher sind alle Links unter ihrer Github-Organisation verschwunden. Bitte greifen Sie mit meinem Fork auf die Links zu - github.com/inovizz/lms

Ab dem 5. November 2017 ist dies noch nicht möglich.

Habe ein Auge auf:

https://github.com/ethereum/solidity/issues/1686 Unterstützungsgrund-String in Revert (und möglicherweise erfordern / bestätigen)

Wenn es implementiert ist, require(x>0, "positive number needed");wird wahrscheinlich eine Syntax wie funktionieren.

Der beste Weg, um eine Fehlermeldung zurückzubekommen, besteht darin, ein Ereignis basierend auf dem Ergebnis auszulösen oder einen String zurückzugeben. Der übliche Grund für die Verwendung von require versus assert ist, dass, wenn require fehlschlägt, das verbleibende Gas zurückerstattet und alle Änderungen rückgängig gemacht werden. Auf der anderen Seite verbraucht assert das gesamte verbleibende Gas, bevor alle Änderungen rückgängig gemacht werden. Eine kleine Änderung, die hinzugefügt werden muss, ist die Empfehlung, eine Ablehnungsnachricht zum Erforderlichen hinzuzufügen. Dies ist ab Version 0.5.8 optional, aber die Compiler und Jet-Brains zeigen eine Warnung an, wenn Sie dies nicht tun, und dies kann obligatorisch werden in der Zukunft, Die Syntax ist jedoch die gleiche.

assert(myAmount < __someValue);

require(myAmount < __someValue,"Insufficient funds to allow transfer");

Und das ist eine ziemlich gute Beschreibung, um Ihnen weiterzuhelfen: Wie man Assert und Require verwendet

Danke für die Bearbeitung @savard, ich bin Legastheniker, und manchmal ist es schwierig, auf Senden zu klicken, bevor Sie nach roten Unterstreichungen suchen. Ich würde das bei der Anforderung hinzufügen, es wird jetzt empfohlen, eine Textablehnungsnachricht als letzten Parameter für die Anforderung zu platzieren! require(myAmount < __someValue,"Menge muss kleiner als somevalue sein");
Keine Sorge @Cyberience, völlig verständlich. Ich bin nicht Legastheniker, aber ich habe immer noch eine harte Zeit mit der Grammatik. Außerdem wäre dies eine großartige Änderung, die Sie hinzufügen könnten, um eine Fehlermeldung zu einer require()Anweisung hinzuzufügen - sehr hilfreich bei der Entwicklung.

Fehlergrund-Strings für Revert und Require wurden eingeführt. Weitere Einzelheiten: https://medium.com/secureblocks/solidity-0-4-22-enhancements-94d2b9b8b6fe

Ich denke, es ist immer noch nicht möglich, diese auf Client-Seite wie web3.js ( github.com/ethereum/web3.js/issues/1707 ) abzufangen.
Ja. Aber Remix begann, den Grund zu zeigen. Hoffentlich wird es bald auch für web3 verfügbar sein.

Ich habe meinen Code mit Solidity ^0.4.24 kompiliert und musste Fehlermeldungen entfernen, require()da ich beim Versuch, meinen Vertrag mit bereitzustellen, die Meldung web3.eth.Contract().deploy.send()Der Vertragscode konnte nicht gespeichert werden, bitte überprüfen Sie Ihr Gaslimit“ erhalten habe. ' Error.