lesson-4_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. エラー画面のスクリーンショット