Now and Nawoo

NFTの制作記録、技術メモ → C#, Solidity, Blockchain, Bitcoin, Ethereum, NFT

Hardhatの使い方メモ (2) デプロイ~Verify

Hardhatの使い方の続きです。

※ローカルネットワークについて間違えていたので記事を修正しました。

デプロイファイルの作成

scripts/deploy.js を作成します。

async function main() {
  const factory = await ethers.getContractFactory("Greeter") // コントラクト名を指定
  const contract = await factory.deploy("Hello");  // コンストラクタの引数を指定
  await contract.deployed();  // デプロイ完了まで待つ
  console.log("Deployed to:", contract.address)
}
main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });

Deploying your contracts | Hardhat

ローカルネットワークへのデプロイ、テスト、コンソール

> npx hardhat run scripts/deploy.js  # デプロイ
> npx hardhat test  # テスト実行
> npx hardhat console  # コンソール

これらは in-processモードで実行され、その都度、一時的なローカルネットワークが作られます。

--network hardhat を付けても同じです。

stand-aloneモード

Ganacheのようにローカルネットワークを立ち上げたままの状態にしたい場合は stand-aloneモードを使います。

まずローカルネットワークを起動します。

> npx hardhat node

これを起動したままで、(VSCodeなら新しくターミナルを開いて) デプロイやコンソールを使うことができます。 コマンドに --network localhost を付けます。

> npx hardhat run scripts/deploy.js --network localhost

コンソールからデプロイされたコントラクトを触るときは attach() を使います。

> npx hardhat console --network localhost
>> const factory = await ethers.getContractFactory("Greeter")
>> const contract = await factory.attach("コントラクトアドレス")
>> await contract.greet()
>> .exit

また、外部のウォレットやソフトウェアからは http://localhost:8545 へアクセスして接続することができます。 (Chain ID 31337)

Hardhat Network | Hardhat

マイニングの設定

デフォルトでは、トランザクションを受信するごとにマイニングされる自動マイニングが有効になっています。無効にしたい場合は consoleなどで次のコマンドを送信します。

await network.provider.send("evm_setAutomine", [false]);

また、一定時間ごとにマイニングを行うインターバルマイニングも可能です。 5秒おきにマイニングさせたい場合は次のようにします。

await network.provider.send("evm_setIntervalMining", [5000]);

自動マイニングとインターバルマイニングは併用が可能です。

Mining modes
Configuring Mining Modes

テストネットにデプロイ

こちらもローカルネットワークとほぼ同じです。 hardhat.config.js でネットワークを設定していれば、 コマンドに --network ネットワーク名 を追加するだけです。

> npx hardhat run scripts/deploy.js --network matic_testnet
> npx hardhat console --network matic_testnet

スクリプト

scriptsディレクトリに、デプロイ以外のスクリプトを書いておくこともできます。 NFT発行してtokenURIを呼び出して、SVGを確認する、みたいな作業はスクリプトに書いておくと便利です。

Etherscan/PolygonscanのVerify

Etherscan/Polygonscanにコードを登録(Verify)するには、まず、

  • @nomiclabs/hardhat-etherscan がインストールされている
  • secrets.jsonにetherscanApiKey / polygonscanApiKeyが設定されている
  • hardhat.config.jsにetherscan.apiKeyが設定されている

ことを確認します。

Truffle Verify Pluginとは違って、hardhat-etherscanでは EtherscanとPolygonscanのAPI KEYを自動で切り替えてくれないようです。 Etherscanを使う場合には hardhat.config.jsでEtherscanのAPI KEYを設定し、Polygonscanを使う場合には PolygonscanのAPI KEYを設定に書き換えるという作業が必要です。

  etherscan: {
    // apiKey: etherscanApiKey    // EtherscanでVerifyする場合
    apiKey: polygonscanApiKey    // PolygonscanでVerifyする場合
  }

設定できたら verifyコマンドでコード登録!

> npx hardhat verify --network matic_testnet CONTRACT_ADDRESS 

コンストラクタに引数がある場合

> npx hardhat verify --network matic_testnet CONTRACT_ADDRESS "argument" 

としますが、うまいかない場合や、引数が複雑な場合は、いったん別ファイルに保存してから渡します。

args.jsを作成

module.exports = [
  "Good morning, Hardhat!"
]

作成した args.js を--constructor-argsで指定します。

> npx hardhat verify --network matic_testnet CONTRACT_ADDRESS --constructor-args args.js

hardhat-etherscan | Hardhat

おわりに

Truffleとは少し違っていてちょっと戸惑いましたが、慣れれば使いやすそうです。