การใช้ Custom Errors ในภาษา Solidity
การทำ Error Handling น่าจะเป็น common ที่มีในทุกๆภาษา เพื่อจัดการกับ error case และ error message ซึ่ง Solidity ก็มีเช่นกัน ใน Solidity เรามักจะใช้ revert
กับ require
โดยวันนี้จะมาพูดถึงเรื่อง Custom Error ซึ่งจะใช้ในการทำ error ที่มันมากกว่าการใช้แค่ string เวลาเราจะใช้ revert('Error')
วิธีการทำ Custom Errors ในภาษา Solidity นั้นมีมาตั้งแต่ Solidity v0.8.4 ข้อดีคือลดค่า gas และก็ error message สื่อความหมาย ว่า error เพราะอะไร ข้อดีของ Custom Error คือมันค่อนข้าง dynamic เราสามารถใช้ type อื่นๆได้นอกเหนือจาก string
ตัวอย่าง
การใช้งาน custom error ง่ายๆ แค่ประกาศและตั้งชื่อเป็น error แบบนี้
หรืออยากใช้ Error ร่วมกับ Parameters ก็สามารถกำหนดได้เหมือนการสร้าง function
ทดลองสร้างโปรเจ็ค
ลองสร้างโปรเจ็คด้วย Hardhat ขึ้นมาแบบง่ายๆ เพื่อลองเทส Custom Error
โดยผมเลือกเป็น Sample project ธรรมดาเลย
สร้างไฟล์ CustomError.sol
ขึ้นมา มี function ง่ายๆ คือ hello()
และ hi(uint256 amount)
ที่จะ revert custom error
สร้างไฟล์ test/custom-error.test.js
ขึ้นมา
จากไฟล์เทสคือ
- เราใช้
loadFixture
ซึ่งเป็น helper ของ hardhat จัดการเรื่อง fixture ให้เรา - ใช้
revertedWithCustomError
ซึ่งปกติ ถ้า revert เราใช้revertedWith()
- และสำหรับ Custom Error ที่มีหลาย parameter ก็เลย เทสด้วย
.withArgs
เพื่อเช็คว่า argument ที่ส่งไป Custom Error ถูกต้องหรือไม่
ส่วน Test สุดท้าย ไม่มีอะไรมาก call hi()
ถ้าส่ง wei ไปไม่ถึง 10 ก็ ไม่โดน revert ได้ return true กลับมา ทดลองรันไฟล์เทส
จะได้ผลลัพธ์
เป็นอันเรียบร้อย 🎉
สรุป
บทความนี้ก็เป็นการแนะนำ Custom Error แบบคร่าวๆ ว่าการใช้งานทำยังไง และเราจะ design custom error แบบไหน ให้มันสื่อหรือเข้าใจง่าย รวมถึงตัวอย่างการเทส เงื่อนไขการ revert แบบคร่าวๆ โดยใช้ revertedWithCustomError
หวังว่าบทความนี้จะมีประโยชน์ไม่มากก็น้อย
Reference
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust