---
title: "Solidity関数とは？"
description: "Solidity関数の種類：View、Pure、Special、Fallback、Function Visibility"
---

# Solidity関数とは？

[Solidity](https://www.alchemy.com/overviews/solidity) の関数には、view関数、pure関数、特殊関数、fallback関数など複数の種類があります。関数はまた、public、external、internal、privateという関数可視性属性で修飾することができます。本記事では、Solidityの関数の種類、構文、関数の読み方と可視性について解説します。

## **Solidityの関数とは**

**Solidityの関数とは、特定のタスクを実行する独立したコードモジュールです。** 他の[web3プログラミング言語](https://www.alchemy.com/overviews/web3-programming-languages)と同様、Solidityでは関数を使ってモジュール化されたコードを書くことができ、同じコードを繰り返し書く冗長性を排除できます。開発者は代わりに、必要なときにプログラム内でその関数を呼び出すことができます。

## **Solidityの関数の書き方と読み方**

Solidityの関数を書くには、正しい構文に従って構造化し、関数が正しく実行されるように基本的な構成要素を漏れなく記述する必要があります。

### **Solidityの関数構文**

以下の例のように、次の構文でSolidityの関数を作成します。

1. functionキーワードで関数を定義する
1. 関数の名前を作成する。この名前は一意であり、予約キーワードと重複してはならない
1. パラメータの名前とデータ型を含むパラメータをリストするか、追加のパラメータを含めない
1. 波括弧で囲まれたステートメントブロックを作成する

注: [Solidityのイベント](https://www.alchemy.com/overviews/solidity-events)は関数と同じように宣言されます。イベントと関数は、いずれも高レベルのdApp開発に不可欠な要素です。

以下の画像は、Solidity関数の3つの主要な構成要素を示しています。

1. 関数名
1. 関数の型
1. 戻り値の型

<ImageBlock
  src="https://media.alchemy.com/1703927821-example-of-a-function-in-solidity.png"
  alt="Solidityにおける関数の例"
  width={960}
  height={540}
  caption="Solidityにおける関数の例"
/>

## **Solidityの関数にはどのような種類があるか**

**このセクションでは、Solidityにおけるさまざまな関数の種類を取り上げます。** 具体的には、view関数、pure関数、特殊関数、fallback関数について説明します。

### **1. view関数**

Solidityにおけるview関数は読み取り専用であり、スマートコントラクトで定義された状態変数を変更することはできません。view関数の構文は以下の通りです。

### **2. pure関数**

pure関数は、状態変数の変更も読み取りも行わないことを宣言する関数です。通常、pure関数は共通のユーティリティや計算処理を担います。pure関数の構文は以下の通りです。

### **3. 特殊関数**

Solidityには、スマートコントラクトを開発する際に使用できる特殊関数がいくつか存在します。GetterおよびReceive関数は、Solidityのスマートコントラクトにおいて重要な[payable関数](https://www.alchemy.com/docs/solidity-payable-functions)です。

#### **Getter関数**

publicとして定義された状態変数には、コンパイラによって自動的に作成されるgetter関数があります。この関数は変数と同じ名前を持ち、external可視性を持ちます。

#### **Receive ether関数**

コントラクトが持てるreceive関数は最大1つです。receive関数は引数を持つことができず、値を返すこともできません。また、external可視性とpayableの状態可変性を持つ必要があります。

receive関数は、コントラクトへの呼び出しがEtherを送信し、かつどの関数も指定していない場合に実行されます。この関数は以下のように宣言されます。

### **4. Fallback関数**

Solidityにおけるfallback関数は、名前も引数も戻り値も持たないexternal関数です。fallback関数は、関数識別子がスマートコントラクト内のいずれの利用可能な関数とも一致しない場合、または関数呼び出しとともにデータが渡されなかった場合に実行されます。

### **関数のオーバーロードとは**

関数のオーバーロードとは、同一のスコープ内で同じ関数名に対して複数の定義が存在する状態を指します。それぞれの定義は、引数リストの型やその数によって互いに異なっていなければなりません。戻り値の型のみが異なる関数宣言をオーバーロードすることはできません。

#### **Vyperの関数オーバーロードの扱いはSolidityとどう異なるか**

Solidityとは異なり、[Solidityをベースとしたpythonライクな言語](https://www.alchemy.com/overviews/solidity-vs-vyper)であるVyperでは、関数のオーバーロードは許可されていません。Vyperで関数のオーバーロードを試みると、「Duplicate function or event name」というエラーが発生します。

## **関数の可視性とは**

関数の可視性を指定することで、[**スマートコントラクト内の関数をどのエンティティが呼び出せるかを制御**](https://www.alchemy.com/university/courses/ethereum?a=703dc50260)できます。呼び出し元には次の3種類があります。

1. メインのコントラクト
1. メインのコントラクトから派生した(すなわち継承した)コントラクト
1. サードパーティ

関数の可視性によって、上記の呼び出し元のうちどれがその関数を実行できるかを制御できます。関数の可視性には4種類があります。

1. Public
1. External
1. Internal
1. 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**](https://www.alchemy.com/university/courses/ethereum?a=703dc50260)に登録し、7週間の無料非同期Solidity集中講座を受講してください。開発全般が初めての方には、Ethereumブートキャンプを始める前の前提知識として、Alchemy Universityの[**3週間のJavaScript集中講座**](https://www.alchemy.com/university/courses/js)がおすすめです。
