Fracton CTOの赤澤です。Solidityでスマートコントラクトを開発する際に何かのツールを使うことがほとんどだと思います。そんな中でも特に人気なものといえばHardhatでしょう。また、最近人気急上昇なツールにFoundryもあります。弊社でも、この二つを基本的に使っていますが、どっちもどっちなところも多いのが事実です。両方の特徴を考慮しつつ、弊社内での使い分けを考える機会があったので、今回はそれを綴ってみました。
Hardhat
HardhatはNomic Foundationにより開発されているオープンソースであり、世界的に利用者が多いツールです。コンパイルやデプロイ、テストなど一通りの開発工程がこれ一本で完結する優れものです。しかも、プラグインを導入することで、テストカバレッジを測ったり、ガスの計算ができたりと状況に応じてかなり応用を効かせられます。
Node.jsがあればコマンド一発で導入でき、TypeScriptで開発することも可能です。
Foundry
FoundryはクリプトVCであるParadigmが開発したオープンソースです。最大の特徴はなんといっても処理の速さにあります。Rustで開発されておりパフォーマンスが高く、公式サイトにはHardhatで15.244秒掛かっていたところがFoundryだと9.449秒で完了したと書かれています。
また、テストコードをSolidityで書くことができ、型などについて頭を切り替える必要も特にありません。また、Fuzz testingやDifferential testingといったより高度なテストも簡単に実行できるので、セキュリティが求められるスマートコントラクト開発の大きな力になってくれます。
かく言う私もFoundryに感動して最近使う頻度が多くなっています、笑
Paradigm謹製のFoundry、どんなもんかと思ってHardhatから乗り換えたら快適すぎて優勝してる。Solidity書くのってこんなに楽しかったっけって気持ちになるレベル。
— Naoki Akazawa(赤澤直樹) (@akazawa_naoki) 2022年4月20日
・速い
・テスト書きやすい
・テストやりやすい
・思ったより機能豊富https://t.co/DA035xgbCQ
hardhatにインスパイアされている使い勝手ということもあり愛好家が増えてきています。
結局どっち?
こうなってくると実際の開発現場でどっちを使うかという問題が持ち上がります。実はこの点について考えるキッカケが、弊社が実施しているインキュベーションプログラムで開催したオフィスアワー内での一コマでした。そこで開発ツールに何を使っているのかと言う話になり、HardhatやFoundryの名前が上がりましたが、その時にフロントエンドとの連携が話題になりました。
開発チームが全員それなりにSolidityが読み書きできるならまだしも、そこまで詳しいわけではない場合、Hardhatのテストコードがそのまま参考になると。
考えてみれば、本来テストコードは望ましい処理を理解する上でとても役に立つものなのでそれはそうですね。
確かに今後フロントエンドエンジニアがWeb3界隈に参入してくることを考えれば、スマートコントラクトの処理がどうなっているのか一から追いかけるのは中々に骨が折れます。テストコードが、TypeScriptなどで書かれていればそれを土台にすることはできます。
弊社の場合、フロントエンドも作る必要がある場合も多いため、これはそれなりに大事なポイントになります。当然HardhatとFoundryの両方で書けばいいという選択肢もありますが、工数が増えるのでここでは一旦ナシです。
Foundryのパフォーマンスの高さを活かしてテストをぶん回すのも捨てがたいですが、例えばFuzz testingのようなより高度で試行回数が多いようなテストはFoundryに任せてしまうのが良さそうです。
そんなこんなあり、結果的には通常の開発とテストカバレッジを100に近づける部分はHardhatで、Fuzz testingなど馬力のいるテストはFoundryでという使い方に落ち着いています。ただし、フロントエンドの開発が完全に計画に入らない場合は、Foundry一本でokという風にしています。
まとめ
今回はHardhatとFoundryの使い分けについて綴ってみました。弊社はフロントエンドの開発が計画にあるか無いかで判断するフロー考えていますが、ベストな構成なんて状況によってまちまちなのでそれぞれの環境に合わせて考えてみてください。