Solidityにおいて変数と一緒に扱う、storageとmemoryの違いについて解説します。
storageとmemoryの違い
storage/memoryとも、データをどこに保存するか、というのを示す修飾子です。
それぞれ解説します。
storage
変数にstorage修飾子を付けると、そのデータはブロックチェーン上に保存されます。
関数外で宣言された変数(状態変数)はデフォルトでstorageとして扱われます。
また、ブロックチェーンに書き込まれるため、コスト(ガス代)が発生します。
memory
変数にmemory修飾子を付けると、そのデータはコントラクト実行時のみ保持されます。
関数の引数や関数内の変数はデフォルトでmemoryとして扱われます。
また、ブロックチェーンへの書き込みは行わないため、コスト(ガス代)は無料です。
storage/memoryの比較まとめ
見やすいよう、storageとmemoryの比較を表にしました。
保存領域 | ガス代 | 備考 | |
---|---|---|---|
storage | ブロックチェーン上(コントラクト実行後も保持) | 有料(発生する) | 関数外で宣言された変数(状態変数)はデフォルトでstorageとして扱われる |
memory | メモリ領域(コントラクト実行後に破棄) | 無料(発生しない) | 関数の引数や関数内の変数はデフォルトでmemoryとして扱われる |
サンプルコード
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Test {
// 関数外で宣言された変数(状態変数)はデフォルトでstorageとして扱われる
string str = "hello";
// 関数の引数や関数内の変数はデフォルトでmemoryとして扱われる
function multiple(uint x) public pure returns(uint) {
uint y = 10;
return x * y;
}
}
storageを使用するとコスト(ガス代)が発生するため極力storageを使用しないよう心掛けてプログラムを組みましょう。Solidityでは実装に加えコストを抑えることも意識する必要があります。