Solidity関数とは?
執筆者 Alchemy
Solidity の関数には、view関数、pure関数、特殊関数、fallback関数など複数の種類があります。関数はまた、public、external、internal、privateという関数可視性属性で修飾することができます。本記事では、Solidityの関数の種類、構文、関数の読み方と可視性について解説します。
Solidityの関数とは
Solidityの関数とは、特定のタスクを実行する独立したコードモジュールです。 他のweb3プログラミング言語と同様、Solidityでは関数を使ってモジュール化されたコードを書くことができ、同じコードを繰り返し書く冗長性を排除できます。開発者は代わりに、必要なときにプログラム内でその関数を呼び出すことができます。
Solidityの関数の書き方と読み方
Solidityの関数を書くには、正しい構文に従って構造化し、関数が正しく実行されるように基本的な構成要素を漏れなく記述する必要があります。
Solidityの関数構文
以下の例のように、次の構文でSolidityの関数を作成します。
- functionキーワードで関数を定義する
- 関数の名前を作成する。この名前は一意であり、予約キーワードと重複してはならない
- パラメータの名前とデータ型を含むパラメータをリストするか、追加のパラメータを含めない
- 波括弧で囲まれたステートメントブロックを作成する
注: Solidityのイベントは関数と同じように宣言されます。イベントと関数は、いずれも高レベルのdApp開発に不可欠な要素です。
以下の画像は、Solidity関数の3つの主要な構成要素を示しています。
- 関数名
- 関数の型
- 戻り値の型

Solidityの関数にはどのような種類があるか
このセクションでは、Solidityにおけるさまざまな関数の種類を取り上げます。 具体的には、view関数、pure関数、特殊関数、fallback関数について説明します。
1. view関数
Solidityにおけるview関数は読み取り専用であり、スマートコントラクトで定義された状態変数を変更することはできません。view関数の構文は以下の通りです。
2. pure関数
pure関数は、状態変数の変更も読み取りも行わないことを宣言する関数です。通常、pure関数は共通のユーティリティや計算処理を担います。pure関数の構文は以下の通りです。
3. 特殊関数
Solidityには、スマートコントラクトを開発する際に使用できる特殊関数がいくつか存在します。GetterおよびReceive関数は、Solidityのスマートコントラクトにおいて重要なpayable関数です。
Getter関数
publicとして定義された状態変数には、コンパイラによって自動的に作成されるgetter関数があります。この関数は変数と同じ名前を持ち、external可視性を持ちます。
Receive ether関数
コントラクトが持てるreceive関数は最大1つです。receive関数は引数を持つことができず、値を返すこともできません。また、external可視性とpayableの状態可変性を持つ必要があります。
receive関数は、コントラクトへの呼び出しがEtherを送信し、かつどの関数も指定していない場合に実行されます。この関数は以下のように宣言されます。
4. Fallback関数
Solidityにおけるfallback関数は、名前も引数も戻り値も持たないexternal関数です。fallback関数は、関数識別子がスマートコントラクト内のいずれの利用可能な関数とも一致しない場合、または関数呼び出しとともにデータが渡されなかった場合に実行されます。
関数のオーバーロードとは
関数のオーバーロードとは、同一のスコープ内で同じ関数名に対して複数の定義が存在する状態を指します。それぞれの定義は、引数リストの型やその数によって互いに異なっていなければなりません。戻り値の型のみが異なる関数宣言をオーバーロードすることはできません。
Vyperの関数オーバーロードの扱いはSolidityとどう異なるか
Solidityとは異なり、Solidityをベースとしたpythonライクな言語であるVyperでは、関数のオーバーロードは許可されていません。Vyperで関数のオーバーロードを試みると、「Duplicate function or event name」というエラーが発生します。
関数の可視性とは
関数の可視性を指定することで、スマートコントラクト内の関数をどのエンティティが呼び出せるかを制御できます。呼び出し元には次の3種類があります。
- メインのコントラクト
- メインのコントラクトから派生した(すなわち継承した)コントラクト
- サードパーティ
関数の可視性によって、上記の呼び出し元のうちどれがその関数を実行できるかを制御できます。関数の可視性には4種類があります。
- Public
- External
- Internal
- Private
関数のアクセス可能性は、ExternalからPrivateにかけて低くなっていきます。public関数が最もアクセスしやすく、private関数が最もアクセスしにくくなっています。
External と public の違い
ExternalとPublicは、定義されているコントラクトの外部から呼び出せる2つの関数可視性です。Externalは、その関数が他のコントラクトまたはExternally Owned Account(EOA)からのみ呼び出せることを意味します。Publicは、その関数を外部から、あるいはコントラクト自身の内部からも呼び出せることを意味します。
Internal と private の違い
ExternalおよびPublicとは対照的に、InternalとPrivateはいずれも外部の者がその関数にアクセスすることを許可しません。private関数の場合、同じコントラクト内の関数のみがそれを呼び出すことができます。internal関数の場合、同じコントラクト内の関数、または派生コントラクト内の関数がそれを呼び出すことができます。
Solidityの関数についてさらに学ぶ
本記事では、Solidityにおける関数について解説しました。さらに学習を続けるには、Alchemy UniversityのEthereum Developer Bootcampに登録し、7週間の無料非同期Solidity集中講座を受講してください。開発全般が初めての方には、Ethereumブートキャンプを始める前の前提知識として、Alchemy Universityの3週間のJavaScript集中講座がおすすめです。
関連する概要

ブロックチェーンで魔法を生み出す
Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。


