728x90

이 글은 인프런 "솔리디티 깨부수기" 강의를 듣고 정리한 글 입니다. 

 

[지금 무료] 솔리디티 깨부수기 | D_One - 인프런

D_One | 이 강의를 통해서, 스마트 컨트랙 제작을 위한 솔리디티 언어를 배울수 있습니다., 코딩이 처음인 분들도 OK! 처음 배우는 솔리디티, 쉽게 시작해보세요. 강의 주제 📖 [사진] 이 강의에서

www.inflearn.com


Solidity 저장 방법 

solidity 는 storage, memory, calldata ,stack 4개의 저장 영역으로  나뉘어 있다.

 

Storage

 대부분의 함수 밖의 변수들, 함수 자체가 저장되며, 영속적으로 저장이 되어 스마트 컨트롤 배포시 저장된 함수와 변수의 정보들 블록에 들어가게 된다.

블록체인에서 블록에 정보가 들어간다는 것은 영속적인 의미를 가지게 되며, 모든 노드들이 해당 블록을 다운 받아야 하기 때문에 가스 비용이 비싸진다.

 

Memory

스토리지와 반대되는 개념으로 함수 내의 변수값, 함수의 파라미터, 리턴값, 레퍼런스 타입이 주로 저장이 된다. 

그러나, 메모리는 메모리에 저장된 함수가 작동할 때만 유효하기 때문에 storage 처럼 영속적이지 않기 때문에 가스 비용이 비교적 스토리지보다 싸다.

 

Calldata 

주로 external function 의 파라미터에서 사용된다. 함수를 실행할 때 파라메터의 값 자체를 calldata로 받을 수 있으며 값은 변경할 수 없고 읽기만 가능하다. 

 

Stack

EVM (Ethereum Virtual Machine) 에서 stack data를 관리할때 쓰는 영역이다. 해당 영역은 1024Mb로 제한적으로 저장해 사용할 수 있다. 예를 들어, 함수를 실행할 때 로컬 변수와 같은 것들을 잠시 기억할 때 EVM이 사용한다. 

 


Function string

 

string은 기본 데이터 타입이 아니기 때문에 레퍼런스 타입이라고 볼 수 있다. 왜냐면 배열에 의해서 string이 연관되기 때문이다. string을 쓸 때 memory 키워드를 넣어줘야 한다.

// SPDX-License-Identifier  GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract lec7 {
    
    function get_string(string memory _str) public pure returns( string memory){
        return _str;
    }
}

 

 

위의 예제에서 string 옆에 memory 키워드를 넣고, string 리턴값에도 memory를 지정해야한다. 

 

function get_uint(uint256 memory _ui) public pure returns(uint256 memory){
	return _ui;
}

다른 예제로 get_uint 함수에서 메모리로 지정을 했는데, 이런 기본 데이터 타입인 경우 메모리가 디폴트 되기 때문에 따로 지정하지 않아도 된다. 

 

그리고, pure를 사용하는 이유는, 스토리지에 저장된 변수 값을 읽을 필요가 없기 때문에, pure은 파라미터 받은걸 바로 리턴하기 때문에 사용한다.

+ Recent posts