Solidez - Tratamento de Erros

O Solidity oferece várias funções para tratamento de erros. Geralmente, quando ocorre um erro, o estado é revertido para seu estado original. Outras verificações são para impedir o acesso não autorizado ao código. A seguir estão alguns dos métodos importantes usados ​​no tratamento de erros -

  • assert(bool condition)- Caso a condição não seja atendida, essa chamada de método causa um opcode inválido e quaisquer alterações feitas no estado são revertidas. Este método deve ser usado para erros internos.

  • require(bool condition)- Caso a condição não seja atendida, esta chamada de método retorna ao estado original. - Este método deve ser usado para erros em entradas ou componentes externos.

  • require(bool condition, string memory message)- Caso a condição não seja atendida, esta chamada de método retorna ao estado original. - Este método deve ser usado para erros em entradas ou componentes externos. Ele fornece uma opção para fornecer uma mensagem personalizada.

  • revert() - Este método aborta a execução e reverte todas as alterações feitas no estado.

  • revert(string memory reason)- Este método aborta a execução e reverte todas as alterações feitas no estado. Ele fornece uma opção para fornecer uma mensagem personalizada.

Exemplo

Tente o código a seguir para entender como funciona o tratamento de erros no 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.
   }
}

Quando reverter for chamado, ele retornará os dados hexadecimais conforme a seguir.

Resultado

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