본문 바로가기

:D/block chain

[Solidity] Storage vs Memory

 

 

솔리디티에는 변수를 저장할 수 있는 공간으로 Storage vs Memory 두가지가 있다.

Storage 는 블록체인 상에 영구적으로 저장되는 변수를 의미

Memory 는 임시적으로 저장되는 변수로 컨트랙트 함수에 대한 외부 호출들이 일어나는 사이에 지워짐

각각 컴퓨터 하드 디스크(Storage)와 RAM(Memory)과 같음

 

대부분의 경우에는 키워드를 이용할 필요가 없음. 왜냐면 솔리디티가 알아서 처리해주기 때문!

상태 변수(함수 외부에 선언된 변수)는 초기 설정상 storage로 선언되어 블록체인에 영구적으로 저장되는 반면,

함수 내에 선언된 변수memory로 자동 선언되어서 함수 호출이 종료되면 사라짐.

 

 

 

 

그럼 이 키워드 들을 사용하는 경우는 ?

    함수 내의 구조체와 배열을 처리하는 경우!

 

 

 

contract SandwichFactory {
  struct Sandwich {
    string name;
    string status;
  }

  Sandwich[] sandwiches;

  function eatSandwich(uint _index) public {
    // Sandwich mySandwich = sandwiches[_index];

    // ^ 꽤 간단해 보이나, 솔리디티는 여기서 
    // `storage`나 `memory`를 명시적으로 선언해야 한다는 경고 메시지를 발생한다. 
    // 그러므로 `storage` 키워드를 활용하여 다음과 같이 선언해야 한다:
    Sandwich storage mySandwich = sandwiches[_index];
    // ...이 경우, `mySandwich`는 저장된 `sandwiches[_index]`를 가리키는 포인터이다.
    // 그리고 
    mySandwich.status = "Eaten!";
    // ...이 코드는 블록체인 상에서 `sandwiches[_index]`을 영구적으로 변경한다. 

    // 단순히 복사를 하고자 한다면 `memory`를 이용하면 된다: 
    Sandwich memory anotherSandwich = sandwiches[_index + 1];
    // ...이 경우, `anotherSandwich`는 단순히 메모리에 데이터를 복사하는 것이 된다. 
    // 그리고 
    anotherSandwich.status = "Eaten!";
    // ...이 코드는 임시 변수인 `anotherSandwich`를 변경하는 것으로 
    // `sandwiches[_index + 1]`에는 아무런 영향을 끼치지 않는다. 그러나 다음과 같이 코드를 작성할 수 있다: 
    sandwiches[_index + 1] = anotherSandwich;
    // ...이는 임시 변경한 내용을 블록체인 저장소에 저장하고자 하는 경우이다.
  }
}

' :D > block chain' 카테고리의 다른 글

[Solidity] 가스(Gas)  (0) 2022.02.16
[Solidity] 컨트랙트의 불변성  (0) 2022.02.16
[Solidity] 상속  (0) 2022.02.15
[Solidity] Require  (0) 2022.02.15
[Solidity] Msg.sender  (0) 2022.02.15