Solidity - Xử lý lỗi

Solidity cung cấp nhiều chức năng khác nhau để xử lý lỗi. Nói chung khi xảy ra lỗi, trạng thái được hoàn nguyên trở lại trạng thái ban đầu. Các kiểm tra khác là để ngăn chặn truy cập mã trái phép. Sau đây là một số phương pháp quan trọng được sử dụng để xử lý lỗi:

  • assert(bool condition)- Trong trường hợp điều kiện không được đáp ứng, lệnh gọi phương thức này gây ra opcode không hợp lệ và mọi thay đổi được thực hiện đối với trạng thái đã được hoàn nguyên. Phương pháp này được sử dụng cho các lỗi nội bộ.

  • require(bool condition)- Trong trường hợp điều kiện không được đáp ứng, lệnh gọi phương thức này sẽ trở lại trạng thái ban đầu. - Phương pháp này được sử dụng cho các lỗi đầu vào hoặc các thành phần bên ngoài.

  • require(bool condition, string memory message)- Trong trường hợp điều kiện không được đáp ứng, lệnh gọi phương thức này sẽ trở lại trạng thái ban đầu. - Phương pháp này được sử dụng cho các lỗi đầu vào hoặc các thành phần bên ngoài. Nó cung cấp một tùy chọn để cung cấp một thông điệp tùy chỉnh.

  • revert() - Phương thức này hủy bỏ việc thực thi và hoàn nguyên mọi thay đổi được thực hiện về trạng thái.

  • revert(string memory reason)- Phương thức này hủy bỏ việc thực thi và hoàn nguyên mọi thay đổi được thực hiện về trạng thái. Nó cung cấp một tùy chọn để cung cấp một thông điệp tùy chỉnh.

Thí dụ

Hãy thử đoạn mã sau để hiểu cách xử lý lỗi hoạt động trong 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.
   }
}

Khi hoàn nguyên được gọi, nó sẽ trả về dữ liệu thập lục phân như sau.

Đầu ra

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