Solidityの関数、変数につけることができるアクセス制限。
具体的には以下の4つを設定できる。
・private
・public
・internal
・external
それぞれの違い、使い所が分からなくなってしまう時があるので備忘録として残したいと思う。
private
定義したコントラクト内でのみ呼び出し可能。
継承した子コントラクトでも呼び出すことはできない。
範囲 | 呼び出し可否 |
---|---|
コントラクト外部 | ✖️ |
コントラクト内部 | ○ |
継承先 | ✖️ |
public
定義したコントラクト、そのコントラクトを継承したコントラクト、及び外部からも呼び出し可能。
関数はデフォルトでpublicになっているため、何も指定しないとpublicなので注意が必要。
範囲 | 呼び出し可否 |
---|---|
コントラクト外部 | ○ |
コントラクト内部 | ○ |
継承先 | ○ |
internal
定義したコントラクト、そのコントラクトを継承したコントラクトから呼び出し可能。
変数はデフォルトでinternalになっているため、何も指定しないとinternalになる。
範囲 | 呼び出し可否 |
---|---|
コントラクト外部 | ✖️ |
コントラクト内部 | ○ |
継承先 | ○ |
external
外部からの呼び出しのみ可能。
但し、thisを使用することで内部から外部的に呼び出すことは可能。
であれば、publicと変わらないように見える。
ところがpublicは引数の値をメモリに保存し、externalはメモリ保存しないため、externalの方がgasの消費が低く済むらしい。
参考:https://ethereum.stackexchange.com/questions/19380/external-vs-public-best-practices
範囲 | 呼び出し可否 |
---|---|
コントラクト外部 | ○ |
コントラクト内部 | ✖️ |
継承先 | ✖️ |