บทความนี้แนะนำวิธีการใช้งาน Foundry เบื้องต้น ตั้งแต่ขั้นตอนการติดตั้ง compile test deploy verify และ interact กับ Smart Contract สำหรับมือใหม่
Foundry เป็นเครื่องมือสำหรับใช้ในพัฒนา Smart Contract ตั้งแต่ขั้นตอนการ complie test deploy interact Smart Contract บน chain
Foundry พัฒนาโดย Paradigm ด้วยภาษา Rust
Linux และ macOS:
เปิด terminal และรันคำสั่งต่อไปนี้
curl -L https://foundry.paradigm.xyz | bash
จากนั้นติดตั้ง Foundry ด้วยคำสั่งต่อไปนี้
foundryup
Windows:
สามารถดูวิธีการติดตั้งได้ใน link นี้
สร้างโปรเจคโดยใช้คำสั่งต่อไปนี้
forge init helloworld
จากนั้นจะพบ folder helloworld โดยภายในจะพบโครงสร้างของ folder ดังนี้
- foundry.toml: ไฟล์สำหรับกำหนด configure ของโปรเจคต่างๆ
- lib: สำหรับจัดเก็บ dependency ต่างๆ
- script: สำหรับจัดเก็บไฟล์สำหรับทำ scripting
- src: สำหรับจัดเก็บไฟล์ Smart Contract
- test: สำหรับจัดเก็บไฟล์สำหรับทำ testing
ทั้งนี้จะพบว่าภายในโปรเจคจะมีไฟล์ตัวอย่างอยู่ ให้เราลบออกทั้งหมด script/Counter.s.sol src/Counter.sol และ test/Counter.t.sol โดยลบเฉพาะไฟล์เหลือไว้เฉพาะ folder เปล่าๆ
จากนั้นสร้างไฟล์ HelloWorld.sol ใน folder src จากนั้นเขียนโค้ด ดังต่อไปนี้
ขออธิบายโค้ด HelloWorld ดังนี้
บรรทัด 1: ระบุ License ที่ใช้ ตอนนี้ไม่ได้ใช้เลยกำหนดเป็น UNLICENSED
บรรทัด 2: กำหนด version ของ solidity
บรรทัด 4: contract นี้มีชื่อว่า HelloWorld
บรรทัด 5: ประกาศตัวแปรชื่อ string message กำหนดค่าเป็น "HelloWorld"
บรรทัด 7-9: สร้างฟังก์ชั่น setMessage สำหรับกำหนดค่าใหม่ให้กับตัวแปร message
บรรทัด 11-13: สร้างฟังก์ชั่น getMessage สำหรับคืนค่าตัวแปร message
Compile HelloWorld Smart Contract โดยใช้คำสั่งต่อไปนี้
cd helloworld
forge build
จะได้ผลลัพธ์ต่อไปนี้
ต่อมาเราจะมาลองเขียนทดสอบ HelloWorld โดยสร้างไฟล์ชื่อว่า HelloWorld.t.sol ใน folder test จากนั้นเขียนโค้ดดังนี้
จากโค้ดข้างต้น เวลาจะให้ตั้งชื่อ function โดยมีคำว่า test นำหน้า โดยในตัวอย่างนี้ ผมสร้างไว้ 2 test คือ testInitialValue() และ testSetMessage() โดยที่:
1. testInitialValue() จะเป็นการทดสอบ getMessage ว่ามีค่าเป็นคำว่า HelloWorld ไหม? เนื่องจากตอน deploy ใน constructor มีการกำหนดค่า HelloWorld ไว้
2. testSetMessage() จะเป็นการทดสอบ setMessage คำว่า Thannob จากนั้นลอง getMessage ดูว่าค่าเป็น Thannob ไหม?
จากนั้น test โดยใช้คำสั่งต่อไปนี้
forge test
จะได้ผลลัพธ์ต่อไปนี้
จากผลลัพธ์ข้างต้น จะเห็นว่า testInitialValue() และ testSetMessage() ขึ้นว่า PASS ทั้งคู่
ในตัวอย่างนี้ผมจะ deploy ไปที่ Sepolia testnet โดยให้เตรียมของ ETH ไว้ใน account และ private key ของ account
จากนั้น deploy ไปที่ Sepolia testnet ด้วยคำสั่งต่อไปนี้
forge create src/HelloWorld.sol:HelloWorld --rpc-url https://rpc-sepolia.rockx.com --private-key YOUR-PRIVATE-KEY
จะได้ผลลัพธ์ดังต่อไปนี้
การ verify contract ให้ไปสมัคร api ของ etherscan เนื่องจากเราจำเป็นต้องใช้งาน apikey โดยไปที่ https://etherscan.io/ > ลงทะเบียน และ login > Profile > API keys > จากนั้นจะพบ API Key Token
จากนั้นสามารถ verifty ด้วยคำสั่งต่อไปนี้
forge create src/HelloWorld.sol:HelloWorld --rpc-url https://rpc-sepolia.rockx.com --private-key YOUR-PRIVATE-KEY --etherscan-api-key YOUR-API-KEY-TOKEN --verify
อย่างไรก็ตามสามารถศึกษาสำหรับการ deploy และทำ scripting ต่างๆเพิ่มเติมใน link นี้
เราสามารถ interact กับ smart contract โดยใช้ cast
เริ่มจากทดลอง call ไปที่ contract address (0xcbD6AaD59Bb886C0429a8B11225d207Ec2077702) function getMessage() โดยใช้คำสั่งต่อไปนี้
cast call YOUR-CONTRACT-ADDRESS "getMessage()" --rpc-url https://rpc-sepolia.rockx.com
ซึ่งจะได้ผลลัพธ์ดังต่อไปนี้
จากตัวเลขข้างต้นเมื่อนำมาแปลงเป็น ascii จะได้คำว่า HelloWorld
ต่อมาทดลอง send โดยใช้ function setMessage ด้วยคำว่า thannob โดยใช้คำสั่งต่อไปนี้
cast send YOUR-CONTRACT-ADDRESS "setMessage(string)" thannob --rpc-url https://rpc-sepolia.rockx.com --private-key YOUR-PRIVATE-KEY
ซึ่งจะได้ผลลัพธ์ดังต่อไปนี้
จากนั้นถ้าลองเรียก call ไปที่ getMessage() จะพบว่าได้ค่าเป็น thannob แทน
เราสามารถดูผลลัพธ์การทำงานต่างๆได้ที่ https://sepolia.etherscan.io/ จากนั้นให้นำเลข Contract Address ไปค้นที่ช่องค้นหาดังนี้
เท่านี้เราก็สามารถใช้งาน Foundry ตั้งแต่ขั้นตอนการติดตั้ง compile test deploy verify และ interact กับ Smart Contract เบื้องต้นได้เรียบร้อยครับ
หวังว่าบทความนี้คงเป็นประโยชน์ไม่มากก็น้อยนะครับ ลองนำไปต่อยอดกันดูนะครับ มีเวลาจะมาแบ่งปันอีกเรื่อยๆครับ
บทความโดย อ.ผศ.ดร.ธรรณพ อารีพรรค
วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต