【Solidity基礎】public, privateとexternal, internalの違いと使い所




どうも高妻です。Twitterでプログラミングのことや暗号通貨のことをつぶやいているのでよかったらフォローしてください。  

Solidityのアクセス権限

Solidityには変数と関数にどこからアクセスできるのか制限をつけることができます。下記4つを設定することができます。今回はこの4つのアクセス制限と使い所を説明したいと思います。

  • private
  • public
  • internal
  • external

private

他の言語と同じで定義されたコントラクト内でのみ使用することができます。定義されたコントラクトを継承した子のコントラクトではprivateな関数と値を使用することはできません。

public

publicは定義されたコントラクトとこのコントラクトを継承したコントラクトから呼び出すことができかつ、外部から呼び出すことができます。関数に明示的に権限を設定していない場合のデフォルト設定がpublicとなるので気をつけてください。

internal

internalは定義されたコントラクトとこのコントラクトを継承したコントラクからのみ呼び出すことができます。変数に明示的に権限を設定していない場合のデフォルトの設定はinternalとなります。

external

externalは外部からのみ呼び出すことができます。

externalとpublicの使いどころ

externalは外部からしか呼ぶことができませんが、thisを使うと内部から外部的に関数を呼び出すことができます。呼び出せるということだけを見るとpublicと同じ権限になり違いが無くなりますが下記Stack Overflowに詳しく説明されているので読んでみてください。

違いを簡単に説明すると、引数で渡された値をメモリに保存するかしないかの違いがあります。

publicな関数を外部から呼ぶと引数の値を一度メモリに保存します。externalな関数の場合は引数で渡された値はメモリに保存されることなく関数が処理されるのでgasがpublicよりも低くすむそうです。

public関数は内部からも呼ばれる関数なので変数をメモリに入れておく必要があるという説明がされていてなるほどと理解することができました。間違いがあれば指摘していただければと思います。

external vs public best practices

サンプルコード

下記はSolidityのドキュメントに記載されているサンプルコードです。非常にわかりやすいので一度読んで理解しておくといいかと思います。ドキュメントはこちら

 

The following two tabs change content below.

高妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 現在はTwitterなどSNSのテキスト解析を行うソーシャルメディア分析のサーバーサイドを開発中。言語はNode.js、Kotlinを使用。






コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です