odan blog

hardhat を試した

Ethereum のスマートコントラクト開発の補助ツールである hardbat を試してみました。個人的には truffle の代替になってくれることを期待して試してみました。

試した内容は https://github.com/odan-sandbox/erc721-compare-gas-used にあります。

hardhat.config.js

  • デフォルトで生成される config ファイルはこんな感じ
require("@nomiclabs/hardhat-waffle");

// This is a sample Hardhat task. To learn how to create your own go to
// https://hardhat.org/guides/create-task.html
task("accounts", "Prints the list of accounts", async () => {
  const accounts = await ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

// You need to export an object to set up your config
// Go to https://hardhat.org/config/ to learn more

/**
 * @type import('hardhat/config').HardhatUserConfig
 */
module.exports = {
  solidity: "0.7.3",
};
  • 3つの部分から成るっぽい

キャッシュ

  • artifactscache にコンパイル結果をキャッシュしてくれるみたい
  • truffle だとコマンド実行するたびにコンパイルが走っていた記憶がある

TypeScript 対応

  • hardhat.config.js
    • グローバルな変数 hre やグローバルな関数 task があるので、型定義を書いてやる必要がある
    • グローバル変数、TypeScript で真面目にやるなら Solution style の tsconfig を書く必要があるのでめんどい...
declare var task: typeof import("hardhat/config").task
declare var hre: import("hardhat/types").HardhatRuntimeEnvironment;

scripts

  • https://hardhat.org/guides/scripts.html
  • npx hardhat run script.js みたいにして実行できる
    • グローバル変数 hre が自動的に inject される
  • 冪等性を担保する仕組みはない
    • デフォルトだと scripts に deploy.js というコントラクトをデプロイをするスクリプトファイルが生えるが、このファイルを実行するたびに新しいコントラクトがデプロイされてしまう
    • truffle はフレームワーク的だったけど、hardhat は toolchain 的な思想っぽい
    • デプロイプラグインについて議論中っぽい

グローバル変数 hre を使わない

eth-optimism/ovm-toolchain

テスト

感想

  • グローバル変数に依存しない仕組みの提供や、TypeScript に対応しているのが良い
  • 毎回コンパイルしないので動作が軽いのも良い
  • task は必要ない気がする
    • task runner 組みたいなら npm scripts やシェルスクリプトで良い
    • 引数をコマンドラインからよしなに受け取りたいなら yargs などを使うほうが良い
  • scripts はいい感じに network を切り替えるために使えるので有用
    • 本番運用するなら hardhat-deploy は必須な気がする
  • truffle よりは断然開発体験が良いのでこっちを使っていきたい