https://www.geeksforgeeks.org/storage-vs-memory-in-solidity/
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
'Blockchain > Solidity' 카테고리의 다른 글
[Solidity] Using X for Y 문법 (1) | 2023.12.27 |
---|---|
[Solidity] by value VS by reference (0) | 2023.08.14 |