【Solidity】storageとmemoryの違いは?

Solidityにおいて変数と一緒に扱う、storageとmemoryの違いについて解説します。

storageとmemoryの違い

storage/memoryとも、データをどこに保存するか、というのを示す修飾子です。

それぞれ解説します。

storage

変数にstorage修飾子を付けると、そのデータはブロックチェーン上に保存されます。

関数外で宣言された変数(状態変数)はデフォルトでstorageとして扱われます。

また、ブロックチェーンに書き込まれるため、コスト(ガス代)が発生します。

memory

変数にmemory修飾子を付けると、そのデータはコントラクト実行時のみ保持されます。

関数の引数や関数内の変数はデフォルトでmemoryとして扱われます。

また、ブロックチェーンへの書き込みは行わないため、コスト(ガス代)は無料です。

storage/memoryの比較まとめ

見やすいよう、storageとmemoryの比較を表にしました。

保存領域ガス代備考
storageブロックチェーン上(コントラクト実行後も保持)有料(発生する)関数外で宣言された変数(状態変数)はデフォルトでstorageとして扱われる
memoryメモリ領域(コントラクト実行後に破棄)無料(発生しない)関数の引数や関数内の変数はデフォルトでmemoryとして扱われる
storage/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では実装に加えコストを抑えることも意識する必要があります。

タイトルとURLをコピーしました