Foundry:構建和部署 Web3 智能合約的強大工具

Foundry:構建和部署 Web3 智能合約的強大工具
作者: Calpa Liu
字數:1391
出版:2025年3月24日
分類: Web3 Smart ContractSolidity

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 為中心的開發體驗

Solidity
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

foundryup
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-test.avif
forge-test.avif

從測試結果可以看出,我們的合約功能正常工作。

使用 Forge 部署合約

Foundry 提供了兩種部署智能合約的方式:使用forge createforge script

使用 forge create 部署

forge create --rpc-url <rpc-url> --private-key <private-key> src/Counter.sol:Counter --broadcast

forge-create-counter.avif
forge-create-counter.avif

這裡的--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-create-counter-account.avif
forge-create-counter-account.avif

使用 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的執行分為四個階段:

  1. 本地模擬:在本地 EVM 中運行腳本
  2. 鏈上模擬:在目標鏈上模擬交易
  3. 廣播:如果提供了--broadcast標誌,則廣播交易
  4. 驗證:如果提供了--verify標誌,則驗證合約

使用 Cast 與合約互動

部署完合約後,我們可以使用 Cast 與之互動。

讀取計數器值

cast call $CONTRACT_ADDRESS "number()(uint256)" --rpc-url $RPC_URL

cast-call-number
cast-call-number

這個命令將返回 Counter 合約中number變量的當前值。

增加計數器值

cast send $CONTRACT_ADDRESS "increment()" --private-key $PRIVATE_KEY --rpc-url $RPC_URL --broadcast

cast-send-increment
cast-send-increment

這個命令將調用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 都提供了一套全面的工具,幫助你更高效地開發、測試和部署以太坊應用。

參考資料

感謝您閱讀我的文章。歡迎隨時分享你的想法。
Web3 Smart ContractSolidity
關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。