Solidité - Gestion des erreurs

Solidity propose diverses fonctions de gestion des erreurs. En général, lorsqu'une erreur se produit, l'état revient à son état d'origine. D'autres contrôles visent à empêcher l'accès non autorisé au code. Voici quelques-unes des méthodes importantes utilisées dans la gestion des erreurs -

  • assert(bool condition)- Si la condition n'est pas remplie, cet appel de méthode provoque un opcode invalide et toutes les modifications apportées à l'état sont annulées. Cette méthode doit être utilisée pour les erreurs internes.

  • require(bool condition)- Si la condition n'est pas remplie, cet appel de méthode revient à l'état d'origine. - Cette méthode doit être utilisée pour les erreurs d'entrées ou de composants externes.

  • require(bool condition, string memory message)- Si la condition n'est pas remplie, cet appel de méthode revient à l'état d'origine. - Cette méthode doit être utilisée pour les erreurs d'entrées ou de composants externes. Il fournit une option pour fournir un message personnalisé.

  • revert() - Cette méthode annule l'exécution et annule toutes les modifications apportées à l'état.

  • revert(string memory reason)- Cette méthode annule l'exécution et annule toutes les modifications apportées à l'état. Il fournit une option pour fournir un message personnalisé.

Exemple

Essayez le code suivant pour comprendre le fonctionnement de la gestion des erreurs dans Solidity.

pragma solidity ^0.5.0;

contract Vendor {
   address public seller;
   modifier onlySeller() {
      require(
         msg.sender == seller,
         "Only seller can call this."
      );
      _;
   }
   function sell(uint amount) public payable onlySeller { 
      if (amount > msg.value / 2 ether)
         revert("Not enough Ether provided.");
      // Perform the sell operation.
   }
}

Lorsque revert est appelé, il renverra les données hexadécimales comme suit.

Production

0x08c379a0                     // Function selector for Error(string)
0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
0x000000000000000000000000000000000000000000000000000000000000001a // String length
0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data