[Solidity] storage, memory, calldata

냐옹·2023년 7월 31일
0

Solidity

목록 보기
3/13
post-thumbnail
데이터 위치기능사용상황기타
Storage블록체인에 영구적으로 데이터를 저장합니다.컨트랙트 상태 변수 저장.가장 느리고 비용이 많이 듭니다.
Memory임시적으로 데이터를 저장합니다.함수 내에서 임시적으로 데이터를 다룰 때 사용.함수 호출이 종료되면 메모리는 사라집니다.
Calldata함수의 입력값을 저장합니다.외부 함수 호출에서 입력 매개변수 저장.오직 읽기만 가능하고, 변경할 수 없습니다.

storage

storage는 블록체인 상에 영구적으로 저장되는 데이터를 다루는 공간입니다. 상태변수(State Variables)는 항상 storage에 저장되며, 이 데이터는 트랜잭션 간에 영구히 유지됩니다. 그렇기 때문에 storage는 가스비가 많이 드는 편입니다.

memory (public, internal)

메모리는 임시적으로 데이터를 저장하는 공간입니다. 함수 호출 도중에 임시로 사용하는 변수는 memory에 저장됩니다. 함수 호출이 끝나면 memory는 사라지므로, memory를 이용하여 데이터를 저장하는 것은 비용이 storage에 비해서 상대적으로 적습니다.

calldata (external)

calldata는 함수의 입력값을 저장하는 읽기 전용 공간입니다. external 함수 호출에서 사용되는 매개변수는 calldata에 저장되며, 이 공간의 데이터는 변경할 수 없습니다. 이것은 이더리움의 가스비용 최적화에 도움이 됩니다.

calldata는 인자들이 읽기 전용인 외부함수의 배열 및 복잡한 타입 (structs, mappings) 대해서만 적용할 수 있다.

왜 memory는 external에서 사용하면 안될까

external 함수는 스마트 컨트랙트 외부에서 호출되는 함수인데, 이러한 함수가 데이터를 받을 때, 이 데이터는 calldata라는 특별한 저장공간에 저장됩니다. 이 calldata는 함수의 매개변수를 저장하는 읽기전용 공간이므로, 이 공간에 있는 데이터는 변경될 수 없습니다.

이에 반해서 memory는 함수 내부에서만 임시적으로 사용되는 저장공간입니다. 그리고 이 공간에 있는 데이터는 변경가능합니다.

근데, 왜 external 함수에서 memory를 사용하지 않느냐가 궁금한데, 바로 가스비 때문입니다. calldata는 memory에 비해서 저장비용이 더 저렴하고, 읽기 전용이기 때문에 데이터의 변경없이 안전하게 함수에 데이터를 전달할 수 있습니다.

정리하면 external 함수에서 memory 대신에 calldata를 사용하는 것은 이더리움의 연산비용 최적화데이터의 안전성을 보장하기 위한 설계원칙 때문입니다.

각각의 데이터 저장공간은 그 용도와 특성에 알맞게 사용되어야하며, 불필요한 가스비는 줄여야 합니다.

0개의 댓글