มาลองใช้งาน Hardhat 3 กันดีกว่า

ตั้งแต่ไปใช้ Foundry ก็แทบจะไม่ได้ใช้ Hardhat เลย หลังจากได้ยินว่า Hardhat 3 ออกมา รองรับ Test แบบใช้ solidity แล้ว (เทสได้ทั้ง .sol
และ .ts
) เลยลองมาใช้งานดูว่าจะเป็นยังไง ขอเขียนโน๊ตเอาไว้เล็กๆน้อยๆละกัน
จะว่าไป ในการทำงานจริงๆ โอกาสที่เราจะได้ init project ใหม่ตั้งแต่ต้นนี่น่าจะนับครั้งได้เลย ส่วนใหญ่ก็จะพัฒนาต่อยอดจากที่มีอยู่ หรือพัฒนาโค๊ดเก่าๆ วันนี้เลยว่างๆ มาลองเล่น hardhat 3 ดูว่าเป็นไง

ส่วนตัว ถามว่า leanring curve ของ Hardhat ผมว่ามันดูใช้งานง่ายกว่า Foundry นะ config ง่ายดี และก็การ deploy ก็ทำผ่าน scripts ของ Foundry ผมใช้วิธีแยก ไฟล์ .zsh
แทน
วิธีการติดตั้ง
npx hardhat --init
# หรือ bunx hardhat --init
เลือกเป็น “Hardhat 3 Beta (recommended for new projects)” จะได้แบบนี้
bunx hardhat --init 190
█████ █████ ███ ███ ███ ██████░░███ ░░███ ░███ ░███ ░███ ███░░███ ░███ ░███ ██████ ████████ ███████ ░███████ ██████ ███████ ░░░ ░███ ░██████████ ░░░░░███░░███░░███ ███░░███ ░███░░███ ░░░░░███░░░███░ ████░ ░███░░░░███ ███████ ░███ ░░░ ░███ ░███ ░███ ░███ ███████ ░███ ░░░░███ ░███ ░███ ███░░███ ░███ ░███ ░███ ░███ ░███ ███░░███ ░███ ███ ███ ░███ █████ █████░░███████ █████ ░░███████ ████ █████░░███████ ░░█████ ░░██████░░░░░ ░░░░░ ░░░░░░░ ░░░░░ ░░░░░░░ ░░░░ ░░░░░ ░░░░░░░ ░░░░░ ░░░░░░
👷 Welcome to Hardhat v3.0.1 👷
? Which version of Hardhat would you like to use? …❯ Hardhat 3 Beta (recommended for new projects) Hardhat 2 (older version)
ตัวโปรเจ็คจะมีหน้าตาแบบนี้
.├── contracts│ ├── Counter.sol│ └── Counter.t.sol├── hardhat.config.ts├── ignition│ └── modules│ └── Counter.ts├── package.json├── README.md├── scripts│ └── send-op-tx.ts├── test│ └── Counter.ts└── tsconfig.json
5 directories, 9 files
การ compile และ build ก็ยังคงเหมือนเดิม (ใช้ solidity compiler เดียวกันกับที่ตั้งค่าใน hardhat.config.ts
)
npx hardhat build
การเทส เหมือน Hardhat 2 คือจะทำการ build และรันเทสให้เรา โดยจะรันได้ทั้ง solidity และ js/ts test เลย ซึ่งตัว solidity test ก็ใช้ forge-std
นั่นเอง
npx hardhat test
ผมไม่แน่ใจว่า hardhat มันรองรับการดู test traces แบบที่ Foundry (forge) ทำรึเปล่า คือดู -vvv
และ -vvvv
ได้
Local Node
ตัว hardhat ยังคงมี Local Node มาให้เหมือนเดิม (แบบเดียวกับ foundry anvil
)
npx hardhat node
Deploy a contract
เราจะใช้ตัว Hardhat Ignition ในการ deploy
import { buildModule } from '@nomicfoundation/hardhat-ignition/modules'
export default buildModule('CounterModule', (m) => { const counter = m.contract('Counter')
m.call(counter, 'incBy', [5n])
return { counter }})
โดยใช้งาน deploy ไป local node localhost:8545
เพิม networks ใน hardhat.config.ts
{ networks: { localhost: { type: "http", chainType: "l1", url: "http://localhost:8545", accounts: [configVariable("LOCAL_PRIVATE_KEY")], }, }}
อย่าลืมกำหนด
LOCAL_PRIVATE_KEY
ใน.env
เอาจาก Local Node มาใช้ เพราะเป็น private key ที่ใช้ dev เท่านั้น อย่าเอาไปใช้จริงๆละ
และรัน
npx hardhat --network localhost ignition deploy ignition/modules/Counter.ts
Verify Contract
การ verify contract คล้ายๆ กับ Hardhat 2 เลย ก็คือกำหนด config ใน hardhat.config.ts
const config: HardhatUserConfig = { // ... verify: { etherscan: { apiKey: "YOUR_ETHERSCAN_API_KEY", }, },};
หรืออย่าง Blockscout ก็ไม่ต้องใช้ API Key ก็ verify ได้เลย
const config: HardhatUserConfig = { // ... verify: { blockscout: { enabled: false, }, },};
คำสั่ง
npx hardhat verify --network sepolia 0x1234567890...
ผมไม่แน่ใจว่า Hardhat มันสามารถ deploy และ verify ใน command เดียวได้เลยมั้ยนะ หรือต้องเขียน custom script ขึ้นมาเอง แต่ใช้ foundry เป็น bash script ง่ายๆ ก็ deploy พร้อม verify ได้เลย
สรุป
ส่วนตัวผมรู้สึกชอบ Hardhat มากกว่า ตรงที่พวก scripts อะไรมันง่ายดี แต่ติดตรงที่มันเทส solidity ไม่ได้ ก็เลยได้ไปลองใช้ Foundry และก็ชอบเลย ทีนี้ พอ Hardhat3 ก็ใช้ forge std ในการเทส Solidity ได้แล้ว ไม่แน่ โปรเจ็คหน้า ก็อาจจะใช้ Hardhat เป็น dev tools ก็ได้ จริงๆ ก็ยังใช้ Hardhat บ้างตอนที่ deploy upgradable contract นะ เพราะทำใน Foundry ไม่เป็น ตอนนั้นยังไม่เห็นว่ามีหรือไม่มี openzeppelin-foundry-upgrades
ด้วย ฮาๆ
Happy Coding
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust