はじめに

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

前提条件

Quaiでシングルチェーンスマートコントラクトをデプロイするには、いくつかのツールキットと依存関係が必要です。使用する依存関係の概要は以下の通りです:
NodeJSJavascript実行環境。LTSバージョンを使用してください。
hardhat-exampleQuai Network用のサンプルコントラクトとデプロイスクリプトを含むHardhatプロジェクト
Quais.jsQuai Networkと対話するためのJavaScriptライブラリ

環境設定

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

まず、hardhat-exampleリポジトリをクローンし、このチュートリアルで使用するSolidityディレクトリに移動して、npm経由で依存関係をインストールします。
git clone https://github.com/dominant-strategies/hardhat-example.git
cd hardhat-example/Solidity
npm install

スマートコントラクト

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ファイルにコピーします:
cp ../.env.dist ../.env
.envファイルを開き、デプロイしたいコントラクトの秘密鍵、RPC URL、トークン引数を追加します。.envファイルは次のようになります:
.env
# 各デプロイアドレス用の一意の秘密鍵
CYPRUS1_PK="0x3700000000000000000000000000000000000000000000000000000000000000" # 0x00で始まる公開鍵
CYPRUS2_PK="0x9400000000000000000000000000000000000000000000000000000000000000" # 0x01で始まる公開鍵
...その他の秘密鍵

# チェーンID(ローカル:1337、テストネットとdevnet:9000)
CHAIN_ID="9000"

# RPCエンドポイント
RPC_URL="https://rpc.quai.network"

# トークン引数
...その他のトークン引数
PK値はすべて一意のアドレスに対応し、ゾーン名に対応する必要があります。 つまり、CYPRUS1_PKはCyprus1アドレスの秘密鍵である必要があります。
RPCエンドポイントに関する詳細情報は、ローカルノードローカルネットワーク仕様セクションと、リモートノードdevnet仕様セクションで確認できます。 hardhat-exampleリポジトリは、単一のRPC URLのみを使用してネットワーク接続を設定するためにQuais SDKを使用します。SDKがネットワークプロバイダーを設定する方法の詳細については、SDKプロバイダーの例セクションをご覧ください。 秘密鍵とRPC URLを入力したら、hardhat.config.js内で安全に使用する準備が整いました。

Hardhat設定

Hardhatはhardhat.config.jsファイルを使用してスマートコントラクトのデプロイを設定します。設定ファイルでは、デプロイネットワーク、タスク、コンパイラーなどを定義できます。 hardhat-exampleには、ネットワーク内の任意のシャードでスマートコントラクトをデプロイおよび検証するための設定が含まれた事前構築済みのhardhat.config.jsファイルがあります。
コントラクトをデプロイまたは検証する際、hardhat.config.js.envファイルから秘密鍵とRPC URLを取得し、それらを使用してコントラクトをデプロイおよび検証します。solidityオブジェクトでSolidityバージョンとコンパイラー設定を指定することもできます。

デプロイと操作

1

Hardhatでコンパイル

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

Compiled 2 Solidity files successfully
2

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

scripts/ディレクトリ内には、ERC20とERC721コントラクトの両方のデプロイスクリプトがあります:deployERC20.jsdeployERC721.js。このチュートリアルでは、ERC20コントラクトをデプロイします。deployERC20.jsスクリプトは、hardhat.config.jsからネットワーク設定を、リポジトリルートの.envファイルからトークン引数を取得し、それらを使用してコントラクトをデプロイします。トークン引数はtokenArgs配列で使用されます:
const tokenArgs = [process.env.ERC20_NAME, process.env.ERC20_SYMBOL, quais.parseUnits(process.env.ERC20_INITIALSUPPLY)]
指定されたネットワーク設定とデプロイアカウントは、コンパイルされたコントラクトABIとバイトコードと組み合わせて、providerwallet変数内で使用され、新しいコントラクトインスタンスを作成します:
const provider = new quais.JsonRpcProvider(hre.network.config.url, undefined, { usePathing: true })
const wallet = new quais.Wallet(hre.network.config.accounts[0], provider)
const ERC20 = new quais.ContractFactory(ERC20Json.abi, ERC20Json.bytecode, wallet)
次のステップでコントラクトをデプロイするために、これらの概念を使用してトークン引数とネットワーク仕様を適切に変更します。
deployERC721.jsスクリプトも同様に機能しますが、異なるコントラクト引数と異なるコントラクトABIおよび バイトコードを使用します。デプロイしたい任意のコントラクトに対してこの設定を複製できます。
3

コントラクトのデプロイ

デプロイスクリプトは、デプロイしたいネットワークを指定するための--networkフラグを取ります(利用可能なオプションはこちらで確認できます)。このチュートリアルでは、cyprus1にデプロイします。
npx hardhat run scripts/deployERC20.js --network cyprus1
次のような出力が表示されます:
Transaction broadcasted: 0x235fdeb85db5b6cee8da9780e2246907e8342751849f5ce3514847a5dffd916f
Contract deployed to:  0x00735E9B2c731Fd3eCC8129a3653ACb99dF969cC
おめでとうございます!Quai NetworkにERC20トークンをデプロイしました!
ERC20.solERC721.solのサンプルコントラクトは、例示目的のための各トークンの基本的な実装です。 本番環境で使用する前に、特定のユースケースに合わせてこれらのコントラクトを変更することを強く推奨します。
4

コントラクトとの対話

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

async function getContractDetails() {
  // プロバイダー、ウォレット、コントラクトファクトリーの設定
  const provider = new quais.JsonRpcProvider(hre.network.config.url, undefined, { usePathing: true })
  const wallet = new quais.Wallet(hre.network.config.accounts[0], provider)
  const ERC20 = new quais.Contract("0x00735E9B2c731Fd3eCC8129a3653ACb99dF969cC", ERC20Json.abi, wallet)

  const tokenName = await ERC20.name()
  const tokenSymbol = await ERC20.symbol()
  const tokenDecimals = await ERC20.decimals()
  const tokenTotalSupply = await ERC20.totalSupply()
}

getContractDetails()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error)
    process.exit(1)
  })

まとめ

これで、シンプルなHardhatプロジェクトの作成、デプロイ、独自のスマートコントラクトとの対話に必要なすべてのツールが揃いました。