본문 바로가기
Programing/Solidity

[Solidity] Storage와 Memory

by AustinProd 2022. 3. 15.

솔리디티로 스마트 컨트렉스 작성 시, 변수는 Storage 혹은 Memory 영역에 저장된다. 컴퓨터로 비유를 하면, 데이터가 하드디스크(Disk)에 저장되는 것과 메모리(Ram)에 저장되는 것과 비슷하다.

 

Storage

스마트 컨트렉트에서 스토리지(Storage)라고 하면, 블록체인 네트워크의 블록을 의미한다. 스토리지에 저장되는 데이터는 곧 블록체인에 저장되는 것과 같다. 컨트렉트가 실제로 블록체인 네트워크에 배포되면 해당 데이터는 영구적으로 블록체인 안에 저장된다.

 

대표적으로 상태 변수(State Variable)의 데이터들이 스토리지 영역을 사용한다. 컨트렉트에 선언된 전역 변수들은 storage로 선언되어 있지 않더라도 스토리지에 저장된다. 만약, 상태 변수가 아닌 변수, 예를 들어 지역 변수(Local Variable)의 저장 영역을 스토리지로 지정하고 싶다면 데이터 선언과 함께 storage 옵션이 붙어야 한다.

 

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;

contract Will {

    // ...

    address     owner;
    uint        fortune;
    bool        deceased;

    address payable[]           familyWallets; // list of family wallets
    mapping(address => uint)    inheritance; // map through inheritance

    constructor() payable {
        owner = msg.sender; // msg sender represents address being called
        fortune = msg.value; //msg value tells us how much ether is being sent  
        deceased = false;
    }

    function findName(uint _index) public view returns(string) {
        string memory name = familyList[_index];
        // ...
    }

    // ...
}

 

Memory

메모리는 함수 실행 시점에서만 데이터 저장이 필요할 때 사용되는 영역이다. 블록체인에 직접 데이터 저장할 필요가 없을 때, 예를 들면 함수 실행 로직에만 필요한 변수 선언 등에서 임시로 데이터 선언이 필요할 때, memory 키워드가 붙는다.

 

해당 데이터는 컨트렉트 및 함수 실행이 종료되면 삭제된다. 컨트렉트 배포나 실행에서 블록체인 데이터가 수정(Update)될 때 가스(Gas)가 지불되는데 이 메모리 영역에서 데이터를 사용하면 이러한 가스비 소모를 막을 수 있다.

 

메모리란 함수 내 지역 변수들이 임시로 저장되는 공간이며, 블록체인 네트워크에 저장되지 않는 데이터 영역으로 정의할 수 있다.

 

댓글