教示によるスマート契約の構築とテスト


This post was originally published on Mirror


私が本当に好きであるものの1つParadigm 彼らはビルダーと開発者を助けることに非常に集中しているようで、彼らの手をコードで汚すのを恐れていませんAnish Agnihotri and Georgios Konstantopoulos web 3または多分どこでも最高のエンジニアの一部です.また、share 存在の中で最も高い品質のブロックのいくつかの膨大な量/web 3/crypto関連のコンテンツ.彼らは確かに典型的なVCの会社のように見えない.
それらrecently created オープンソースFoundry , 新しい堅実性開発環境
それが出てきたので試してみたいと思っていたので、今週はやっとチャンスがあった.
このポストでは、私はあなたに私が学んだこととそれから始める方法の速いrundownを与えたいです.

鋳造所概要
Foundryのパラダイムの記述は、鋳造工場はEthereumアプリケーション開発のための移植性のある、高速でモジュラーツールキットです.
それは同じようにスタックに収まるHardhat , Truffle , and Dapp Tools ドゥ.
鋳造所の主な相違点は以下の通りです.
1 . JavaScriptの代わりにテストを書くことができます.
それらを作るa great case Sollience対JavaScriptでテストを書くのはなぜ良いのですか?そして、彼らはほとんどの点で注目しています.
多くの少ないボイラー板と多くのより少ない精神的なオーバーヘッドがあります.一旦あなたが多少のテストを書くならば、あなたは違いを感じます.
2 .高速です.
鋳物は錆で書かれていて高速です.彼らはいくつかを文書化したbenchmarks here , しかし、それを使用するまで(特に代替を使用した後)それは正義を行うのは難しい.
鋳造工場は、2つのCLIツールから成りますforge and cast .
ForgeはEthereumの開発とテストフレームワークです.
キャストは、EVMスマート契約との対話、トランザクションを送信し、ネットワークからデータを読むことができるCLIです.

欠点
ファウンドリはハードコアのスマート契約の開発のための素晴らしい、熱心なHardhatユーザーと愛好家として、私はまた、トレードオフのいくつかを概説する必要があります.
この書き込みの時点で、私はハードスタックのフルスタックの開発者のためのように感じているので、それは様々なネットワークに切り替えると展開のためのより良いツールを提供しています.
ハードハットも頑丈ですplugin ecosystem これは、追加機能の多くのプロジェクトを拡張することができます.
最後に、hardhatはこの時点でかなり成熟しています.ただ、ファウンドリはまだ基本機能セットを構築しています.
私たちがファウンドリの概観をした今、スマート契約を構築して、テストするためにそれを使う方法を見ましょう.

ファウンドリによるスマート契約の構築とテスト

To install Foundry, you must first have Rust installed on your machine.


始めるには、インストールしますforge
cargo install --git https://github.com/gakonst/foundry --bin forge --locked
次に、空のディレクトリでは、init 新しいプロジェクトを初期化するコマンド
forge init
forge cliはlibとsrcの2つのディレクトリを作成します.
libディレクトリには、テストコントラクト(lib/ds test/src/test . sol)と、いくつかのテスト(lib/ds test/demo/demo . sol)を実装したデモテスト契約が含まれます.
srcディレクトリには、ベアボーンスマートコントラクトとテストが含まれます.
テストするための基本的なスマート契約を作成しましょう.名前を変更する契約.HelloWorldへのSOLSOLを更新し、次のように更新します.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

contract HelloWorld {
  string private greeting;
  uint public version = 0;

  constructor (string memory _greeting) {
    greeting = _greeting;
  }

  function greet() public view returns(string memory) {
    return greeting;
  }

  function updateGreeting(string memory _greeting) public {
    version += 1;
    greeting = _greeting;
  }
}
次に、ビルドを実行してABISをコンパイルできます.
forge build
これは、テストと同様にメイン契約の両方のABISを含むアウトディレクトリを作成する必要があります.
次に、テスト/契約の名前を更新しましょう.T . SOLテスト/HelloWorldT . solと次のコードを追加します.
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import "ds-test/test.sol";
import 'src/HelloWorld.sol';

contract HelloWorldTest is DSTest {
    HelloWorld hello;
    function setUp() public {
      hello = new HelloWorld("Foundry is fast!");
    }

    function test1() public {
        assertEq(
            hello.greet(),
            "Foundry is fast!"
        );
    }

    function test2() public {
        assertEq(hello.version(), 0);
        hello.updateGreeting("Hello World");
        assertEq(hello.version(), 1);
        assertEq(
            hello.greet(),
            "Hello World"
        );
    }
}
鍛冶はアサーションとガスコストのスナップショットのようないくつかの本当に素晴らしいテスト機能で組み込まれています.
我々のテストではassertEq ユーティリティ.
テストを実行するには、次のコマンドを実行します.
forge test
テストが実行されると、テストの成功だけでなくガスコストも出力されます.

また、
信頼性assertTrue十進平等assertEqDecimalより大きいassertGt , assertGe , assertLt , assertLelib/ds test/src/testでテスト契約でアサーションを表示できます.ソルこれらはすべて我々のテストで使用できる利用可能な関数です.

風水
ファウンドリーfuzzing .
これにより、関数パラメータ型を定義し、テストフレームワークが実行時にこれらの値を設定できます.
テストを失敗させる入力を見つけると、回帰テストを作成できるように戻ります.
例えば、我々は更新することができますtest2 関数引数を受け取る関数で、テストを行う際に値を使用します.
function test2(string memory _greeting) public {
    assertEq(hello.version(), 0);
    hello.updateGreeting(_greeting);
    assertEq(hello.version(), 1);
    assertEq(
        hello.greet(),
        _greeting
    );
}
今テストを実行すると、鋳造所は自動的に_greeting テストが実行されるときに変数.

結論
FoundryはWEB 3スタックへの歓迎された追加です.そして、高性能テストと発展のために改善されたツーリングとパフォーマンスをもたらしました.
私はこのプロジェクトを成熟させるのを見て興奮しています、そして、すでに開発者がすぐにそれをしようとする非自明なスマート契約を速く構築して、テストすることをお勧めします.
巨大な叫びアウトして、ファウンドリのような彼らの仕事を構築している開発者ツールのパラダイムに感謝して、それは非常に有り難いです.