동아리, 스터디, 교육/블록체인

[20.08.10] 6주차 블록체인 - EVM storage에는 변수가 어떻게 저장될까?

pxatd 2020. 8. 11. 14:41
728x90

저는 이번 교제 258페이지에 내부호출이 가능한 public함수의 매개변수가 모두 메모리로 저장된다는 부분을 보고 어떻게 저장되는지 궁금하여 간단한 실습과 함께 이번 내용을 준비해보았습니다.


EVM Storage에는 약 2256에 해당하는 메모리 슬롯이 존재합니다. 이는 약 1077제곱에 해당한다고 합니다. 슬롯의 갯수는 ⁵⁶개 이기 때문에, uint256에서 허용하는 범위는 0 ~ 2²⁵⁶-1 까지 허용됩니다. 때문에 우리는 배열에 접근하는 코드에서 다음과 같은 안전장치를 해두어야 합니다. 슬롯 하나의 크기는 256 비트 = 32 바이트입니다.

먼저 EVM의 구조를 간단하게 살펴보면,

EVM Stack 256비트 크기의 1024개의 스택으로 이루어져 있습니다.

EVM Memory 함수를 호출하거나 메모리 연산을 수행할 때 임시로 사용됩니다. 이더리움에서 메시지 호출이 발생할 때마다, 깨끗하게 초기화된 메모리 영역이 컨트랙트에 제공됩니다.

EVM Call Data 트랜잭션을 요청했을 때, 전송되는 데이터 들이 기록됩니다.

 

EVM의 구조도 알아보았으니 사용자가 스마트 컨트랙트에서 변수를 할당할 때 마다 변수가 어떻게 기록되는지 알아봅시다.

저는 관련 블로그를 보고 코드를 따라 작성했으며, 실험환경은 tectrpc,web3입니다. 이것을 remix에 작성한 후 콘솔 창으로 데이터 값을 확인했습니다.

 

web3.eth.getStorageAt('Paste your CA Address', 0, (err, res) => console.log(res))

배포된 StorageTest(스토리지 테스트의) CA주소를 복사한 후 getStorageAt 함수를 이용하여 데이터를 조회하였고, 그 결과입니다. 위 명령어에서 0은 슬롯의 index Number을 뜻합니다.

slot 0

슬롯 하나의 크기가 32byte 이기 때문에, 솔리디티는 최적화를 통해 a, b, c를 한 슬롯안에 저장한다.

때문에 c(2) = 02, b(true) = 01, a(1) = 1이 뒤에서부터 위치 push된다.

slot 1

구조체는 Storage 영역에 저장되지 않기 때문에 기록 되지않고, 그다음 배열 e가 저장됐다.

slot 2

256바이트에 해당하는 주소는 하나의 슬롯을 차지한다.

slot 3

256바이트로 선언한 변수 g는 슬론 3을 통째로 차지한다. 10진수 12316진수 7b에 해당한다.

slot 4

변수g가 한칸을 차지했기 때문에 그 다음에 선언된 변수 h (16진수 04)는 슬롯 4에 저장된다.

slot 5

0x00이 나왔다는 뜻은 슬롯에 아무것도 저장이 되지 않았다는 뜻이다.

 

이러한 규칙으로 함수의 변수가 EVM 스토리지에 저장됨을 알 수 있습니다.

 

 

앞에서 설명한 것을 바탕으로 솔리디티 코드에 슬롯 주석을 달면 다음과 같습니다.

 

개발자로서 가장 중요한 것은 저장공간을 최적화하여 코드를 작성하는 것입니다. 그러려면 스토리지 변수와 구조를 잘알아야 하는데, 예를들어 변수를 unsignedint 128,128,256 순으로 작성하면 슬롯 2개를 차지하고, unsignedint 128 256 128 순으로 작성하면 슬롯 3개를 차지하게 욉니다. 많은 슬롯을 차지할수록 더 많은 가스를 요구하기 때문에 항상 이를 염두하면서 코드를 작성해야합니다.

오늘 제가 공부한 것을 통해 슬리디티 언어에서 데이터가 어떻게 저장되는지를 간단하게 알 수 있었으며, 솔리디티 개발자가 지향해야 할 자세도 알 수 있었습니다.

 

참고:
https://medium.com/@heuristicwave/evm-storage%EC%97%90%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%B3%80%EC%88%98%EA%B0%80-%EC%A0%80%EC%9E%A5%EB%90%A0%EA%B9%8C-%EC%A0%80%EC%88%98%EC%A4%80%EC%97%90%EC%84%9C-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-storage-%EC%98%81%EC%97%AD-71dc3a6da8e2

728x90