【Solidity】publicとexternalの違いを解説

Solidityロゴ

今回はSolidityで関数定義の際に用いるpublicとexternalの2つのアクセス修飾子の違いについて解説していきます。

目次

publicとexternalの違い2つ

questionマーク

publicとexternalの主な違いは以下の2つです。

publicとexternalの違い2つ
  1. 実行時のガス代
  2. コントラクト内からのアクセス

それぞれ解説していきます。

違い①:実行時のガス代

publicとexternalの大きな違いの1つは、ガス代です。

なので、以下の関数testtest2を実行した際にかかるガス代は異なります。

pragma solidity ^0.8.0;

contract Test {
    // 34077 gas
    function test(uint[20] memory a) public returns (uint){
          return a[10]*2;
    }

    // 34052 gas
    function test2(uint[20] memory a) external returns (uint){
         return a[10]*2;
    }
}

25gas前後ほどの微妙な違いではありますが、externalの関数の方がガス代が安いことがわかります。

トマトソース

なのでガス代のことを考えると同コントラクト内で呼び出していない場合はexternalにすると良いでしょう。

違い②:コントラクト内からのアクセス

publicとextenalの違い2つ目は、同コントラクト内からのアクセスです。

publicの関数は同コントラクト内からのアクセスが可能ですが、externalの関数では不可となっています。

なので例えば、

pragma solidity ^0.8.0;

contract Test {

    function test(uint[20] memory a) public pure returns (uint){
          return a[10]*2;
    }

    function test2(uint[20] memory a) external pure returns (uint){
         return a[10]*2;
    }
}

といったようにexternalとpublicの関数がそれぞれあった場合には、

// Test.sol内

function accessPublic(uint[20] memory a) public pure returns (uint[] memory) {
   uint _a = test(a); // test関数へのアクセス可能
   return a;
}

function accessExternal(uint[20] memory a) public pure returns (uint[] memory) {
   uint _a2 = test2(a); // test2関数へのアクセス不可
   return a;
}

となり、test関数を同コントラクト内の別の関数から呼び出すことができますが、test2関数は別の関数から呼び出すことができません。

まとめ:publicとexternalの違いを解説

今回はSolidityで関数を定義する際に使用するpublicとexternalの違いについて解説しました。

繰り返しになりますが、基本的には以下の2点で異なります。

publicとexternalの違い2つ
  1. 実行時のガス代
    → externalの方が安い
  2. コントラクト内からのアクセス
    → publicは別の関数からアクセス可能

より良いスマートコントラクトの実装に少しでもお役に立てれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次