PublishedAt

Hardhat

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

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

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

จะว่าไป ในการทำงานจริงๆ โอกาสที่เราจะได้ init project ใหม่ตั้งแต่ต้นนี่น่าจะนับครั้งได้เลย ส่วนใหญ่ก็จะพัฒนาต่อยอดจากที่มีอยู่ หรือพัฒนาโค๊ดเก่าๆ วันนี้เลยว่างๆ มาลองเล่น hardhat 3 ดูว่าเป็นไง

Hardhat | Ethereum development environment for professionals by Nomic Foundation
Hardhat is an Ethereum development environment. Compile your contracts and run them on a development network. Get Solidity stack traces, console.log and more.hardhat.org

ส่วนตัว ถามว่า leanring curve ของ Hardhat ผมว่ามันดูใช้งานง่ายกว่า Foundry นะ config ง่ายดี และก็การ deploy ก็ทำผ่าน scripts ของ Foundry ผมใช้วิธีแยก ไฟล์ .zsh แทน

วิธีการติดตั้ง

Terminal window
npx hardhat --init
# หรือ bunx hardhat --init

เลือกเป็น “Hardhat 3 Beta (recommended for new projects)” จะได้แบบนี้

Terminal window
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)

ตัวโปรเจ็คจะมีหน้าตาแบบนี้

Terminal window
.
├── 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)

Terminal window
npx hardhat build

การเทส เหมือน Hardhat 2 คือจะทำการ build และรันเทสให้เรา โดยจะรันได้ทั้ง solidity และ js/ts test เลย ซึ่งตัว solidity test ก็ใช้ forge-std นั่นเอง

Terminal window
npx hardhat test

Test result

ผมไม่แน่ใจว่า hardhat มันรองรับการดู test traces แบบที่ Foundry (forge) ทำรึเปล่า คือดู -vvv และ -vvvv ได้

Local Node

ตัว hardhat ยังคงมี Local Node มาให้เหมือนเดิม (แบบเดียวกับ foundry anvil)

Terminal window
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 เท่านั้น อย่าเอาไปใช้จริงๆละ

และรัน

Terminal window
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,
},
},
};

คำสั่ง

Terminal window
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
avatar

Chai Phonbopit

เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust