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?
Es ist enthalten seit Solidity 0.4.22
. Es gibt einen zusammengeführten Zweig , der diese Funktion im Meilenstein hinzufügt.
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.22
und neuer kann es so verwendet werden
require(
msg.sender == _account,
"Sender not authorized."
);
Hinzufügen des Grundes als zweiten Parameter
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.
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
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 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.
Cyberience