【Solidity】第4章第7回:ストレージ(storage)とメモリ(memory)の違い

本記事では、Solidityにおけるストレージ(storage)とメモリ(memory)の違いについて解説します。それぞれの用途を理解し、スマートコントラクト設計の最適化に役立てましょう。
0. 記事の概要
この記事を読むメリット
- データ保存方法の理解:ストレージとメモリの特性を理解できます。
- ガスコストの最適化:適切なデータ領域の選択でガス代を削減できます。
- 効率的な設計力の向上:スマートコントラクトの効率的な設計が可能になります。
この記事で学べること
- ストレージとメモリの基本的な違い
- それぞれの使用例と適切な使い方
- よくあるエラーとその解決策
1. ストレージとメモリの概要

1.1 ストレージ(storage)とは
ストレージは、スマートコントラクトの状態を永続的に保存する領域です。データはブロックチェーン上に保存されるため、トランザクションが終了した後も保持されます。
1.2 メモリ(memory)とは
メモリは、一時的なデータ保存に使用される領域です。関数呼び出しの間のみ有効で、トランザクションが終了するとデータは破棄されます。
1.3 ストレージとメモリの比較
以下の表に、ストレージとメモリの主な違いをまとめます:
特徴 | ストレージ | メモリ |
---|---|---|
用途 | 永続的なデータ保存 | 一時的なデータ保存 |
コスト | 高い | 低い |
データの寿命 | 無期限 | トランザクション中のみ |
2. 使用例と適切な使い方

2.1 ストレージの使用例
// ストレージの例
contract StorageExample {
uint256[] public numbers;
function addNumber(uint256 _number) public {
numbers.push(_number); // 永続的に保存される
}
function getNumber(uint256 index) public view returns (uint256) {
return numbers[index];
}
}
動作解説
このコードでは、numbers
配列に新しい値を追加し、永続的に保存します。
2.2 メモリの使用例
// メモリの例
contract MemoryExample {
function calculateSum(uint256[] memory _numbers) public pure returns (uint256) {
uint256 sum = 0;
for (uint256 i = 0; i < _numbers.length; i++) {
sum += _numbers[i]; // 一時的な計算
}
return sum;
}
}
動作解説
このコードでは、メモリに渡された配列を使用して計算を行います。計算結果は一時的に使用され、トランザクション終了後に破棄されます。
3. よくあるエラーとその解決策

3.1 ストレージとメモリの誤用
データ領域を誤って指定すると、予期しない動作やコストの増加を招くことがあります。適切な領域を明示的に指定しましょう。
3.2 高いガスコスト
ストレージ操作はガスコストが高いため、可能な限りメモリを使用して一時的なデータを処理しましょう。
4. 練習問題
以下の課題に挑戦してみましょう:
- ストレージに保存された配列の値を変更する関数を実装してください。
- メモリを使用して文字列を結合する関数を作成してください。
5. まとめ
本記事では、Solidityにおけるストレージとメモリの違いについて学びました。それぞれの特性を理解し、効率的なスマートコントラクト設計に役立ててください。