Foundry Ethereum開発ツールボックスの紹介

Kentaro Vadney
11 min readJan 12, 2022

https://www.paradigm.xyz/2021/12/introducing-the-foundry-ethereum-development-toolbox/

以上の記事の翻訳です。

問題や質問がある場合はTwitterで@KentaroVadneyを連絡してください!(テクニカルなものは英語の方が良いですが日本語も OKです)

12..72021 | Georgios Konstantopoulos

たち がここ数ヶ月間開発してきたプロジェクトを発表できることを嬉しく思います。 Foundry です

Foundryは、 Ethereumアプリケーション開発のための、ポータブルで高速なモジュール式ツー ルキットです。

なぜ Foundry?

設定やサードパーティのライブラリなしですぐに動作する、最速かつ最も柔軟な Ethereum開発 環境 を求めるなら 、 Foundryのツールである forge と cast を使うべきです。

謝辞を述べます。 Foundryは、テストフレームワーク dapptoolsを再実装したものです。Rustで書かれており、非常に高速で インストールしや すく、より多くのコントリビューターに親しまれるようになっています。私たちのコードベース はフォークではありませんが(複数の

SOLCバージョンをサポートするなど、多くの追加機能を持 っています)、 DappHubチームの長年にわたる革新的な仕事がなければ、このようなことはでき ませんでした。ありがとう、 DappHub!

以下の Ethereum開発のヒントに同意するなら、 Foundryはあなたのためのものです。

テストは Solidityで書くべきです。

ほとんどの開発者は未だに Javascriptや Typescriptを使って Solidityをテストしていますが、これは素 晴らしいことではありません。

JSでテストを行うには、多くの定型文、大きな依存関係( node_modules/を見ています)、設 定ファイルが必要になります。 例として、 Paul Berg氏の solidity-templateを見てみましょう。 (https:// github.com/paulrberg/solidity-template)を参照し てください。

さらに、 Ethereumの数値を JSで表示するには、 bignumber.js、 BigNumber、 bn、または JSの新しい ネイティブな BigIntなどの BigNumberライブラリを使用する必要がありますが、これらは頻繁に非 互換性の問題や生産性の低下を引き起こします。

最後に、 Solidityではなく JSでテストするということは、実際にテストしたいものから抽象度 1を 下げて操作することになり、最低でも Mochaと Ethers.jsまたは Web3.jsに精通している必要があ ります。これは、 Solidity開発者の参入障壁を高めることになります。

Forgeでは、 Solidityでテストを書くことができるので、重要なこと、つまり良いテスト を書くことに集中することができます。シンプルな Solidityのテストは次のようなもの です。

関数をファジングする必要があります。

コード内の全ての関数をユニットテストし、 100%のテストカバレッジを得ようとしたとして も、テストしなかったエッジケースがあるかもしれません。 Fuzzingでは、 Solidityのテスト関 数に引数を与えるだけで、 Solidityのテストランナーがランダムに引数を選択してくれます。

上記のスマートコントラクトのファズテストの例を示します。

ファザーはこの関数をランダムな xの値で自動的に試します。テストを失敗させるような入力 を見つけたら、それをあなたに返しますので、バグを修正した後にリグレッションテストを作 成することができます。

このテストを実行すると、 CLIで以下のようなレスポンスが得られます。

また、縮小もサポートしているので、コードが失敗するような「最小限」の反例を得るこ とができます(例えば、非常に大きな数字やバイト文字列ではなく)。

テストで VMの状態をオーバーライドすることができるはずです。

特定のブロック数を必要とする機能をテストしようとしたことはありますか?確かに、 RPCメソ ッド evm_mineを呼び出すことはできますが、 Compound Governanceのコントラクトをテストして

いて、 40,000ブロックを進める必要がある場合はどうでしょうか?

メインネットのトランザクションをシミュレートして、自分のアカウントに特定のトークンの残 高を与えたり、許可された機能への書き込みアクセスをしたいと思ったことはありませんか?

これらの問題を解決するために、我々は VMチートコードを提供し、 テスト実行時に VMの 状態 を 変更できるようにしています。 これは、事前に設定されたアドレスに存在するコントラクトを 介してテスト作成者に公開されます。以下の簡単な例では、ブロックのタイムスタンプを上書きする方法を示しています。

その他のチートコードについての詳細は、 READMEを参照してください。チートコ ードは非常に強力です

(例 : store では任意のコントラクトストレージスロットを上書きでき、

prank では任意のアカウントから任意の電話をかけることができます )。テスト が探索する コード パスを拡張するためにチートコードを使用することをお勧めします。 また 、 新しいチートコードを 投稿することも お勧めします。

(https:// github.com/gakonst/foundry/blob/master/evm-

adapters/src/sputnik/cheatcodes/cheatcode_handler.rs#L249-L397) となっています。

稼動中のネットワークの状態に対してテストを実行できるようにす る必要があります。

多くの Ethereum開発ツールと同様に、 Forgeはノードの URL(アーカイブノードを持っている場 合は、テストを ブロック に 固定するために、オプションでブロック番号も )を指定することで、リモートネットワークの状態に対する「フォーク」をサポートしています 。

forge test --fork-url <your node url> [--fork-block-number <the block number you want>].

を実行する だけです 。

テストを実行している間、デバッグ情報をログに記録することがで きるはずです。

Forge は、 ds-testの emit log_ 関数と、 Hardhat の console.log を使って、 ランタイムのデバッグログをサポートしています 。

よしわかった。でも何から始めればいいの?

Forgeと Castは、

cargo install — git https://github.com/gakonst/foundry — locked

を実行する ことで インストール できます ( Rustは 、 まだインストールして い なければ、 ここ (https:::/// rustup. rs/)で インストール でき ます )。 また、 プラットフォーム ごとに スタティックビル ドされたバイナリ を配布したり 、 brewや aptパッケージ を提供する 予定 です 。 もしあなたが 以 前にプロジェクトの 自動 リリース フロー を行ったことが あれ ば、ぜひ 連絡 し てください!

インストール 後 は、 forge initで 新規 プロジェクト を作成し (デフォルト では カレント ディレクト リ に作成 )、 forge buildを 行うだけです 。

なんと、<2s>でスタートしました。

速度は?

テスト速度を比較するために、いくつかの Dapptoolsリポジトリに対してベンチマークを行い ました。統合テストは こちら でもご覧い ただけます。

github.com/OpenZeppelin/openzeppelin-contractsを Forge と Hardhat で コンパイルしました。 Hardhatの コンパイルには 15.244秒かかったのに対し、 Forgeで は 9.449秒でした。その他 のベンチマークも有望な(そしてニュアンスのある!)結果を示しました。もしかしたら、コンパイルとテストのためのフレームワークのベンチマークテストスイートが必要かもしれません。

ビジョン

2020年夏、私たちは MEVトレーダーがより良いボットを作れるようにすることを標に、ethers.jsの Rust移植版である ethers-rs を書くことから始めました。

その後、 MEV Inspect (https://github.com/flashbots/mev-inspect-rs)、 Ethers Fireblocks (https ://github.com/gakonst/ethers-fireblocks/)、 Ethers Flashbotsなどの他のインフラを構築しました。

(https:// github.com/onbjerg/ethers-flashbots/)、 Ark Circom などがあります。

opticsなども あります 。さて、私たちは、柔軟なコンパイルパイプライン( ethers-solc を構築しました 。このパイプラインは

徐々にではありますが、確実に、次の 100万 1人の Ethereum開発者や起業家のために、モジュール化さ れ、文書化された、高性能なビルディングブロックを作成しています。

Foundryの CLIの使い方の詳細は、 README をご覧ください。

まだまだ追加したい機能がたくさんあり ます

dapptoolsの機能パリティを指すため と、より新しいエキサイティングな機能を実現するための両方 )。 Githubで Foundryをチェックしてみてください。

最後に、パラダイムでは社内およびポートフォリオ全体で採用活動を行っています。すべての募集職種を確認する か、 georgios@paradigm.xyz までご連絡をお願いします 。

謝辞 Matthias Seitz氏 、 Rohit Narurkar氏 、 Nick Ward氏、 11ts氏 、 Odysseas Lamtzidis氏 、 Brock Elmore氏、 Matt Solomon氏、 その他 ethers-rs / Foundryグループ チャット の 参加者 の皆様。

Georgios Konstantopoulos (https://www. paradigm.xyz/team/gakonst/)

Georgios Konstantopoulosは、最高技術責任者( CTO)であり、パラダイムのポートフォリオ企業 やオープンソース・プロトコルの研究を担当するリサーチ・パートナーでもあります。以前は、 独立したコンサルタントおよび研究者として、[→]( https:/ www.paradigm.xyz/team/gakonst/)に 注力していました。

免責事項 :この 投稿 は 一般的な 情報提供 のみを目的と しています 。 本 記事は、投資

助言 、投資 の 売買 の推奨 または 勧誘を構成するもの で はなく 、 い かなる 投資 決定 の メリット の評価にも使用すべきではあり ません。 また、 会計 、法律、税務 に関するアドバイス や 投資の 推奨 を目的として 依拠すること はできません。 この 投稿は、 執筆者 の現在の 意見を反映した ものであり、 Paradigmや その関連会社 を代表 して作成されたもの 連する 個人 の 意見 を反映した は、更新されること なく 変更されることで はなく 、 必ずしも もではありません。

--

--

Kentaro Vadney

Loves working out, system design, making eggs, and learning new things!