Hardhat vs Foundry:選擇適合的以太坊開發工具

以下是在選擇 Hardhat 和 Foundry 時需要考慮的一些事項。

5 分鐘閱讀
Hardhat vs Foundry:選擇適合的以太坊開發工具

為您的 dapp 開發選擇合適的工具,不僅影響生產力,也會影響智能合約的測試、部署和維護效果。在這篇文章中,我們比較了 Ethereum dapp 開發者常用的兩種選擇:Foundry 與 Hardhat,重點介紹它們的安裝需求、測試與部署工作流程,以及各自的技術特點與限制。

關於 Hardhat

Hardhat 是一個成熟的開發環境,專為協助開發者管理和自動化智能合約開發中的各項任務而設計,以其靈活且高度適應性著稱。Hardhat 內建 Hardhat Network,這是一個專為開發設計的本地 Ethereum 網路,可輕鬆進行測試、部署和除錯。

開發者可透過互動式控制台直接與部署在 Hardhat Network 上的智能合約互動,提供一個專為開發任務量身打造的完整本地環境。Hardhat 也支援豐富的插件生態系統,讓開發者能輕鬆擴展其功能。不過,部分使用者可能會覺得 Hardhat 的初始設定與配置較為複雜。

關於 Foundry

另一方面,Foundry 是一個相對較新的開發工具包,強調速度與可靠性。它以 Forge 為核心,這是一個強大的測試框架,讓開發者能高效地撰寫、編譯和測試智能合約。Foundry 的一大亮點是其快速測試能力,Forge 測試框架大幅縮短了測試執行時間,讓開發者能更快速地進行迭代。

此外,Foundry 內建原生除錯工具,協助開發者直接在環境中診斷並修復問題。Foundry 也能與 Ethereum 生態系統中的其他工具無縫整合,讓開發流程更加順暢。然而,由於相對較新,Foundry 可能缺乏像成熟工具那樣廣泛的社群支援。

Hardhat 與 Foundry 的技術比較

在本節中,我們將使用一個基本的隨機加總智能合約。這個智能合約在 Hardhat 和 Foundry 中保持相同,但兩個框架的專案設定會略有不同。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract RandomSum {
    // Function to generate a pseudo-random number based on input
    function random(uint seed) private view returns (uint) {
        return uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, seed))) % 100;
    }

    // Function to generate two random numbers and return their sum
    function generateSum() public view returns (uint sum) {
        uint num1 = random(1);
        uint num2 = random(2);
        sum = num1 + num2;
    }
}
複製

安裝:

Hardhat:

要開始使用 Hardhat,您需要在機器上安裝 Node.js。完成後,可依照以下步驟建立新的 Hardhat 專案:

  1. 初始化新的 Node.js 專案:

mkdir randomsum
cd randomsum
npm init -y
複製
  1. 安裝 Hardhat:

npm install --save-dev hardhat
  1. 建立 Hardhat 專案:

npx hardhat
  1. 依照提示建立基本專案。選擇「Create an empty hardhat.config.js」進行最簡設定,或選擇建立範例專案。這將設定一個包含所有必要配置的 Hardhat 環境。

合約:將您的 RandomSum 合約放置於 contracts 資料夾中。

Foundry

Foundry 使用 Rust,因此您需要先在系統上安裝 Rust。準備好 Rust 後,執行以下指令安裝 Foundry:

  1. 安裝 Foundry:

curl -L <https://foundry.paradigm.xyz> | bash
foundryup
複製
  1. 初始化新的 Foundry 專案:

forge init randomsum-foundry
cd randomsum-foundry
複製

合約:將您的 RandomSum 合約放置於 src 目錄中。

本地區塊鏈部署

Hardhat

  • 本地區塊鏈:使用 Hardhat Network,當您執行測試或部署合約等任務時,它會自動啟動。

  • 部署腳本:在 scripts/deploy.js 下建立腳本:

async function main() {
    const RandomSum = await ethers.getContractFactory("RandomSum");
    const randomSum = await RandomSum.deploy();
    await randomSum.deployed();
    console.log("RandomSum deployed successfully:");
}

main().catch((error) => {
    console.error(error);
    process.exit(1);
});
複製
  • 執行部署:使用以下指令執行部署:

npx hardhat run scripts/deploy.js --network localhost

Foundry

  • 本地區塊鏈:Foundry 使用 anvil,一個本地 Ethereum 節點。在獨立的終端機中執行以下指令啟動本地節點。

anvil
  • 部署腳本:直接使用 forge create 指令:

forge create RandomSum --private-key YOUR_PRIVATE_KEY --rpc-url

測試網路部署

Hardhat

  • 網路配置:在 hardhat.config.js 中配置所需網路,新增網路設定區段(例如 Sepolia)。

module.exports = {
  solidity: "0.8.0",
  networks: {
    sepolia: {
      url: "https://linea-sepolia.infura.io/v3/YOUR_INFURA_KEY",
      accounts: [`0x${process.env.PRIVATE_KEY}`]
    }
  }
};
複製
  • 部署:將網路選項改為 Sepolia,執行相同的部署腳本。

Foundry

  • 網路配置:無需額外的配置檔案;直接在指令中指定網路。

  • 部署:使用:

forge create RandomSum --private-key YOUR_PRIVATE_KEY --rpc-url

智能合約測試

Hardhat

  • 撰寫測試:使用 JavaScript 在 test/randomSum.js 中建立測試檔案:

const { expect } = require("chai");

describe("RandomSum", function() {
  it("Should return the sum of two random numbers", async function() {
    const RandomSum = await ethers.getContractFactory("RandomSum");
    const randomSum = await RandomSum.deploy();
    await randomSum.deployed();

    const sum = await randomSum.generateSum();
    expect(sum).to.be.a('number');
  });
});
複製
  • 執行測試:使用以下指令執行:

npx hardhat test

若測試遇到問題,只需從 @nomicfoundation/hardhat-toolbox/network-helpers 加入 loadFixture 函式即可。

使用 loadFixture 的主要優點:

  • 透過還原至快照,為每個測試建立乾淨的環境。

  • 比為每個測試重新部署合約更有效率。

  • 可在多個測試之間共用設定程式碼。

Foundry

  • 撰寫測試:使用 Solidity 在 test/RandomSum.t.sol 中新增測試檔案:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "ds-test/test.sol";
import "../src/RandomSum.sol";

contract RandomSumTest is DSTest {
  RandomSum randomSum;

  function setUp() public {
    randomSum = new RandomSum();
  }

  function testGenerateSum() public {
    uint sum = randomSum.generateSum();
    assertTrue(sum >= 0 && sum <= 198); // since each random number is <100
  }
}
複製
  • 執行測試:使用:

forge test

結論

選擇 Hardhat 還是 Foundry,通常取決於團隊的技術背景和專案的具體需求。如果團隊熟悉 JavaScript,且需要與網頁技術進行廣泛整合,Hardhat 可能是更好的選擇。其豐富的插件生態系統和靈活的環境,使其非常適合需要高度客製化並與各種網頁技術互動的專案。

另一方面,如果專案需要快速的開發週期,且專注於智能合約本身,Foundry 提供了一個吸引人且高效的選擇,讓一切都保持在 Solidity 生態系統之內。其速度和對 Solidity 的原生支援,能大幅提升專注於智能合約開發的團隊生產力。

總體而言,兩種工具各有其優勢,正確的選擇取決於您專案的獨特需求以及團隊的專業能力。

AI 翻譯。可能包含錯誤。請務必核實資訊。

評價此翻譯