Solidity - การจัดการข้อผิดพลาด

Solidity มีฟังก์ชันต่างๆสำหรับการจัดการข้อผิดพลาด โดยทั่วไปเมื่อเกิดข้อผิดพลาดสถานะจะถูกเปลี่ยนกลับสู่สถานะเดิม การตรวจสอบอื่น ๆ เพื่อป้องกันการเข้าถึงรหัสโดยไม่ได้รับอนุญาต ต่อไปนี้เป็นวิธีการสำคัญบางอย่างที่ใช้ในการจัดการข้อผิดพลาด -

  • assert(bool condition)- ในกรณีที่ไม่ตรงตามเงื่อนไขการเรียกใช้เมธอดนี้จะทำให้เกิด opcode ที่ไม่ถูกต้องและการเปลี่ยนแปลงใด ๆ ที่ทำกับสถานะจะถูกเปลี่ยนกลับ วิธีนี้ใช้สำหรับข้อผิดพลาดภายใน

  • require(bool condition)- ในกรณีที่ไม่ตรงตามเงื่อนไขการเรียกใช้เมธอดนี้จะเปลี่ยนกลับเป็นสถานะดั้งเดิม - วิธีนี้ใช้สำหรับข้อผิดพลาดในอินพุตหรือส่วนประกอบภายนอก

  • require(bool condition, string memory message)- ในกรณีที่ไม่ตรงตามเงื่อนไขการเรียกใช้เมธอดนี้จะเปลี่ยนกลับเป็นสถานะดั้งเดิม - วิธีนี้ใช้สำหรับข้อผิดพลาดในอินพุตหรือส่วนประกอบภายนอก มีตัวเลือกในการระบุข้อความที่กำหนดเอง

  • revert() - วิธีนี้จะยกเลิกการดำเนินการและยกเลิกการเปลี่ยนแปลงใด ๆ ที่ทำกับสถานะ

  • revert(string memory reason)- วิธีนี้จะยกเลิกการดำเนินการและยกเลิกการเปลี่ยนแปลงใด ๆ ที่ทำกับสถานะ มีตัวเลือกในการระบุข้อความที่กำหนดเอง

ตัวอย่าง

ลองใช้รหัสต่อไปนี้เพื่อทำความเข้าใจว่าการจัดการข้อผิดพลาดทำงานอย่างไรใน 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.
   }
}

เมื่อเรียกย้อนกลับก็จะส่งคืนข้อมูลเลขฐานสิบหกดังต่อไปนี้

เอาต์พุต

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