Solidityにおける関数の書き方について解説します。
構文
まず、関数の構文ですが、以下のようになります。
「戻り値が無い場合(処理だけ行う)」「戻り値が有る場合(処理結果も返す)」の2つがあります。
戻り値が無い場合(処理だけ行う場合)
戻り値が無い場合(処理だけ行う場合)には、関数は、以下のように書きます。
function 関数名([データ型 引数]) [アクセス修飾子] [状態修飾子] {
// 処理
}
戻り値が有る場合(処理結果も返す場合)
戻り値が有る場合(処理結果も返す場合)には、関数は、以下のように書きます。
function 関数名([データ型 引数]) [アクセス修飾子] [状態修飾子] returns(データ型) {
// 処理
return 値(returnsに指定したものと同じデータ型);
}
構文詳細
構文詳細について記します。
関数名
関数名にはmixedCase(最初の単語以外は頭文字を大文字にする)が推奨されています。
また、プライベート関数の場合、先頭にアンダースコア(_)を付けることが推奨されています。
データ型
データ型ですが主に以下があります。
- bool:真偽値
- int:符号付き整数
- uint:符号無し整数
- fixed:符号付き固定小数点数
- ufixed:符号無し固定小数点数
- address:Ethereumアドレス
- bytes:バイト配列
- string:文字列
- enum:列挙型
- struct:構造体
- mapping:マッピング/キーと値のペア
- array:配列
詳しくはこちらをご覧ください。
アクセス修飾子
アクセス修飾子ですが主に以下があります。
- public:外部から直接アクセスが可能、コントラクト内部や継承先コントラクトからも呼び出しが可能
- private:同じスマートコントラクト内からのみアクセスが可能、継承先コントラクトからの呼び出しは不可
- internal:同じスマートコントラクト内からのみアクセスが可能、継承先コントラクトからの呼び出しは可能
- external:外部スマートコントラクトからのみ呼び出しが可能、コントラクト内部や継承先コントラクトからの呼び出しも不可
詳しくはこちらをご覧ください。
状態修飾子
状態修飾子ですが主に以下があります。
- view:状態変数(storage変数)の変更を行わない、読取は可能
- pure:状態変数(storage変数)の読取/変更を行わない、引数は読取/変更が可
- payable:eth(イーサリアム)の受取が可
サンプルコード
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract TestContract {
string greeting = "hi";
function sayHi() public view returns(string memory) {
return greeting;
}
function _sayHi() private view returns(string memory) {
return greeting;
}
function sum(uint x, uint y) public pure returns(uint) {
return x + y;
}
function _sum(uint x, uint y) private pure returns(uint) {
return x + y;
}
}
基本的な構文は他のプログラミング言語と同様ですが、関数修飾子(アクセス修飾子や状態修飾子)だけSolidity独特かもしれません。それぞれの特徴をしっかりと押さえておきましょう。