NEROChainコミュニティに参加して、今後の情報をお待ちください!

NEROチェーン上でのスマートコントラクトのデプロイと検証

このチュートリアルでは、Hardhatを使用してNEROモジュラーチェーンテストネット上にシンプルなスマートコントラクトを作成、コンパイル、デプロイ、検証する方法を説明します。

前提条件

  • Node.jsがインストール済み
  • テストネットNEROトークンを持つ秘密鍵 (このフォーセットからテストネットのNEROトークンを取得できます)
  • SolidityとHardhatに関する基本的な理解

プロジェクトのセットアップ

まず、新しいディレクトリを作成しプロジェクトを初期化します:

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();
 
module.exports = {
  defaultNetwork: "nero",
  networks: {
    nero: {
      url: "https://rpc-testnet.nerochain.io",
      chainId: 689,
      accounts: [process.env.PRIVATE_KEY]
    },
  },
  solidity: "0.8.17",
  etherscan: {
    apiKey: "dummy", 
    customChains: [
      {
        network: "nero",
        chainId: 689,
        urls: {
          apiURL: "https://api-testnet.neroscan.io/api",
          browserURL: "https://testnet.neroscan.io/"
        }
      }
    ]
  }
};

プロンプトが表示されたら、プロジェクトに適したオプションを選択します:

図1

図1: npx hardhat

スマートコントラクトの作成

contractsディレクトリを作成(まだ作成されていない場合)し、スマートコントラクトファイルを追加します:

mkdir -p contracts

独自のスマートコントラクトを作成するか、Openzeppelinトークンスマートコントラクトなどのテンプレートを使用できます。

以下は使用可能なシンプルなサンプルコントラクトです:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
 
contract HelloWorld {
    string private greeting = "Hello, NERO Chain!";
 
    function setGreeting(string calldata _greet) public {
        greeting = _greet;
    }
 
    function getGreeting() public view returns (string memory) {
        return greeting;
    }
}

NEROチェーン用のHardhat設定

プロジェクトのルートに.envファイルを作成し、以下の変数を設定します:

NERO_TESTNET_PROVIDER_URL=https://rpc-testnet.nerochain.io
PRIVATE_KEY=あなたの秘密鍵をここに入力
API_KEY=dummy

次に、Hardhat設定ファイルを更新します:

require("@nomicfoundation/hardhat-toolbox");
require("@nomicfoundation/hardhat-ignition-ethers");
require("dotenv").config();
const { vars } = require("hardhat/config");
 
const NERO_TESTNET_PROVIDER_URL = process.env.NERO_TESTNET_PROVIDER_URL || vars.get("NERO_TESTNET_PROVIDER_URL");
const PRIVATE_KEY = process.env.PRIVATE_KEY || vars.get("PRIVATE_KEY");
const API_KEY = process.env.API_KEY || vars.get("API_KEY");
 
module.exports = {
  solidity: "0.8.24",
  defaultNetwork: "nero_testnet",
  networks: {
    nero_testnet: {
      url: NERO_TESTNET_PROVIDER_URL,
      accounts: [PRIVATE_KEY],
      chainId: 689
    },
  },
  etherscan: {
    apiKey: API_KEY,
    customChains: [
      {
        network: "nero_testnet",
        chainId: 689,
        urls: {
          apiURL: "https://api-testnet.neroscan.io/api",
          browserURL: "https://testnet.neroscan.io",
        },
      },
    ],
    enabled: true
  },
};

スマートコントラクトのデプロイ

コントラクトのデプロイには、デプロイメントスクリプトまたはHardhat Ignitionを使用できます。

オプション1: デプロイメントスクリプトを使用

scriptsディレクトリを作成し、デプロイメントスクリプトを追加します:

mkdir -p scripts

scripts/deploy.jsファイルを作成して以下の内容を入力します:

async function main() {
    const HelloWorld = await ethers.getContractFactory("HelloWorld");
    const contract = await HelloWorld.deploy();
    await contract.waitForDeployment();
    console.log("HelloWorld deployed to:", await contract.getAddress());
}
 
main().catch((error) => {
    console.error(error);
    process.exitCode = 1;
});

次のコマンドでデプロイします:

npx hardhat run scripts/deploy.js --network nero_testnet

オプション2: Hardhat Ignitionを使用

より複雑なデプロイメントには、Hardhat Ignitionを使用できます:

  1. ignitionモジュールディレクトリを作成します:
mkdir -p ignition/modules
  1. デプロイメントモジュールファイル(例:ignition/modules/deploy-hello-world.js)を作成します:
const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules");
 
module.exports = buildModule("HelloWorldModule", (m) => {
  const helloWorld = m.contract("HelloWorld");
  return { helloWorld };
});
  1. Ignitionでデプロイします:
npx hardhat ignition deploy ./ignition/modules/deploy-hello-world.js --network nero_testnet
  1. 出力からデプロイされたコントラクトアドレスを保存します。

スマートコントラクトの検証

コントラクトをデプロイした後、NEROチェーンエクスプローラー上でソースコードを公開するために検証します:

npx hardhat verify --network nero_testnet デプロイされたコントラクトアドレス

「デプロイされたコントラクトアドレス」は実際のデプロイされたコントラクトアドレスに置き換えてください。

検証のトラブルシューティング

  1. 検証に失敗する場合は、Solidityコンパイラのバージョンが完全に一致していることを確認します
  2. コントラクトがフラット化されたファイルに含まれていないライブラリや依存関係を使用していないか確認します
  3. コンストラクタ引数を使用している場合は、検証コマンドで正しく提供されていることを確認します:
    npx hardhat verify --network nero_testnet デプロイされたコントラクトアドレス "コンストラクタ引数1" "コンストラクタ引数2"

結論

デプロイと検証が完了したら、テストネットエクスプローラーでコントラクトを確認できます。

図2

図2: NEROテストネットスキャン

おめでとうございます!スマートコントラクトのデプロイと検証に成功しました。このチュートリアルではテストネットを使用しましたが、RPCエンドポイントとネットワーク設定を更新することで、メインネットでも同じプロセスを使用できます。