メインコンテンツまでスキップ

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";
}

}

Reference