เริ่มเขียน Smart Contract ด้วย Foundry

บทความนี้แนะนำวิธีการใช้งาน Foundry เบื้องต้น ตั้งแต่ขั้นตอนการติดตั้ง compile test deploy verify และ interact กับ Smart Contract สำหรับมือใหม่

Foundry คือ?

Foundry เป็นเครื่องมือสำหรับใช้ในพัฒนา Smart Contract ตั้งแต่ขั้นตอนการ complie test deploy interact Smart Contract บน chain

Foundry พัฒนาโดย Paradigm ด้วยภาษา Rust

Installation

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 Smart Contract

จากนั้นสร้างไฟล์ 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 Smart Contract

Compile HelloWorld Smart Contract โดยใช้คำสั่งต่อไปนี้

cd helloworld
forge build

จะได้ผลลัพธ์ต่อไปนี้

Testing

ต่อมาเราจะมาลองเขียนทดสอบ 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

ในตัวอย่างนี้ผมจะ 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

การ 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

เราสามารถ 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 เบื้องต้นได้เรียบร้อยครับ

หวังว่าบทความนี้คงเป็นประโยชน์ไม่มากก็น้อยนะครับ ลองนำไปต่อยอดกันดูนะครับ มีเวลาจะมาแบ่งปันอีกเรื่อยๆครับ

บทความโดย อ.ผศ.ดร.ธรรณพ อารีพรรค

วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต