Solidityにおける状態変数について解説します。
そもそも状態変数とは?
Solidityにおける状態変数ですが、「コントラクト内に保存されている変数」のことです。
コントラクト内に保存されているため、コントラクト実行後も、データは保持されます。
反対に、状態変数の対であるメモリ変数については、コントラクト実行後に破棄されます。
関数外で宣言された変数は状態変数
関数外で宣言された変数は、デフォルトで状態変数となります。
つまり、関数外で変数を宣言すると、それはコントラクトに永久保存されることになります。
状態変数にはアクセスレベルが存在
状態変数にはアクセスレベル(変数の公開範囲)が存在します。
以下のアクセスレベルがあります。
- public:外部から直接アクセス可
- private:同じスマートコントラクト内からのみアクセス可(継承先からは不可)
- internal:同じスマートコントラクト内からのみアクセス可(継承先からも可)
サンプルコード
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Test {
/* 状態変数(関数外で宣言された変数はデフォルトで状態変数) */
// Public
uint256 public publicVariable = 10;
// Private
uint256 private privateVariable = 10;
// Internal
uint256 internal internalVariable = 10;
function sampleFunction(uint num) public pure returns(uint) {
return num;
}
}
普段何気なく使っている変数ですが、“状態変数”と“メモリ変数”があることを覚えておきましょう。前者はコントラクト実行後もコントラクト(ブロックチェーン)にずっと保存される変数、後者はコントラクト実行後に破棄される変数です。関数外で宣言されたものは状態変数に、関数内で宣言されたものはメモリ変数になります。