Scope
ストレージ変数と関数のScopeについて学習します
適切なスコープを設定することはセキュリティの担保に重要です
なお外部エンティティとはコントラクト、ユーザー(EOA)などそのコントラクトにアクセスできる第三者を指します
継承についてはInheritanceで解説します
ストレージ変数
修飾子によってアクセス(値の変更)が制御される
修飾子は型 修飾子 変数名という形で付与される
修飾子を省略した場合のデフォルトはinternal
| 修飾子 | 外部エンティティ | 継承コントラクト | 同一コントラクト |
|---|---|---|---|
| public | × | 〇 | 〇 |
| internal | × | 〇 | 〇 |
| private | × | × | 〇 |
publicとinternalの違いとして、public修飾子を付与するとgetter関数が自動生成される
つまり、値の取得という観点ではpublicの外部エンティティはデフォルトで〇になる
internal、privateにおいては継承コントラクトまたは同一コントラクトでgetter関数を記述することで値の取得が可能になる
contract variablesScope {
// not visible from the third party
uint private a;
// default is internal
uint b;
// public generates getter automatically
uint public c;
// This getter allows the third party to view value
function getB() view returns(uint) {
return b;
}
}
ヒント
通常、getter関数のない変数は値を確認する ことができない
ただし、ブロックチェーンのストレージを直接参照することでprivateな変数でも値を確認することが可能(原理上ブロックチェーンに秘密の値を保存することは不可能)
詳しくはStorage Layoutで解説
関数
以下の修飾子によってアクセス(呼び出し)が制御される
修飾子を省略した場合のデフォルトはinternal
| 修飾子 | 外部エンティティ | 継承コントラクト | 同一コントラクト |
|---|---|---|---|
| public | 〇 | 〇 | 〇 |
| external | 〇 | × | × |
| internal | × | 〇 | 〇 |
| private | × | × | 〇 |
contract functionScope {
function publicFunction() public pure returns(string) {
internalFunction();
return "This is public function";
}
function internalFunction() internal pure returns(string) {
privateFunction();
return "This is internal function";
}
function privateFunction() private pure returns(string) {
return "This is private function";
}
}