이더리움 백서 톺아보기 - 7편
코드실행
이더리움 컨트랙트를 구성하는 코드는 “이더리움 버추얼 머신 코드” 또는 “EVM 코드”로 불리는 로우-레벨, 스택 기반의 바이트코드 언어로 작성된다. 이 코드는 연속된 바이트로 구성되어 있고, 각각의 바이트는 연산(operation)을 나타낸다.
- 스택 : last-in-first-out 컨테이너로 여기에 값들을 밀어 넣거나(push) 뺄(pop) 수 있다.
- 메모리 : 무한대로 확장 가능한 바이트 배열
- 컨트랙트의 영속적인(long-term) 저장소(storage) : 키/값 저장소. 계산이 끝나면 리셋되는 스택이나 메모리와는 달리 저장소는 영속적으로 유지된다.
- 이더리움 백서 중 -
이더리움의 가장 큰 특징이 스마트 컨트랙트라고 하였습니다. 탈중앙화된 환경에서 운용할 수 있는 다양한 종류의 프로그램을 실행할 수 있는 것이 스마트 컨트랙트의 특징입니다. 이더리움에서 스마트 컨트랙트를 작성하는 프로그램 언어가 존재하고, 이러한 프로그램 언어로 작성된 프로그램 코드는 컴파일이라는 과정을 거칩니다. 컴파일은 프로그래머가 볼 수 있는 언어를 컴퓨터가 이해할 수 있는 언어로 변환하는 과정을 의미합니다.
이렇게 컴파일된 스마트 컨트랙트 코드를 실행하고 블록체인에 기록을 담당하는 곳이 EVM(Ethereum Virtual Machine)입니다. 이더리움 가상 머신이라고 불리는데 이곳에서 스마트 컨트랙트를 실행하고 블록체인에 기록하게 됩니다. 우리가 일반적으로 사용하는 윈도우 같은 운영체제와 유사하다고 이해할 수 있습니다.
이 EVM은 크게 스택(stack), 메모리(memory), 저장소(storage)로 구성이 됩니다.
스택(stack)이라고 불리는 곳에서 개발자가 작성하여 컴파일한 스마트 컨트랙트의 코드가 실행됩니다. 컴퓨터가 코드를 실행하는 다양한 방식이 존재하는데 그중 하나가 스택을 사용합니다.
메모리(memory)는 우리가 컴퓨터에서 사용하는 메모리와 유사한 개념입니다. 그래픽 사양이 높은 게임을 하려면 많은 양의 메모리를 가지고 있어야 합니다. 게임을 처리하기 위한 큰 용량이 필요하기 때문이죠. 이처럼 EVM에서도 개발자가 작성한 스마트 컨트랙트 코드를 실행하기 위한 임시 공간인 메모리가 필요합니다.
저장소(storage)는 스마트 컨트랙트가 실행이 완료가 된 이후에 블록체인에 기록할 데이터 공간을 의미합니다. 스마트 컨트랙트를 실행하기 위해서 EVM에서 메모리 공간을 활용하지만, 스마트 컨트랙트에서 블록체인에 영구적으로 기록해야 하는 데이터들은 이 저장소(storage)에 기록을 합니다. 즉 이더리움의 블록체인 원장(ledger)에 기록하게 됩니다.
<출처 : https://ethereum.org/en/developers/docs/evm/>
EVM 코드의 공식 실행 모델은 놀랍도록 단순하다. 이더리움 버추얼 머신이 실행되는 동안, 모든 계산 상태는(block_state, transaction, message, code, memory, stack, pc, gas) 튜플(tuple)로 정의될 수 있고, block_state는 모든 어카운트를 포함하는 전역상태(global state)로서 잔고와 저장소(storage)를 포함한다. 반복되는 매 코드 실행 순간의 시작 시 code의 pc(프로그램 카운터)번째 바이트의 현재 명령이 실행되고, (pc가 코드의 길이보다 크면(pc >= len(code)) pc는 0), 각각의 명령은 튜플을 어떻게 변화시킬지 대한 그 자신의 정의를 알고 있다. 예를 들어, ADD는 스택에서 두 개의 아이템을 꺼내(pop) 그 합을 구한 후 다시 스택에 넣고(push) gas를 1 만큼 감소시키고 pc는 1 증가시킨다. SSTORE는 스택에서 두 개의 아이템을 꺼내 이 아이템의 첫 번째 값이 가리키는 컨트랙트 저장소 인덱스에 두 번째 아이템을 넣는다. 이더리움 버추얼 머신 환경을 JIT 컴파일을 통해 최적화하는 많은 방법이 있지만, 기본적인 이더리움은 수백 줄의 코드로 구현될 수 있다.
- 이더리움 백서 중-
이더리움은 하나의 상태(world state)가 트랜잭션 요청으로 지속해서 업데이트된다고 하였습니다. EVM에서 스마트 컨트랙트가 실행될 때 하나의 상태(world state)의 데이터 정의가 block_state, transaction, message, code, memory, stack, pc, gas로 정의되고 block_state는 이더리움에 있는 모든 어카운트를 포함하여 잔고의 내역과 저장소(storage)를 포함하고 있습니다. 이더리움 블록체인에 지금까지 기록된 최신내용의 데이터 값을 가지고 있다고 이해할 수 있습니다.
<출처 : https://ethereum.org/en/developers/docs/transactions/>
위 그림처럼 이더리움 블록체인에 기록된 모든 내용들이 상태로 존재하고, 이 상태를 스마트 컨트랙트가 EVM에서 실행하면 상태값을 변경할 수 있습니다. 이렇게 변경된 최종 상태값이 최신 이더리움 블록체인에 기록됩니다.
정리하기
- 이더리움 스마트 컨트랙트 개발자가 작성한 코드를 EVM(이더리움 가상머신)이 이해할 수 있도록 컴파일한다.
- 컴파일된 파일을 EVM에서 실행하며, 실행 시 스택과 메모리 공간을 활용한다.
- 실행이 완료된 스마트 컨트랙트에서 블록체인에 데이터 변경이 필요한 경우 최종적으로 이더리움 블록체인에 기록된다.