🌟
HardHatでHello, World
HardHat とは、
- ローカルでEthereumノードを立てる
- Solidityのコンパイル
- Solidityのテスト実行
- コントラクトのデプロイ、実行
などなど、色々簡単にできるEthereumの開発環境です。
今回は以下のように、npx hardhat
で初期プロジェクトを作成したところから始めて、
コントラクトをローカルのネットワークにデプロイ、実行してコンソールにHello, World
を出力するところまでやります。
hide@hidenoMacBook-Pro hardhat_hello-world % npx hardhat
888 888 888 888 888
888 888 888 888 888
888 888 888 888 888
8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888
888 888 "88b 888P" d88" 888 888 "88b "88b 888
888 888 .d888888 888 888 888 888 888 .d888888 888
888 888 888 888 888 Y88b 888 888 888 888 888 Y88b.
888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888
👷 Welcome to Hardhat v2.12.3 👷
✔ What do you want to do? · Create a TypeScript project
✔ Hardhat project root: · /Users/hide/hid3h/geth-sandbox/hardhat_hello-world
✔ Do you want to add a .gitignore? (Y/n) · y
✔ Do you want to install this sample project's dependencies with npm (hardhat @nomicfoundation/hardhat-toolbox)? (Y/n) · y
npm install --save-dev hardhat@^2.12.3 @nomicfoundation/hardhat-toolbox@^2.0.0
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated request-promise-native@1.0.9: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated fsevents@2.1.3: "Please update to latest v2.3 or v2.2"
npm WARN deprecated debug@3.2.6: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
npm WARN deprecated uuid@2.0.1: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated fsevents@2.1.3: "Please update to latest v2.3 or v2.2"
npm WARN deprecated debug@3.2.6: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
added 693 packages, and audited 694 packages in 24s
113 packages are looking for funding
run `npm fund` for details
6 high severity vulnerabilities
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.
✨ Project created ✨
See the README.md file for some example tasks you can run
Give Hardhat a star on Github if you're enjoying it! 💞✨
https://github.com/NomicFoundation/hardhat
hide@hidenoMacBook-Pro hardhat_hello-world %
Contract作成
contracts/Hello.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;
contract Hello {
function greet() public pure returns (string memory) {
return "Hello, World";
}
}
修飾子などの説明。
- public
- 外部(チェーン外)からも内部からも呼べる関数であることを示す
- https://docs.soliditylang.org/en/v0.8.17/cheatsheet.html?highlight=public#function-visibility-specifiers
- pure
- 関数が状態変数の変更も参照もしない関数であることを示す
- https://docs.soliditylang.org/en/v0.8.17/cheatsheet.html?highlight=public#modifiers
- memory
- コントラクトの実行時のみ保持される一時的な変数に付与する必要がある
ノードを立てる
yarn hardhat
でコマンドが使えるようにpackage.json
にscriptsを追加。
package.json
{
"name": "hardhat-project",
"scripts": {
"hardhat": "hardhat"
},
"devDependencies": {
"@nomicfoundation/hardhat-toolbox": "^2.0.0",
"hardhat": "^2.12.3"
}
}
yarn hardhat node
でノードを起動。
hide@hidenoMacBook-Pro hardhat_hello-world % yarn hardhat node
yarn run v1.22.19
warning package.json: No license field
$ hardhat node
Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/
Accounts
========
WARNING: These accounts, and their private keys, are publicly known.
Any funds sent to them on Mainnet or any other live network WILL BE LOST.
Account #0: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 (10000 ETH)
Private Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
Account #1: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (10000 ETH)
Private Key: 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
Account #2: 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC (10000 ETH)
Private Key: 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a
Account #3: 0x90F79bf6EB2c4f870365E785982E1f101E93b906 (10000 ETH)
Private Key: 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6
Account #4: 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 (10000 ETH)
Private Key: 0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a
Account #5: 0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc (10000 ETH)
Private Key: 0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
Account #6: 0x976EA74026E726554dB657fA54763abd0C3a0aa9 (10000 ETH)
Private Key: 0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e
Account #7: 0x14dC79964da2C08b23698B3D3cc7Ca32193d9955 (10000 ETH)
Private Key: 0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356
Account #8: 0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f (10000 ETH)
Private Key: 0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97
Account #9: 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 (10000 ETH)
Private Key: 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6
Account #10: 0xBcd4042DE499D14e55001CcbB24a551F3b954096 (10000 ETH)
Private Key: 0xf214f2b2cd398c806f84e317254e0f0b801d0643303237d97a22a48e01628897
Account #11: 0x71bE63f3384f5fb98995898A86B02Fb2426c5788 (10000 ETH)
Private Key: 0x701b615bbdfb9de65240bc28bd21bbc0d996645a3dd57e7b12bc2bdf6f192c82
Account #12: 0xFABB0ac9d68B0B445fB7357272Ff202C5651694a (10000 ETH)
Private Key: 0xa267530f49f8280200edf313ee7af6b827f2a8bce2897751d06a843f644967b1
Account #13: 0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec (10000 ETH)
Private Key: 0x47c99abed3324a2707c28affff1267e45918ec8c3f20b8aa892e8b065d2942dd
Account #14: 0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097 (10000 ETH)
Private Key: 0xc526ee95bf44d8fc405a158bb884d9d1238d99f0612e9f33d006bb0789009aaa
Account #15: 0xcd3B766CCDd6AE721141F452C550Ca635964ce71 (10000 ETH)
Private Key: 0x8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61
Account #16: 0x2546BcD3c84621e976D8185a91A922aE77ECEc30 (10000 ETH)
Private Key: 0xea6c44ac03bff858b476bba40716402b03e41b8e97e276d1baec7c37d42484a0
Account #17: 0xbDA5747bFD65F08deb54cb465eB87D40e51B197E (10000 ETH)
Private Key: 0x689af8efa8c651a91ad287602527f3af2fe9f6501a7ac4b061667b5a93e037fd
Account #18: 0xdD2FD4581271e230360230F9337D5c0430Bf44C0 (10000 ETH)
Private Key: 0xde9be858da4a475276426320d5e9262ecfc3ba460bfac56360bfa6c4c28b4ee0
Account #19: 0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199 (10000 ETH)
Private Key: 0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e
WARNING: These accounts, and their private keys, are publicly known.
Any funds sent to them on Mainnet or any other live network WILL BE LOST.
デフォルトでアカウントが20個作成されます。
デプロイ
デフォルトだとscripts/deploy.ts
がLock.sol
用になっているので変更します。
scripts/deploy.ts
import { ethers } from "hardhat";
async function main() {
const Hello = await ethers.getContractFactory("Hello");
const hello = await Hello.deploy();
await hello.deployed();
console.log(`deployed to ${hello.address}`);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
nodeを起動したのとは別のターミナルでデプロイスクリプトを実行します。
hide@hidenoMacBook-Pro hardhat_hello-world % yarn hardhat run --network localhost scripts/deploy.ts
yarn run v1.22.19
warning package.json: No license field
$ hardhat run --network localhost scripts/deploy.ts
Compiled 2 Solidity files successfully
deployed to 0x5FbDB2315678afecb367f032d93F642f64180aa3
✨ Done in 1.59s.
hide@hidenoMacBook-Pro hardhat_hello-world %
deployed to 0x5FbDB2315678afecb367f032d93F642f64180aa3
のアドレスは実行時に使います。
デプロイ時、nodeを実行してるターミナルの方では以下のようにデプロイ時の情報が出力されています。
eth_sendTransaction
Contract deployment: Hello
Contract address: 0x5fbdb2315678afecb367f032d93f642f64180aa3
Transaction: 0x5aa921a868116b6d12aa2c7d8fee2067d31264385191576fc92ee2f9e8295837
From: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266
Value: 0 ETH
Gas used: 133135 of 133135
Block #1: 0x1dbc2d0b5932b3ea5a28bb2b7d57ca86626f634b49d4118917111e006f2a4664
実行
今回はコンソールで実行してみます。
コンソールを起動します。
hide@hidenoMacBook-Pro hardhat_hello-world % yarn hardhat console --network localhost
yarn run v1.22.19
warning package.json: No license field
$ hardhat console
Welcome to Node.js v16.18.0.
Type ".help" for more information.
>
実行には、abiとコントラクトアドレスの2つが必要になります。
- abi
-
/artifacts/contracts/Hello.sol/Hello.json
というファイルがデプロイ時に生成されているのでその中のabi
という配列
-
- コントラクトアドレス
- デプロイスクリプト実行時に出力された
deployed to 0x5FbDB2315678afecb367f032d93F642f64180aa3
の0x5FbDB2315678afecb367f032d93F642f64180aa3
の部分
- デプロイスクリプト実行時に出力された
> const abi = [{"inputs":[],"name":"greet","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
undefined
> const address = "0x5FbDB2315678afecb367f032d93F642f64180aa3"
undefined
> const hello = await ethers.getContractAt(abi, address)
undefined
> await hello.greet()
'Hello, World'
無事Hello, World
が出力されました。
Discussion