Solidityでスマートコントラクトを作成しよう
👩💻 コントラクトを作成する
メッセージを管理するスマートコントラクトを作成します。 ここで作成するスマートコントラクトは、後でユースケースに合わせて自由に変更できます。
packages/contract/contracts
ディレクトリの下にMessenger.sol
という名前のファイルを作成します。
Hardhatを使用する場合、ファイル構造は非常 に重要ですので、注意する必要があります。ファイル構造が下記のようになっていれば大丈夫です 😊
contract/
└── contracts/
└── Messenger.sol
次に、コードエディタでプロジェクトのコードを開きます。
ここでは、VS Codeの使用をお勧めします。ダウンロードは こちら から。
VS Codeをターミナルから起動する方法は こちら をご覧ください。
- ターミナル上で、
code
コマンドを実行
今後VS Codeを起動するのが一段と楽になるので、ぜひ導入してみてください。
コーディングのサポートツールとして、VS Code上でSolidityの拡張機能をダウンロードすることをお勧めします。
ダウンロードは こちら から。
それでは、これからMessenger.sol
の中身の作成していきます。
Messenger.sol
をVS Codeで開き、下記を入力します。
// Messenger.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "hardhat/console.sol";
contract Messenger {
uint256 public state;
constructor() {
console.log("Here is my first smart contract!");
state = 1;
}
}
コードを詳しくみていきましょう。
// Messenger.sol
// SPDX-License-Identifier: MIT
これは「SPDXライセンス識別子」と呼ばれ、ソフトウェア・ライセンスの種類が一目でわかるようにするための識別子です。
詳細については、こちら を参照してみてください。
// Messenger.sol
pragma solidity ^0.8.17;
これは、コントラクトで使用するSolidityコンパイラのバージョンです。
上記のコードでは、このコントラクトを実行するときはSolidityコンパイラのバージョンが0.8.17
以上1.0.0
未満を使用しそれ以外のものは使用しません、という宣言をしています。
Solidityは Semantic Versioning を採用しているため、バージョン表記の見方は
MAJOR.MINOR.PATCH
となり、MAJOR(一番左の番号)は互換性がない修正・変更がSolidityに加わった場合に変わります。
つまり、0.8.17
から1.0.0
未満までの範囲は修正が加わっても互換性がある(コンパイルが可能)変更なので、^
を先頭につけることで、
その範囲のバージョンの違いは許容するということです。
0.8.17
がhardhat.config.ts
でも記載されていることを確認してください。
もし、hardhat.config.ts
の中に記載されているSolidityのバージョンが0.8.17
でなかった場合は、Messenger.sol
の中身をhardhat.config.ts
に記載されているバージョンに変更しましょう。
// Messenger.sol
import "hardhat/console.sol";
コントラクトを実行する際、コンソールログをターミナルに出力するためにHardhatのconsole.sol
のファイルをインポートしています。
これは、今後スマートコントラクトのデバッグが発生した場合に、とても役立つツールです。
// Messenger.sol
contract Messenger {
uint256 public state;
constructor() {
console.log("Here is my first smart contract!");
state = 1;
}
}
contract
に続けて定義するコントラクトの名前を記述します。
コントラクトはほかの言語でいうところの「class」のように考えることができます。
classの概念については、こちら を参照してください。
コントラクト内では状態変数のstate
を定義しています。
state
はuint256
型でpublic
というアクセス修飾子をつけています。
uint256
は非常に大きな数を扱うことができる「符号なし整数のデータ型」を意味します。
アクセス修飾子に関しては後のレッスンで扱いますが、
public
の指定により、state
はコントラクトの外部からアクセスできるということだけここでは理解しておきましょう。
次にconstructor
を実装しています。
Messenger
をデプロイすると、constructor