Skip to main content

はじめに

この記事では、HardhatとSolidityを使用してQuai Networkのチェーンにスマートコントラクトをデプロイする方法を説明します。

前提条件

Quaiでシングルチェーンスマートコントラクトをデプロイするには、いくつかのツールキットと依存関係が必要です。使用する依存関係の概要は以下の通りです:

環境設定

サンプルリポジトリのインストール

まず、hardhat-exampleリポジトリをクローンし、このチュートリアルで使用するSolidityディレクトリに移動して、npm経由で依存関係をインストールします。

スマートコントラクト

Solidity/ディレクトリには、contracts/ディレクトリ内に2つのサンプルコントラクトが含まれています:ERC20.solERC721.sol。両方のコントラクトはOpen Zeppelinライブラリから派生した実装です。 このチュートリアルではERC20.solサンプルコントラクトを使用しますが、独自のコントラクトを追加したり、他のライブラリのコントラクトを使用することもできます。
Quai Network EVMはSolidityバージョン0.8.20までをサポートしています。 より新しいバージョンのSolidityを使用すると、スマートコントラクトのデプロイ時にエラーが発生する可能性があります。

環境変数

hardhat-exampleリポジトリのルートには、トークンの詳細、秘密鍵、RPC URLを安全に管理するためのサンプル環境ファイル.env.distが含まれています。
.env.distファイルはテンプレートファイルであり、そのまま使用すべきではありません。.env.distファイルを新しい.envファイルにコピーする必要があります。このファイルはhardhat-exampleリポジトリのルートにあり、Solidity/ディレクトリの設定ファイルとして機能します。
次のコマンドを使用して、ルートの.env.distファイルをリポジトリルートの新しい.envファイルにコピーします:
.envファイルを開き、デプロイしたいコントラクトの秘密鍵、RPC URL、トークン引数を追加します。.envファイルは次のようになります:
.env
サンプルの.env.distOrchardテストネットを対象としているため、実際のQUAIを消費せずにデプロイできます。 メインネットにデプロイするには、CHAIN_ID9に、RPC_URLhttps://rpc.quai.networkに変更してください。
RPCエンドポイントに関する詳細情報は、ネットワークページで確認できます。 hardhat-exampleリポジトリは、単一のRPC URLのみを使用してネットワーク接続を設定するためにQuais SDKを使用します。SDKがネットワークプロバイダーを設定する方法の詳細については、SDKプロバイダーの例セクションをご覧ください。 秘密鍵とRPC URLを入力したら、hardhat.config.js内で安全に使用する準備が整いました。

Hardhat設定

Hardhatはhardhat.config.jsファイルを使用してスマートコントラクトのデプロイを設定します。設定ファイルでは、デプロイネットワーク、タスク、コンパイラーなどを定義できます。 hardhat-exampleには、Cyprus-1でスマートコントラクトをデプロイおよび検証するための設定が含まれた事前構築済みのhardhat.config.jsファイルがあります。
この設定ファイルのサンプルはhardhat-exampleリポジトリの一部として提供されています。
hardhat.config.js
Cyprus-1は現在Quai Networkで唯一アクティブなゾーンであるため、サンプル設定では単一の cyprus1ネットワークのみを定義しています。ゾーンエンドポイントの完全なリストについては、 ネットワークを参照してください。
metadata.bytecodeHash: 'ipfs'useLiteralContent: trueコンパイラー設定は、 @quai/hardhat-deploy-metadataが検証可能な出力を生成するために必要です。これらを削除すると、 Quaiscanでの検証が機能しなくなります。
コントラクトをデプロイする際、hardhat.config.js.envファイルから秘密鍵とRPC URLを取得します。solidityオブジェクトでSolidityバージョンとコンパイラー設定を指定することもできます。

デプロイと操作

1

Hardhatでコンパイル

Hardhatでのスマートコントラクトのコンパイルはシンプルで、CLIでnpxを使用して実行できます。contracts/ディレクトリ内のすべてのコントラクトを以下でコンパイルします:
次のような出力が表示されます:
2

デプロイスクリプトの設定

scripts/ディレクトリ内には、ERC20とERC721コントラクトの両方のデプロイスクリプトがあります:deployERC20.jsdeployERC721.js。このチュートリアルでは、ERC20コントラクトをデプロイします。deployERC20.jsスクリプトは、hardhat.config.jsからネットワーク設定を、リポジトリルートの.envファイルからトークン引数を取得し、それらを使用してコントラクトをデプロイします。トークン引数はtokenArgs配列で使用されます:
コントラクトがデプロイされる前に、スクリプトは@quai/hardhat-deploy-metadataプラグインを使用してコンパイル済みコントラクトのメタデータをIPFSにプッシュし、生成されたCIDを返します:
その後、CIDはContractFactoryの4番目の引数として渡され、デプロイされたバイトコードに埋め込まれます。Quaiscanは後でそのCIDを読み取り、検証のためにソースコードを取得します — これがないと、コントラクトはデプロイできても検証はできません。
次のステップでコントラクトをデプロイするために、これらの概念を使用してトークン引数とネットワーク仕様を適切に変更します。
deployERC721.jsスクリプトも同じ構造に従いますが、異なるコントラクト引数と 異なるABI/バイトコードを使用します。デプロイしたい任意のコントラクトに対して この設定を複製できます。
3

コントラクトのデプロイ

デプロイスクリプトは、デプロイしたいネットワークを指定するための--networkフラグを取ります。サンプル設定ではcyprus1のみが定義されており、ここではそれを使用します。
次のような出力が表示されます:
最初の行に出力されるCIDは、Quaiscanでコントラクトを検証するために必要なIPFSハッシュです — 保存してください。おめでとうございます!Quai NetworkにERC20トークンをデプロイしました!
ERC20.solERC721.solのサンプルコントラクトは、例示目的のための各トークンの基本的な実装です。 本番環境で使用する前に、特定のユースケースに合わせてこれらのコントラクトを変更することを強く推奨します。
4

コントラクトとの対話

Hardhatコンソールは現在、Quai Network上のスマートコントラクトとの対話をサポートしていません。コントラクトと対話するには、Quais SDKを使用してシンプルなスクリプトを設定できます。以下のスクリプトは、0x00735E9B2c731Fd3eCC8129a3653ACb99dF969cCにデプロイしたERC20トークンのContractインスタンスを設定し、トークンの名前、シンボル、総供給量を取得します。
getContractDetails.js

まとめ

これで、シンプルなHardhatプロジェクトの作成、デプロイ、独自のスマートコントラクトとの対話に必要なすべてのツールが揃いました。 デプロイスクリプトがコントラクトのメタデータをIPFSにプッシュしたので、Quaiscanで検証できます — 次のステップについてはQuaiscanでのコントラクト検証を参照してください。