solidityのコードを読んでいて頻出するコードの意味をまとめました。
データ保存領域
Storageはブロックチェーンに書き込まれ永続的に保存されるが非常にGasを消費する。Memoryはコントラクトの実行が終わると破棄される、安価。
関数外で宣言された変数(ローカル変数)と状態変数はstorageに保存される。関数の戻り値はmemoryに保存される。また外部関数の引数はcalldata(関数の引数が格納されるmemoryのようなもの)に保存される。
アクセス権限
-- private
定義されたコントラクト内でのみ参照可能。
-- internal
定義されたコントラクト及びそのコントラクトを継承したコントラクトから参照可能。変数はデフォルトでinternal。
-- external
外部からのみ参照可能。ただしthis.f()とすれば内部からも参照できる。
-- public
定義されたコントラクト及びそのコントラクトを継承したコントラクト及び外部から参照可能。関数はデフォルトでpublic。
-- externalとpublicの違い
externalの方がGasの消費が少ない。これはexternalは関数の内部呼び出しを考慮する必要がないからである。関数の内部呼び出しの際引数はmemoryに書き込まれるので、calldataから直接読み取る外部呼出しと比較してGasを消費する。
またthis.f()は非常にGasを消費するので使わないほうが良い。
関数修飾子
-- view
状態を変更しない(ブロックチェーンに書き込まない、storageに書き込まない)ことを宣言する。
storageから読み込んだり、読み込んだデータを処理することはできる。
-- pure
viewに加えてstorageからの読み込みもしないことを宣言する。つまり引数のみが処理可能。