閱讀進度 0%
0%

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

Web3智能合約Solidity約 3 分鐘閱讀
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

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

初始化項目

使用以下命令初始化一個新的 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 部署合約

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

使用 forge create 部署

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

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 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

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

增加計數器值

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

cast-send-increment

這個命令將調用increment()函數,增加計數器的值。

設置計數器值

cast send $CONTRACT_ADDRESS "setNumber(uint256)" 42 --private-key $PRIVATE_KEY --rpc-url $RPC_URL --broadcast

這個命令將調用setNumber()函數,將計數器的值設置為 42。

結論

bandori_family_ep13_339_現在正是復權的時刻

Foundry 已經成為以太坊和其他 L2 智能合約開發的強大工具。通過以 Solidity 為中心的開發流程,它簡化了智能合約的編寫、測試、部署和互動過程。特別是對於熟悉 Solidity 的開發者來說,Foundry 提供了一個更一致、更高效的開發體驗。

通過本文介紹的 Counter 合約示例,我們看到了如何使用 Forge 部署合約,以及如何使用 Cast 與合約互動。這只是 Foundry 功能的冰山一角,隨著深入學習,你會發現它還有更多強大的功能等待探索。

無論你是智能合約開發新手還是經驗豐富的開發者,Foundry 都提供了一套全面的工具,幫助你更高效地開發、測試和部署以太坊應用。

參考資料

關於 Calpa

Calpa 擅長使用 TypeScript、React.js 和 Vue.js 建立 Responsive Website。

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

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

熱門文章