Solidity

【Solidity】第3章第2回:関数の可視性(public, private, internal, external)

本記事では、Solidityにおける関数の可視性修飾子(public、private、internal、external)について解説します。関数の可視性は、スマートコントラクトのセキュリティや動作に直結する重要な要素です。初心者でも理解しやすい具体例を交えながら、適切な使い分け方を学びましょう。

0. 記事の概要

この記事を読むメリット

  • 可視性修飾子の理解:関数のアクセス範囲を制御する修飾子の使い方を学べます。
  • セキュアなスマートコントラクト設計:関数を適切に保護し、不正アクセスを防ぐ方法を学びます。
  • コーディングスキルの向上:可視性を考慮した効率的な関数設計を習得できます。

この記事で学べること

  • 可視性修飾子(public, private, internal, external)の違い
  • 可視性修飾子の適切な使用例
  • よくあるミスとその解決策

1. 関数の可視性修飾子とは?

1.1 可視性修飾子の概要

Solidityでは、関数のアクセス範囲を制御するために可視性修飾子が使用されます。これにより、外部からのアクセスを許可するかどうかを設定できます。

1.2 可視性修飾子の種類

可視性修飾子には以下の4種類があります:

  • public:外部および内部からアクセス可能
  • private:同一コントラクト内でのみアクセス可能
  • internal:同一コントラクトおよび継承先のコントラクトからアクセス可能
  • external:外部からのみアクセス可能(内部からはthisを使用)

2. 可視性修飾子の使い方

2.1 publicの使用例

// public関数の例
function getPublicData() public pure returns (string memory) {
    return "この関数は誰でも呼び出せます";
}

2.2 privateの使用例

// private関数の例
function calculate(uint256 a, uint256 b) private pure returns (uint256) {
    return a + b;
}

注意:private関数は外部や継承先からは呼び出せません。

2.3 internalの使用例

// internal関数の例
function multiply(uint256 a, uint256 b) internal pure returns (uint256) {
    return a * b;
}

注意:internal関数は継承先のコントラクトから呼び出すことができます。

2.4 externalの使用例

// external関数の例
function externalFunction() external pure returns (string memory) {
    return "外部からのみ呼び出せます";
}

注意:external関数はthisを使用して内部から呼び出すことも可能です。

3. よくあるミスとその解決策

3.1 不適切な可視性設定

関数の可視性を適切に設定しないと、外部から予期しないアクセスが発生する可能性があります。

// 修正例
function sensitiveFunction() private {
    // センシティブな処理
}

対処法

関数の用途に応じて適切な可視性修飾子を設定しましょう。

3.2 external関数の内部呼び出し

external関数は内部から直接呼び出せないため、以下のようにthisを使用します。

// 修正例
function callExternal() public view returns (string memory) {
    return this.externalFunction();
}

4. 練習問題

以下の課題に挑戦してみましょう:

  1. internal関数を利用して、継承先のコントラクトから呼び出せる関数を作成してください。
  2. private関数を利用して、計算結果を返す安全な関数を作成してください。

5. まとめ

本記事では、Solidityにおける関数の可視性修飾子について解説しました。可視性を正しく設定することで、スマートコントラクトのセキュリティと効率性を向上させることができます。次回は、関数引数と戻り値の活用について詳しく解説します。