メインコンテンツへスキップ

ローカルのマルチクライアント・テストネットでdappを開発およびテストする方法

クライアント
ノード
スマート・コントラクト
コンポーザビリティ
コンセンサス・レイヤー
実行レイヤー
テスト
中級
テディ・ミティク
2023年4月11日
17 分で読めます

はじめに

このガイドでは、構成可能なローカルのイーサリアムテストネットをインスタンス化し、そこにスマート・コントラクトをデプロイして、テストネットを使用して分散型アプリケーション (dapp) のテストを実行するプロセスを説明します。このガイドは、ライブのテストネットやメインネットにデプロイする前に、さまざまなネットワーク構成に対してローカルでdappを開発およびテストしたいdapp開発者を対象としています。

このガイドでは、以下のことを行います。

  • Kurtosis (opens in a new tab)を使用して、eth-network-package (opens in a new tab)でローカルのイーサリアムテストネットをインスタンス化する。
  • Hardhatのdapp開発環境をローカルのテストネットに接続し、dappをコンパイル、デプロイ、およびテストする。
  • ノード数や特定のEL/CLクライアントのペアリングなどのパラメーターを含め、ローカルのテストネットを構成し、さまざまなネットワーク構成に対する開発およびテストのワークフローを可能にする。

Kurtosisとは?

Kurtosis (opens in a new tab)は、マルチコンテナのテスト環境を構成するために設計されたコンポーザブルなビルドシステムです。特に、ブロックチェーンのテストネットなど、動的なセットアップロジックを必要とする再現可能な環境を開発者が作成できるようにします。

このガイドでは、Kurtosisのeth-network-packageを使用して、geth (opens in a new tab)実行レイヤー (EL) クライアント、およびteku (opens in a new tab)lighthouse (opens in a new tab)lodestar (opens in a new tab)コンセンサス・レイヤー (CL) クライアントをサポートするローカルのイーサリアムテストネットを立ち上げます。このパッケージは、Hardhat Network、Ganache、Anvilなどのフレームワークにおけるネットワークの、構成可能でコンポーザブルな代替手段として機能します。Kurtosisは、使用するテストネットに対するより優れた制御と柔軟性を開発者に提供します。これが、イーサリアム財団がマージのテストにKurtosisを使用し (opens in a new tab)、ネットワークアップグレードのテストに引き続き使用している主な理由です。

Kurtosisのセットアップ

先に進む前に、以下の準備ができていることを確認してください。

ローカルのイーサリアムテストネットのインスタンス化

ローカルのイーサリアムテストネットを立ち上げるには、以下を実行します。

kurtosis --enclave local-eth-testnet run github.com/kurtosis-tech/eth-network-package

注: このコマンドは、--enclaveフラグを使用してネットワークに「local-eth-testnet」という名前を付けます。

Kurtosisは、命令を解釈、検証、実行する際に、内部で実行している手順を出力します。最後に、以下のような出力が表示されるはずです。

おめでとうございます!Kurtosisを使用して、Docker上でCL (lighthouse) およびELクライアント (geth) を備えたローカルのイーサリアムテストネットをインスタンス化しました。

レビュー

このセクションでは、GitHub上でリモートホストされているeth-network-package (opens in a new tab)を使用して、Kurtosisのエンクレーブ (Enclave) (opens in a new tab)内にローカルのイーサリアムテストネットを立ち上げるようKurtosisに指示するコマンドを実行しました。エンクレーブ内には、「ファイルアーティファクト (file artifacts)」と「ユーザーサービス (user services)」の両方があります。

エンクレーブ内のファイルアーティファクト (opens in a new tab)には、ELおよびCLクライアントをブートストラップするために生成および利用されるすべてのデータが含まれています。このデータは、このDockerイメージ (opens in a new tab)から構築されたprelaunch-data-generatorサービスを使用して作成されました。

ユーザーサービスには、エンクレーブ内で動作しているすべてのコンテナ化されたサービスが表示されます。ELクライアントとCLクライアントの両方を備えた単一のノードが作成されていることがわかります。

dapp開発環境をローカルのイーサリアムテストネットに接続する

dapp開発環境のセットアップ

ローカルのテストネットが稼働したので、dapp開発環境を接続してローカルのテストネットを使用できるようになりました。このガイドでは、Hardhatフレームワークを使用して、ブラックジャックのdappをローカルのテストネットにデプロイします。

dapp開発環境をセットアップするには、サンプルdappが含まれるリポジトリをクローンし、その依存関係をインストールします。以下を実行してください。

git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-kurtosis/smart-contract-example && yarn

ここで使用するsmart-contract-example (opens in a new tab)フォルダーには、Hardhat (opens in a new tab)フレームワークを使用するdapp開発者向けの一般的なセットアップが含まれています。

  • contracts/ (opens in a new tab)には、ブラックジャックdapp用のいくつかのシンプルなスマート・コントラクトが含まれています。
  • scripts/ (opens in a new tab)には、トークンコントラクトをローカルのイーサリアムネットワークにデプロイするためのスクリプトが含まれています。
  • test/ (opens in a new tab)には、ブラックジャックdappの各プレイヤーに1000トークンがミントされていることを確認するための、トークンコントラクト用のシンプルな.jsテストが含まれています。
  • hardhat.config.ts (opens in a new tab)は、Hardhatのセットアップを構成します。

ローカルのテストネットを使用するようにHardhatを構成する

dapp開発環境のセットアップが完了したら、次にHardhatを接続して、Kurtosisを使用して生成されたローカルのイーサリアムテストネットを使用するようにします。これを実現するには、hardhat.config.ts構成ファイル内のlocalnet構造体にある<$YOUR_PORT>を、任意のel-client-<num>サービスから出力されたRPC URIのポートに置き換えます。このサンプルの場合、ポートは64248になります。あなたのポートは異なる場合があります。

hardhat.config.tsの例:

ファイルを保存すると、Hardhatのdapp開発環境がローカルのイーサリアムテストネットに接続されます!以下を実行することで、テストネットが機能していることを確認できます。

npx hardhat balances --network localnet

出力は以下のようになります。

0x878705ba3f8Bc32FCf7F4CAa1A35E72AF65CF766 has balance 10000000000000000000000000
0x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 10000000000000000000000000
0xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 10000000000000000000000000
0x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 10000000000000000000000000
0x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 10000000000000000000000000
0x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000

これにより、Hardhatがローカルのテストネットを使用しており、eth-network-packageによって作成された事前資金提供済みのアカウントを検出していることが確認できます。

ローカルでのdappのデプロイとテスト

dapp開発環境がローカルのイーサリアムテストネットに完全に接続されたので、ローカルのテストネットを使用してdappに対する開発およびテストのワークフローを実行できるようになりました。

ローカルでのプロトタイピングと開発のためにChipToken.solスマート・コントラクトをコンパイルしてデプロイするには、以下を実行します。

npx hardhat compile
npx hardhat run scripts/deploy.ts --network localnet

出力は以下のようになります。

ChipToken deployed to: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487d

次に、ローカルのdappに対してsimple.jsテストを実行し、ブラックジャックdappの各プレイヤーに1000トークンがミントされていることを確認してみましょう。

出力は以下のようになります。

npx hardhat test --network localnet

出力は以下のようになります。

ChipToken
    mint
      ✔ should mint 1000 chips for PLAYER ONE

  1 passing (654ms)

レビュー

この時点で、dapp開発環境をセットアップし、Kurtosisによって作成されたローカルのイーサリアムネットワークに接続し、dappをコンパイル、デプロイして、簡単なテストを実行しました。

次に、さまざまなネットワーク構成でdappをテストするために、基盤となるネットワークを構成する方法を見ていきましょう。

ローカルのイーサリアムテストネットの構成

クライアント構成とノード数の変更

ローカルのイーサリアムテストネットは、開発またはテストしたいシナリオや特定のネットワーク構成に応じて、異なるELおよびCLクライアントのペアや、さまざまな数のノードを使用するように構成できます。つまり、一度セットアップすれば、カスタマイズされたローカルのテストネットを立ち上げ、それを使用してさまざまなネットワーク構成で同じワークフロー (デプロイ、テストなど) を実行し、すべてが期待どおりに機能することを確認できます。変更可能なその他のパラメーターについて詳しくは、こちらのリンクをご覧ください。

試してみましょう!JSONファイルを介して、eth-network-packageにさまざまな構成オプションを渡すことができます。このネットワークパラメーターのJSONファイルは、Kurtosisがローカルのイーサリアムネットワークをセットアップするために使用する特定の構成を提供します。

デフォルトの構成ファイルを取得し、異なるEL/CLペアを持つ2つのノードを立ち上げるように編集します。

  • geth/lighthouseのノード1
  • geth/lodestarのノード2
  • geth/tekuのノード3

この構成により、dappをテストするためのイーサリアムノード実装のヘテロジニアス (異種混合) ネットワークが作成されます。構成ファイルは以下のようになります。

participants構造体はネットワーク内のノードにマッピングされるため、3つのparticipants構造体は、ネットワーク内に3つのノードを立ち上げるようKurtosisに指示します。各participants構造体により、その特定のノードに使用されるELおよびCLペアを指定できます。

network_params構造体は、各ノードのジェネシスファイルを作成するために使用されるネットワーク設定や、ネットワークのスロットあたりの秒数などのその他の設定を構成します。

編集したパラメーターファイルを任意のディレクトリ (以下の例ではデスクトップに保存されています) に保存し、それを使用して以下を実行することでKurtosisパッケージを実行します。

kurtosis clean -a && kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package "$(cat ~/eth-network-params.json)"

注: ここでは、新しいテストネットを起動する前に、古いテストネットとそのコンテンツを破棄するようKurtosisに指示するために、kurtosis clean -aコマンドが使用されています。

ここでも、Kurtosisはしばらく動作し、実行されている個々の手順を出力します。最終的に、出力は以下のようになります。

おめでとうございます!ローカルのテストネットを1つではなく3つのノードを持つように正常に構成しました。dappに対して以前と同じワークフロー (デプロイとテスト) を実行するには、hardhat.config.ts構成ファイル内のlocalnet構造体にある<$YOUR_PORT>を、新しい3ノードのローカルテストネット内の任意のel-client-<num>サービスから出力されたRPC URIのポートに置き換えて、以前と同じ操作を実行します。

おわりに

以上です!この短いガイドをまとめると、以下のことを行いました。

  • Kurtosisを使用して、Docker上にローカルのイーサリアムテストネットを作成した
  • ローカルのdapp開発環境をローカルのイーサリアムネットワークに接続した
  • ローカルのイーサリアムネットワーク上でdappをデプロイし、簡単なテストを実行した
  • 基盤となるイーサリアムネットワークが3つのノードを持つように構成した

何がうまくいったか、何を改善できるかについてのご意見や、ご質問への回答など、皆様からのご連絡をお待ちしております。GitHub (opens in a new tab)またはメール (opens email client)でお気軽にお問い合わせください!

その他の例とガイド

クイックスタート (opens in a new tab) (Postgresデータベースとその上にAPIを構築します) や、awesome-kurtosisリポジトリ (opens in a new tab)にあるその他の例をぜひチェックしてみてください。そこには、以下のようなパッケージを含む素晴らしい例がいくつかあります。