ติดตั้งและลองใช้งาน Foundry

วันนี้ได้ลองหัดเล่น Foundry ซึ่งเคยติดตั้งไว้นานมากๆ แล้ว แต่ไม่ได้ใช้งานซักที ฮ่าๆ วันนี้ลองมานั่งอ่าน Foundry Book นั่งเล่นใหม่ พบว่ามันน่าสนใจมากๆ
ตัว Foundry ให้คำนิยามตัวเองไว้ คือ Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.
GitHub - foundry-rs/foundry: Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust. - GitHub - foundry-rs/foundry: Foundry is a blazing fast, portable and modular toolkit…GitHubfoundry-rs
ซึ่งถ้าแบ่งเป็นหมวดหมู่ จะมี 4 ส่วนคือ
- forge - Development tools เหมือน Hardhat ช่วย build, test, deploy Contract
- cast - เป็น Command Line Tool สำหรับ Ethereum RPC
- anvil - เป็นเหมือน Local Testnet คล้ายๆกับ Ganache หรือ Hardhat Node
- chisel - เป็น Solidity REPL
การติดตั้ง
การติดตั้งง่ายมาก แค่สั่งรัน Script ผ่าน Terminal
curl -L https://foundry.paradigm.xyz | bash
ซึ่งเครื่องผม (Mac OS) มี warning เกี่ยวกับ libusb ก็เลยต้องลงเพิ่ม
brew install libusb
เมื่อรัน Script ติดตั้ง Foundry เสร็จ ก็รันคำสั่ง (ต้อง เปิด/ปิด Terminal ใหม่)
foundryup
การใช้งาน
วิธีการเรียนรู้ที่ดีที่สุด คือลงมือทำ เริ่มจากลองสร้างโปรเจ็คขึ้นมา
$ forge init hello_foundry
src
- เป็น folder ที่เก็บ Contracttest
- ไฟล์ test เป็น Solidityfoundry.toml
- เป็น configuration files คล้ายๆ hardhat.config.js
ทดลอง build และ test ดูว่าเร็วแค่ไหน อ่าน log อ่านผลลัพธ์ดู
forge build
forge test
เขียน Test
ปกติเราเขียน Contract เป็น Solidity และเวลาเทส (Hardhat, Truffle) จะใช้ JavaScript ซึ่งตอนช่วงที่ผมหัดเขียน ผมก็แอบสงสัย ทำไมเราไม่เขียนเป็น Solidity ให้หมดเลย
พอเจอ Foundry ก็เห็นว่าตัวเทสก็เป็น Solidity เลย ตัว Contract เขียนไว้ยังไง เวลาเทส ก็เขียนคล้ายๆกัน ก็ทำให้ดู Logic ง่ายดีเหมือนกัน
ชอบตรง test เราสามารถ log level ได้เช่น
forge test -vvforge test -vvvvv
Cast
เป็นเหมือนชุดคำสั่ง ผ่าน Command ส่วนใหญ่ ก็เอาไว้จัดการกับ Ethereum RPC ต่างๆ สามารถ call contract ทำการส่ง transactions ได้ รวมถึง ดึงข้อมูล blockchain, balance, abi, utilities หรือจัดการ wallet ได้หมดเลย ดูคำสั่งเพิ่มเติม
cast --help
เช่น ดู transaction
cast tx 0xab4e378941d462fb7b1f97fed7fec8ea5d93d50a120b3a67b97c9b1ac88003b9 --rpc-url=https://rpc.ankr.com/eth
ดูค่า gas
cast gas-price --rpc-url=https://rpc.ankr.com/eth
เราสามารถ กำหนด eth_rpc_url
ใน foundry.toml
ได้ จะได้ไม่ต้องใส่เป็น option ทุกครั้ง
Convert wei
cast --from-wei 123450000000000000cast --to-wei 0.5
อันนี้จากตัวอย่างในหนังสือ ผมชอบมาก call contract ได้เลย (ตัวอย่างคือ call totalSupply() ของ DAI
$ cast call 0x6b175474e89094c44da98b954eedeac495271d0f "totalSupply()(uint256)" --rpc-url https://eth-mainnet.alchemyapi.io/v2/Lc7oIGYeL_QvInzI0Wiu_pOZZDEKBrdf8603853182003814300330472690
เทียบกับ Hardhat
เนื่องจากผมเคยใช้แค่ Hardhat ก็เลยอยากลอง List ดูว่า มีอะไรเหมือน หรือคล้ายๆ กับที่ใช้ Hardhat เวลาจะเปลี่ยนมาใช้ จะได้เข้าใจมากขึ้น
- ใช้ร่วมกับ Hardhat ได้ มีทั้ง Plugin ของ Foundry หรือใช้ hardhat-foundry ก็ได้
foundry.toml
เหมือนhardhat.config.js
เราสามารถกำหนด compiler, etherscan, private key, network อื่นๆ ได้- Foundry ใช้ Rust ส่วน Hardhat เป็น Node.js ฉะนั้นตัว library จะต่างกัน Hardhat ลง node_modules ซึ่งเราสามารถใช้ร่วมกันในโปรเจ็คได้ (แต่อาจจะต้อง config นิดนึง)
- ตัว Foundry Test ได้ไวกว่า (อ่านจากบล็อกต่างๆ ส่วนผมยังไม่เคยได้เทสเองนะ 😅)
- รู้สึกว่า Foundry ตัว Script ที่ Deploy มัน command line ยาวมาก อาจจะต้องทำเป็น Makefile, shell script และก็ตัว config ไม่แน่ใจแยก network ได้มั้ย หรือต้องคอย remapping ส่วนนี้ยังไม่ได้อ่าน
สรุป
วันนี้ก็ลองเล่นไปนิดๆหน่อย สิ่งที่เขียนหรือเข้าใจ ก็อาจจะผิดก็ได้นะครับ เดี๋ยววันถัดๆไป จะอ่านและทำความเข้าใจเพิ่ม เริ่มจากพวก Tutorials นี้ Creating an NFT with Solmate และก็จะลองเอาโปรเจ็คงาน Hardhat มาแปลงเป็น Foundry หรือใช้ร่วมกันดู ไว้มาเขียนบล็อกอัพเดทใหม่ วันหน้า
Happy Coding ❤️
References
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust