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

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

クライアント
ノード
スマートコントラクト
構成可能性
コンセンサスレイヤー
実行レイヤー
テスト
中級
Tedi Mitiku
2023年4月11日
16 分の読書

はじめに

このガイドでは、設定可能なローカルイーサリアムテストネットのインスタンス化、そこへのスマートコントラクトのデプロイ、および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のセットアップ

続行する前に、次のものがあることを確認してください。

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

ローカルイーサリアムテストネットを起動するには、次を実行します。

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

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

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

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

レビュー

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

エンクレーブ内のファイルアーティファクト (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) には、Blackjack dApp用のいくつかのシンプルなスマートコントラクトが含まれています
  • scripts/ (opens in a new tab) には、ローカルのイーサリアムネットワークにトークンコントラクトをデプロイするためのスクリプトが含まれています
  • test/ (opens in a new tab) には、Blackjack 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のデプロイ先: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487d

次に、ローカルdAppに対してsimple.jsテストを実行し、Blackjack dAppの各プレイヤーに1000がミントされていることを確認します。

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

npx hardhat test --network localnet

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

ChipToken
    mint
PLAYER ONEに1000チップがミントされるべき

  1件合格 (654ms)

レビュー

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

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

ローカルイーサリアムテストネットの設定

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

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

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

デフォルトの設定ファイルを取得し、それを編集して、異なるEL/CLペアを持つ2つのノードを起動します。

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

この構成により、dAppをテストするためのイーサリアムノード実装の異種ネットワークが作成されます。 設定ファイルは次のようになります。

participants構造体はネットワーク内のノードにマッピングされるため、3つのparticipants構造体はKurtosisにネットワーク内で3つのノードを起動するように指示します。 各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 clean -aコマンドを使用して、新しいテストネットを開始する前に古いテストネットとその内容を破棄するようにKurtosisに指示します。

再び、Kurtosisは少しの間動作し、実行されている個々のステップを出力します。 最終的に、出力は次のようになります。

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

結論

完成です! この短いガイドを要約すると、次のことを行いました。

  • 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)にあるその他の例を確認することをお勧めします。そこには、次のようなパッケージを含む素晴らしい例があります。

ページの最終更新: 2026年3月3日

このチュートリアルは役に立ちましたか?