lesson-2_スマートコントラクトを実行してみ よう
👶 スマートコントラクトを作成してみよう
前回、あらかじめ設定されていたテストのコントラクトを実行できました。
ではいよいよ自分でコントラクトを作成していきましょう。
packages/contract/contracts
ディレクトリの下にDomains.sol
という名前のファイルを作成してください。
Hardhatを使用する場合、ファイル構造は非常に重要ですので、注意する必要があります。ファイル構造が下記のようになっていれば大丈夫です 😊
packages
└── contract
└── contracts
└── Domains.sol
次に、コードエディタでプロジェクトのコードを開きます。
ここでは、VS Codeの使用をお勧めします。ダウンロードは こちら から。
VS Codeをターミナルから起動する方法は こちら をご覧ください。
- ターミナル上で、
code .
コマンドを実行
今後VS Codeを起動するのが一段と楽になるので、ぜひ導入してみてください。
コーディングのサポートツールとして、VS Code上でSolidityの拡張機能をダウンロードすることをお勧めします。
ダウンロードは こちら から。
それでは、これからDomains.sol
の中身の作成していきます。
Domains.sol
をVS Codeで開き、下記を入力します。
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;
import "hardhat/console.sol";
contract Domains {
constructor() {
console.log("THIS IS MY DOMAINS CONTRACT. NICE.");
}
}
コードを詳しくみていきましょう。
// SPDX-License-Identifier: UNLICENSED
これは「SPDXライセンス識別子」と呼ばれ、ソフトウェア・ライセンスの種類が一目でわかるようにするための識別子です。
詳細については、こちら を参照してみてください。
pragma solidity ^0.8.17;
これは、コントラクトで使用するSolidityコンパイラのバージョンです。
上記のコードでは、このコントラクトを実行するときはSolidityコンパイラのバージョン0.8.17
のみを使用しそれ以下のものは使用しません、という宣言をしています。
コンパイラのバージョンがhardhat.config.js
で同じであることを確認してください。
もし記載されているSolidityのバージョンが0.8.17
でなかった場合は、Domains.sol
の中身をhardhat.config.js
に記載されているバージョンに変更しましょう。
import "hardhat/console.sol";
コントラクトを実行する際、コンソールログをターミナルに出力するためにHardhatのconsole.sol
のファイルをインポートしています。
これは、今後スマートコントラクトのデバッグが発生した場合に、とても役立つツールです。
contract Domains{
constructor() {
console.log("THIS IS MY DOMAIN CONTRACT. NICE.");
}
}
contract
は、ほかの言語でいうところの「class」のようなものなのです。
このcontract
を初期化すると、constructor
が実行されてconsole.log
の中身がターミナル上に表示されます。
classの概念については、こちら を参照してください。
🔩 constructor とは
constructor
はオプションの関数で、contract
の状態変数を初期化するために使用されます。
これから詳しく説明していくので、constructor
に関しては、まず以下の特徴を理解してください。
contract
は1つのconstructor
しか持つことができません。constructor
は、スマートコントラクトの作成時に一度だけ実行され、contract
の状態を初期化するために使用されます。constructor
が実行された後、コードがブロックチェーンにデプロイされます。
😲 コントラクトを実行しましょう
さぁ、スマートコントラクトを作成しました。
しかし、まだそれが機能するかどうかはわかりません。
実際に実行してみましょう。次のような手順となります。
Domains.sol
をコンパイルします。Domains.sol
をローカル環境でブロックチェーン上にデプロイします。- 上記が完了したら、
console.log
の中身がターミナル上に表示されることを確認します。
📝 コントラクトを実行するためのプログラムを作成する
前に挙げた3つのステップを処理するスクリプトを作成します。
scripts
ディレクトリに移動し、run.js
という名前のファイルを作成してください。
run.js
はローカル環境でスマートコントラクトのテストを行うためのプログラムです。
run.js
の中身に、以下を記入しましょう。
const main = async () => {
const domainContractFactory = await hre.ethers.getContractFactory("Domains");
const domainContract = await domainContractFactory.deploy();
await domainContract.deployed();
console.log("Contract deployed to:", domainContract.address);
};
const runMain = async () => {
try {
await main();
process.exit(0);
} catch (error) {
console.log(error);
process.exit(1);
}
};
runMain();
それでは、1行ずつコードの理解を深めましょう。
const domainContractFactory = await hre.ethers.getContractFactory("Domains");
これにより、Domains
コントラクトがコンパイルされます。
コントラクトがコンパイルされたら、コントラクトを扱うために必要なファイルがartifacts
ディレクトリの直下に生成されます。
✍️:
hre.ethers.getContractFactory
についてgetContractFactory
関数は、デプロイをサポートするライブラリのアドレスとDomains
コントラクトの連携を行っ ています。
hre.ethers
は、Hardhat プラグインの仕様です。
✍️:
const main = async ()
とawait
について Javascript でコードを書いていると、コードの上から順に実行されなくて困ることがあります。これを非同期処理に関する問題といいます。解決法の一つとして、ここでは
async
/await
を使用します。これを使うと、
await
が先頭についている処理が終わるまで、main
関数の他の処理は行われません。つまり、
hre.ethers.getContractFactory("Domains")
の処理が終わるまで、main
関数の中に記載されている他の処理は実行されないということです。
次に、下記の処理を見ていきましょう。
const domainContract = await domainContractFactory.deploy();
HardhatがローカルのEthereumネットワークを、コントラクトのためだけに作成します。
そして、スクリプトの実行が完了した後、そのローカル・ネットワークを破棄します。
つまり、コントラクトを実行するたびに、毎回ローカルサーバーを更新するかのようにブロックチェーンが新しくなります。
- 常にゼロリセットとなるので、エラーのデバッグがしやすくなります。
次に下記の処理を見ていきましょう。
await domainContract.deployed();
ここでは、Domains
コントラクトが、ローカルのブロックチェーンにデプロイされるまで待つ処理を行っています。
Hardhatは実際にあなたのマシン上に「マイナー」を作成し、ブロックチェーンを構築してくれます。
constructor
は、スマートコントラクトがデプロイされるときに初めて実行されます。
console.log("Contract deployed to:", domainContract.address);
最後に、デプロイされると、domainContract.address
はデプロイされたスマートコントラクトのアドレスを出力します。
このアドレスから、ブロックチェーン上でスマートコントラクトを見つけることができますが、今回はローカルのイーサリアムネットワーク(=ブロックチェーン)に実装しているため、世界中の人がアクセスできるわけでありません。
一方、イーサリアムやポリゴンのブロックチェーンにデプロイしていれば、世界中の誰でもコントラクトにアクセスできます。
実際のブロックチェーン上には、すでに何百万ものスマートコントラクトがデプロイされています。
アドレスさえわかれば、世界中どこにいても、私たちが興味を持っているスマートコントラクトに簡単にアクセスできます。