본문 바로가기

Blockchain/Solidity

[Solidity] Storage VS Memory

https://www.geeksforgeeks.org/storage-vs-memory-in-solidity/

 

Storage vs Memory in Solidity - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org


  Memory Storage
영구적 vs 일시적 컨트랙트의 사용이 중지되면 데이터를 지워버림(일시적 공간) 함수 호출 사이에 데이터를 보관(영구적 공간)
가스소비량 작음
=> 중간 계산에는 항상 Memory를 사용하고 최종 결과는 Storage에 저장하는 것이 좋음

 

By Default

- structs와 array의 State variables 과 Local Variables는 storage에 저장된다.

- function argument는 memory에 저장된다.

- 'memory' 키워드를 사용하여 배열의 새 인스턴스가 생성될 때마다 해당 변수의 새 복사본이 생성된다. 새 인스턴스의 배열 값을 변경해도 원래 배열에는 영향을 미치지 않는다.(by value)

 

 

myArray라는 array의 키워드를 storage와 memory로 각각 설정한 후에 차이점을 비교해보자.

1. storage

// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

contract HelloGeeks {
    int[] public numbers;
    //state variable => storage에 저장

    event PrintNumbersMyArray(int[] numbers, int[] myArray);

    function Numbers() public {
        numbers.push(1);
        numbers.push(2);

        int[] storage myArray = numbers; //myArray도 storage에 저장. //by reference
        myArray[0] =0;

        emit PrintNumbersMyArray(numbers, myArray);
    } 
}

로그를 살펴보면

"numbers": [
    "0",
    "2"
],
"myArray": [
    "0",
    "2"
]

myArray를 수정하면 numbers도 함께 바뀐다.

storage to storage이기에 copy by reference인 것.

 

 

 

2. memory

// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

contract HelloGeeks {
    int[] public numbers;
    //state variable => storage에 저장

    event PrintNumbersMyArray(int[] numbers, int[] myArray);

    function Numbers() public {
        numbers.push(1);
        numbers.push(2);

        int[] memory myArray = numbers; //myArray는 memory에 저장. //by value
        myArray[0] =0;

        emit PrintNumbersMyArray(numbers, myArray);
    } 
}

로그를 살펴보면

"numbers": [
    "1",
    "2"
],
"myArray": [
    "0",
    "2"
]
}

myArray를 수정해도 원본인 numbers는 바뀌지 않는다.

storage to memory이기에 copy by value인 것.

 

얼마 전에 정리해둔 게 큰 도움이 되었다.

 

https://learning-and-running.tistory.com/121

 

[Solidity] by value VS by reference

크립토 좀비 풀어보다가 헷갈려서 찾아봤다. 파이썬 공부하면서도 나오는 개념이었던 거 같은데.. 맨날 까먹는다..🥲 괜찮다. 까먹을 때마다 와서 보면 된다. A(initial value)로 B를 만든다고 하자.

learning-and-running.tistory.com

 

'Blockchain > Solidity' 카테고리의 다른 글

[Solidity] Using X for Y 문법  (1) 2023.12.27
[Solidity] by value VS by reference  (0) 2023.08.14