HardhatとFoundry:最適なEthereum開発ツールの選び方

HardhatとFoundryを選ぶ際に考慮すべき点をいくつか紹介します。

5分で読める
HardhatとFoundry:最適なEthereum開発ツールの選び方

Dappの開発に適切なツールを選ぶことは、生産性に影響するだけでなく、スマートコントラクトのテスト、デプロイ、メンテナンスの効率にも大きく関わります。このブログでは、EthereumのDapp開発者に人気の2つの選択肢、FoundryとHardhatを比較し、インストール要件、テストおよびデプロイのワークフロー、そして具体的な技術的側面と制限について解説します。

Hardhatについて

Hardhatは、スマートコントラクト開発に関わるタスクの管理と自動化を支援するために設計された、実績ある開発環境です。その柔軟性と適応性の高さで知られています。HardhatにはHardhat Networkという開発向けのローカルEthereumネットワークが搭載されており、テスト、デプロイ、デバッグを簡単に行うことができます。

開発者はインタラクティブなコンソールを通じて、Hardhat Networkにデプロイされたスマートコントラクトと直接やり取りでき、開発タスクに特化した包括的なローカル環境を利用できます。また、Hardhatは充実したプラグインエコシステムをサポートしており、機能を簡単に拡張することが可能です。ただし、初期セットアップや設定が複雑に感じるユーザーもいるかもしれません。

Foundryについて

一方、Foundryは、スピードと信頼性を重視した比較的新しい開発ツールキットです。強力なテストフレームワークであるForgeを基盤として構築されており、スマートコントラクトの記述、コンパイル、テストを効率的に行うことができます。Foundryの主な特徴の一つは、高速なテスト機能です。ForgeのテストフレームワークはテストのExecution Timeを大幅に短縮し、開発者がより迅速にイテレーションを繰り返せるようにします。

さらに、Foundryにはネイティブのデバッグツールが搭載されており、開発者が環境内で直接問題を診断・修正できます。また、Ethereumエコシステムのほかのツールともシームレスに統合でき、より効率的な開発プロセスを実現します。ただし、比較的新しいツールであるため、より確立されたツールと比べてコミュニティサポートが充実していない場合があります。

HardhatとFoundryの技術的比較

このセクションでは、基本的なランダムサムのスマートコントラクトを使用します。このスマートコントラクトはHardhatとFoundryで同じものを使用しますが、プロジェクトのセットアップは2つのフレームワーク間で若干異なります。

// 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を使用します。別のターミナルで以下を実行してローカルノードを起動してください。

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に精通しており、Webテクノロジーとの広範な統合が必要な場合は、Hardhatが適した選択肢となるでしょう。充実したプラグインエコシステムと柔軟な環境により、高度なカスタマイズや様々なWebテクノロジーとの連携が求められるプロジェクトに最適です。

一方、スマートコントラクトに特化した迅速な開発サイクルが求められるプロジェクトには、Foundryが魅力的で効率的な選択肢となります。すべてをSolidityエコシステム内で完結させることができ、そのスピードとSolidityのネイティブサポートにより、スマートコントラクト開発に専念するチームの生産性を大幅に向上させることができます。

最終的には、どちらのツールにも強みがあり、最適な選択はプロジェクト固有の要件とチームの専門知識によって異なります。

AIによる翻訳です。エラーが含まれている可能性があります。常に情報を確認してください。

翻訳を評価する