Foundry 已經成為開發人員在以太坊及其 L2 鏈上構建、測試和部署智能合約的首選工具之一。這篇文章將深入探討 Foundry 的優勢、使用方法,並通過一個簡單的 Counter 合約示例展示如何使用 Forge 部署合約以及如何使用 Cast 與合約互動。
Foundry 簡介
Foundry 是一個用 Rust 編寫的以太坊應用程序開發工具包,以其速度快、可移植性強和模塊化設計而著稱。與使用 JavaScript 的 Hardhat 等傳統開發工具不同,Foundry 完全以 Solidity 為中心,這使得開發過程更加一致和高效。
Foundry 主要由以下工具組成:
- Forge:用於編譯、測試、部署和驗證智能合約的命令行工具
- Cast:與區塊鏈交互的命令行工具,可進行智能合約調用、發送交易等
- Anvil:本地以太坊節點模擬器,用於開發和測試
- Chisel:Solidity REPL (Read-Eval-Print Loop) 環境
為什麼選擇 Foundry?
以 Solidity 為中心的開發體驗

Foundry 的一個主要優勢是它允許開發者使用 Solidity 編寫測試和部署腳本,而不是 JavaScript。這消除了在不同語言之間切換的需要,使開發流程更加流暢。
// 使用Solidity編寫測試
function testIncrement() public {
counter.increment();
assertEq(counter.number(), 1);
}
更快的編譯和測試速度
由於採用 Rust 開發,Foundry 在編譯和測試速度方面遠超基於 JavaScript 的工具。這在處理大型項目或運行大量測試時尤為重要。
豐富的模擬和調試功能
Foundry 提供了強大的模擬功能,包括通過 CheatCodes(作弊碼)來修改 EVM 狀態,如更改區塊時間、切換調用者地址等。這使得測試各種邊緣情況變得更加容易。
部署和驗證的無縫體驗
Foundry 使智能合約的部署和驗證過程變得簡單。它支持通過一個命令完成合約的部署和在 Etherscan 等平台上的驗證。
使用 Foundry 開發智能合約
安裝 Foundry
在 Linux 或 macOS 上,可以使用以下命令安裝 Foundry:
curl -L https://foundry.paradigm.xyz | bash
foundryup

初始化項目
使用以下命令初始化一個新的 Foundry 項目:
forge init my_project
cd my_project
這將生成一個具有以下結構的項目:
/src/
:存放智能合約/test/
:存放測試文件/script/
:存放部署腳本/lib/
:存放依賴庫/foundry.toml
:配置文件
編寫 Counter 合約
我們以一個簡單的 Counter 合約為例:
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
contract Counter {
uint256 public number;
function setNumber(uint256 newNumber) public {
number = newNumber;
}
function increment() public {
number++;
}
}
測試合約
Foundry 使用 Solidity 編寫測試。我們可以為 Counter 合約創建以下測試:
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import {Test, console} from "forge-std/Test.sol";
import {Counter} from "../src/Counter.sol";
contract CounterTest is Test {
Counter public counter;
function setUp() public {
counter = new Counter();
counter.setNumber(0);
}
function testIncrement() public {
counter.increment();
assertEq(counter.number(), 1);
}
function testSetNumber(uint256 x) public {
counter.setNumber(x);
assertEq(counter.number(), x);
}
}
運行測試:
forge test

從測試結果可以看出,我們的合約功能正常工作。
使用 Forge 部署合約
Foundry 提供了兩種部署智能合約的方式:使用forge create
或forge script
。
使用 forge create 部署
forge create --rpc-url <rpc-url> --private-key <private-key> src/Counter.sol:Counter --broadcast

這裡的--broadcast
標誌非常重要,它確保交易被發送到區塊鏈並等待確認。
你可以透過 cast 的 wallet 指令來部署合約,這樣可以避免暴露私鑰。首先,創建一個帳戶:
cast wallet i "<ACCOUNT-NAME>"
你也可以使用--verify
標誌來驗證合約,這樣在 Etherscan 上可以查看合約的源碼。
forge create --rpc-url $RPC_URL --account "<ACCOUNT-NAME>" src/Counter.sol:Counter --broadcast --verify
使用 forge create account 部署
forge create Counter --rpc-url $RPC_URL --account ACCOUNT-NAME --broadcast

使用 forge script 部署
首先,創建一個部署腳本(例如script/Counter.s.sol
):
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import "forge-std/Script.sol";
import "../src/Counter.sol";
contract CounterScript is Script {
function setUp() public {}
function run() public {
vm.startBroadcast();
new Counter();
vm.stopBroadcast();
}
}
然後運行腳本:
forge script script/Counter.s.sol:CounterScript --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast
forge script
的執行分為四個階段:
- 本地模擬:在本地 EVM 中運行腳本
- 鏈上模擬:在目標鏈上模擬交易
- 廣播:如果提供了
--broadcast
標誌,則廣播交易 - 驗證:如果提供了
--verify
標誌,則驗證合約
使用 Cast 與合約互動
部署完合約後,我們可以使用 Cast 與之互動。
讀取計數器值
cast call $CONTRACT_ADDRESS "number()(uint256)" --rpc-url $RPC_URL

這個命令將返回 Counter 合約中number
變量的當前值。
增加計數器值
cast send $CONTRACT_ADDRESS "increment()" --private-key $PRIVATE_KEY --rpc-url $RPC_URL --broadcast

這個命令將調用increment()
函數,增加計數器的值。
設置計數器值
cast send $CONTRACT_ADDRESS "setNumber(uint256)" 42 --private-key $PRIVATE_KEY --rpc-url $RPC_URL --broadcast
這個命令將調用setNumber()
函數,將計數器的值設置為 42。
結論
Foundry 已經成為以太坊和其他 L2 智能合約開發的強大工具。通過以 Solidity 為中心的開發流程,它簡化了智能合約的編寫、測試、部署和互動過程。特別是對於熟悉 Solidity 的開發者來說,Foundry 提供了一個更一致、更高效的開發體驗。
通過本文介紹的 Counter 合約示例,我們看到了如何使用 Forge 部署合約,以及如何使用 Cast 與合約互動。這只是 Foundry 功能的冰山一角,隨著深入學習,你會發現它還有更多強大的功能等待探索。
無論你是智能合約開發新手還是經驗豐富的開發者,Foundry 都提供了一套全面的工具,幫助你更高效地開發、測試和部署以太坊應用。