今まではINFURA.IO使うことが多かったけど、近代的な?Alchemyで試してみます。
HardhatでAlchemyを使う方法自体はこちらに手順が紹介されています。
デプロイするものは、この記事のソースをそのまま利用してみたいとおもいます。
前提
- macOS
- AlchemyでSignUpを済ませている。
- アプリを追加(Ethereum Goerli)してKeyやURLを生成している。
準備
.envの追加
作業フォルダに移動。.envを使うので追加インストール。
cd
cd test-hardhat
npm install dotenv
.envを作成
touch .env
.envの記述
GoerliとMAINNET両方の記述をしておきます。
- ALCHEMY_GOERLI_URLおよびALCHEMY_MAIN_URLはAlchemyで生成してもの。
- PRIVATE_KEYはMetamask等、外部Walletで生成したもの。
ALCHEMY_GOERLI_URL=https://eth-goerli.g.alchemy.com/v2/pEOf1_cKMf**********************
ALCHEMY_MAIN_URL=https://eth-mainnet.g.alchemy.com/v2/Rs5r6AEO7A2**********************
PRIVATE_KEY=4059d7ccd9006c2************************************************************
PrivateKeyを分けることもできますが、ここでは同じにしてます。
GoerliETHはFaucetサイトで入手できますが、Alchemyのアカウントおよびメインネットで0.001ETH持ってないと動かないようです。また、1日に0.05ETHの制限があるようです。
hardhat.config.jsの編集
各ネットワークへのアクセス情報をhardhat.config.jsに記述します。
localhostは明示的に記述しなくてもいいようです。
require('dotenv').config(); //all the key value pairs are being made available due to this lib
require("@nomicfoundation/hardhat-toolbox");
module.exports = {
solidity: "0.8.18",
networks: {
goerli: {
url: `${process.env.ALCHEMY_GOERLI_URL}`,
accounts: [`0x${process.env.PRIVATE_KEY}`],
},
mainnet: {
url: `${process.env.ALCHEMY_MAIN_URL}`,
accounts: [`0x${process.env.PRIVATE_KEY}`],
}
}
};
Goerli
Deploy
では、Goerliにデプロイしてみます。--networkで設定したgoeriを指定します。
npx hardhat run --network goerli scripts/deploy.js
当然ですが、deployするためにはGoerli用のETHを獲得しておく必要があります(0.004ほど消費しました)。
出力されたアドレスは動作確認で利用するのでメモしておきます。
動作確認
consoleも--networkで利用したネットワークを指定すればいいようです。
npx hardhat console --network goerli
動作確認してみます。
> const abi = [
{
"inputs": [],
"name": "greet",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "pure",
"type": "function"
}
]
undefined
> const address = "0xAAF9692beEF3BBd23488bfcf783c0706********"
undefined
> const hello = await ethers.getContractAt(abi,address)
undefined
> await hello.greet()
'Hello World'
Verify
Etherscan上等でコードやABIを確認できるようにします。
Ehterscan上でも可能ですが、hardhatで対応できるので、hardhatコマンドを利用してみます。
準備
- まず、EtherscanにSignUpし、API Keyを取得します。
- API Keyをhardhat.config.jsに登録(.envから取得)
require('dotenv').config(); //all the key value pairs are being made available due to this lib
require("@nomicfoundation/hardhat-toolbox");
// const { etherscanApiKey } = require("./etherscan_apikey.json");
module.exports = {
solidity: "0.8.18",
networks: {
goerli: {
//省略
},
mainnet: {
//省略
}
},
etherscan: {
apiKey: `${process.env.ETHERSCAN_API_KEY}`, //追加
}
};
.envにAPIKEYを追加します。
# 省略
ETHERSCAN_API_KEY=DIKFGXM6ADKP8QNMM1TPH2VH5GU3A***** #追加
実行
verifyを実行します。
npx hardhat verify --network goerli --contract contracts/Hello.sol:Hello 0xAAF9692beEF3BBd23488bfcf783c0706********(コントラクトAddress)
引数があればコントラクトアドレスに続いて入力。
MAIN NET
メインネットの場合も基本的には同じです。--networkでmainnetを指定します。
npx hardhat run --network mainnet scripts/deploy.js
出力されたアドレスは動作確認で利用するのでメモしておきます。
コンソールも同様に。
npx hardhat console --network mainnet
動作確認。
> const abi = [
{
"inputs": [],
"name": "greet",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "pure",
"type": "function"
}
]
undefined
> const address = "0xAAF9692beEF3BBd23488bfcf783c0706********"
undefined
> const hello = await ethers.getContractAt(abi,address)
undefined
> await hello.greet()
'Hello World'