【Solidity】第1章第6回:状態変数とローカル変数の違い

本記事では、Solidityにおける状態変数とローカル変数の違いについて解説します。これらの変数の使い分けを理解することで、スマートコントラクトの設計がより効率的になります。
0. 記事の概要
この記事を読むメリット
- 状態変数とローカル変数の基本を理解:スマートコントラクト内のデータ管理の仕組みを学べます。
- 効率的なコーディング方法を習得:変数の適切な使い分けが可能になります。
- コードの可読性向上:変数のスコープを正確に把握できるようになります。
この記事で学べること
- 状態変数とローカル変数の定義方法
- 状態変数とローカル変数の具体的な違い
- 変数に関連するよくあるエラーとその対処法
1. 状態変数とは?

1.1 状態変数の概要
状態変数は、スマートコントラクト全体で共有されるデータを格納するために使用されます。これらの変数はブロックチェーン上に永続的に保存されます。
1.2 コード例
// 状態変数の定義
contract MyContract {
uint256 public count; // カウンターを表す状態変数
}
動作解説
count
は、コントラクト全体で利用できる変数であり、値はブロックチェーン上に保存されます。
2. ローカル変数とは?
2.1 ローカル変数の概要
ローカル変数は、関数内で一時的に使用されるデータを格納します。これらの変数は、関数の実行が終了すると破棄されます。
2.2 コード例
// ローカル変数の使用例
function calculateSum(uint256 a, uint256 b) public pure returns (uint256) {
uint256 sum = a + b; // ローカル変数
return sum;
}
動作解説
ここで定義されたsum
はローカル変数であり、関数の実行が終了するとメモリから削除されます。
3. 状態変数とローカル変数の違い

3.1 永続性
状態変数はブロックチェーン上に保存され、永続的です。一方、ローカル変数は関数が終了すると破棄されます。
3.2 スコープ
状態変数はコントラクト全体で有効ですが、ローカル変数は定義された関数内でのみ有効です。
3.3 ガスコスト
状態変数はストレージに書き込むため、ローカル変数よりもガスコストが高くなります。
4. よくあるエラーとその対処法
4.1 状態変数の未初期化
状態変数を初期化せずに使用すると、予期しない挙動を引き起こす可能性があります。
uint256 public count; // 初期化されていない状態変数
対処法
明確に初期値を設定することで、問題を回避できます。
4.2 ローカル変数のスコープ外使用
ローカル変数をスコープ外で使用しようとすると、コンパイルエラーが発生します。
// スコープ外でのローカル変数の使用例
function test() public pure {
uint256 sum = 10;
}
// sumをここで使用しようとするとエラー
対処法
ローカル変数はスコープ内でのみ使用し、必要なデータは返り値として扱うようにしましょう。
5. 練習問題

以下の課題に挑戦してみましょう:
- 新しい状態変数
total
を追加し、関数内で加算操作を行い結果を保存する機能を実装してください。 - ローカル変数を使用して、2つの数値の積を計算し返す関数を作成してください。
6. まとめ
本記事では、Solidityにおける状態変数とローカル変数の違いについて学びました。これらの特性を理解し、適切に使い分けることで、スマートコントラクトの効率性と可読性を向上させることができます。次回は、演算子の基本について解説します。