Solidityの書き方について学ぼう
🎁 Solidity のアクセス修飾子について
MyEpicNFT.solに実装した関数や変数に付属する「アクセス修飾子」について理解を深めましょう。
下記のコードを見ていきましょう。
// MyEpicNFT.sol
// pickRandomFirstWord関数は、最初の単語を選びます。
function pickRandomFirstWord(uint256 tokenId) public view returns (string memory) {
:
ここでは、1つ目の単語をランダムに選ぶpickRandomFirstWord関数を実装しました。まず、関数を修飾しているpublicについて見ていきます。
これは、Solidityのアクセス修飾子の1つです。
Solidity含めさまざまな言語において、各関数のアクセス権限について指定する必要があります。その指定を行うのが、アクセス修飾子です。
Solidityには、4つのアクセス修飾子が存在します。
-
public:publicで定義された関数や変数は、それらが定義されているコントラクト、そのコントラクトが継承された別のコントラクト、それらコントラクトの外部と、基本的にどこからでも呼び出すことができます。Solidity では、アクセス修飾子がついてない関数を、自動的にpublicとして扱います。 -
private:privateで定義された関数や変数は、それらが定義されたコントラクトでのみ呼び出すことができます。 -
internal:internalで定義された関数や変数は、それらが定義されたコントラクトと、そのコントラクトが継承された別のコントラクトの両方から呼び出すことができます。 Solidity では、アクセス修飾子がついてない変数を、自動的にinternalとして扱います。 -
external:externalで定義された関数は、外部からのみ呼び出すことができます。
以下に、Solidityのアクセス修飾子とアクセス権限についてまとめています。

これからSolidityのアクセス修飾子は頻繁に登場するので、まずは大まかな理解ができれば大丈夫です。
🔍 msg.senderについて
// MyEpicNFT.sol
_safeMint(msg.sender, newItemId);
_safeMint関数の引数としてmsg.senderが登場するのをお気付きでしょうか?
msg.senderに入る値は、ずばり、関数を呼び出した人(= NFT を Mint した人)のウォレットアドレスです。
これは、ユーザー認証のようなものです。
- スマートコントラクトに含まれる関数を呼び出すには、ユーザーは有効なウォレットを接続する必要があります。
msg.senderでは、誰が関数を呼び出したかを正確に把握し、ユーザー認証を行っています。
🖋 Solidity の関数修飾子について
Solidityには、関数(function)に対してのみ使用される修飾子(=関数修飾子)が存在します。
Solidity開発では関数修飾子を意識しておかないとデータを記録する際のコスト(=ガス代)が跳ね上がってしまうので注意が必要です。
ここでポイントとなるのは、ブロックチェーンに値を書き込むにはガス代を払う必要があること、そしてブロックチェーンから値を参照するだけなら、ガス代を払う必要がないことです。
ここでは、主要な2つの関数修飾子を紹介します。
-
view:view関数は、読み取り専用の関数であり、呼び出した後に関数の中で定義された状態変数が変更されないようにします。 -
pure:pure関数は、関数の中で定義された状態変数を読み込んだり変更したりせず、関数に渡されたパラメータや関数に存在するローカル変数のみを使用して値を返します。
以下に、Solidityの関数修飾子pureとviewについてまとめています。

ここまで理解してほしいのは、pureやview関数を使用すれば、ガス代を削減できるということです。同時に、ブロックチェーン上にデータを書き込まないことで、処理速度も向上します。
🙋♂️ 質問する
ここまでの作業で何かわからないことがある場合は、Discordの#ethereumで質問をしてください。
ヘルプをするときのフローが円滑になるので、エラーレポートには下記の3点を記載してください ✨
1. 質問が関連して いるセクション番号とレッスン番号
2. 何をしようとしていたか
3. エラー文をコピー&ペースト
4. エラー画面のスクリーンショット
Solidityの構文について理解を深めたら、次のレッスンに進みましょう 🎉