[이더리움] EVM

드림보이즈·2023년 9월 14일
0

학습계기

블록체인 개발자 면접 2번 봤는데, 2번 모두 EVM이 뭔지 질문을 받았다.
2번 다 답변했고, 2번 다 반응도 낫배드였다.

그럼에도 아직까지 미스테리한 부분이 듬성듬성있어서, 아예 찢어보려 한다.

Virtual Machine

컴퓨터(시스템) 안에 가상 시스템(컴퓨터)를 올려서 독립적으로 사용할 수 있는 기법.

컴퓨터(시스템)은 CPU, Memory 등 하드웨어가 존재하지만, 얘는 없어서 가상인 것이다.

가상머신을 통해 컴퓨터가 어떤 상태이든 동작하는 시스템을 구현할 수 있다.

Ethereum Virtual Machine

이더리움은 이더 송금 말고도
스마트 컨트랙트 코드를 실행해야 한다. 마치 우리가 사용하는 프로그래밍 언어 코드를 실행하듯.
그것이 EVM의 존재 이유다.
(컨트랙트 코드 실행 뿐 아니라 이더만 송금할 때도, 걍 대부분 EVM이 다 처리한다고 생각하자)

EVM이 동작하는 경우

거의 대부분의 경우 EVM이 동작한다.

1. 스마트 컨트랙트 관련 모든 것(생성, 호출, 컨트랙트 간 통신 등 전부)

2. 트랜잭션 처리 (이더 송금, 컨트랙트도 포함되는거 맞음)

3. 외부 메시지 처리

딱딱 떨어지는 것은 아니지만, 경우의 수를 나누면 디테일한 이해가 편할 것이다.

EVM 구조 & 동작 원리

대부분의 경우

트랜잭션 생성 > 전파 > 검증 > EVM 실행 > 가스 지불 > 완료

순서로 진행된다.
다양한 시나리오를 상상하며 구체적인 동작을 살펴보자.

1. 스마트 컨트랙트 '생성'


솔리디티로 당신이 컨트랙트 코드를 작성했고,
컴파일러로 바이트코드와 ABI를 얻었고, 바이트 코드를 배포한다.
(ABI는 외부에서 연동을 위한 인터페이스일 뿐, 블록체인에 안 올린다.)

트랜잭션 생성

  • 목표 계정 : 송신자
  • 데이터 : 바이트 코드
  • 가스 가격, 가스 한도
  • 서명 : 송신자 개인키 서명

트랜잭션 브로드 캐스트 : 모든 노드에 전파

트랜잭션 검증

  • 서명이 올바른가 ?
  • 충분한 자금을 가지고 있는가?

트랜잭션 실행 (EVM!!!)

  • 목표 계정(주소)를 보고, 컨트랙트 생성인 것을 눈치챔
  • 트랜잭션의 데이터에서 바이트 코드 가져옴
  • 바이트 코드 초기화 (생성자, 상태 변수등 초기 세팅)
  • 스마트 컨트랙트 주소 생성하고 저장
  • 바이트 코드는 상태 데이터베이스에 저장(CA에는 바이트 코드의 해시값이, 바이트 코드는 따로 저장)

순서대로 진행된다.

EVM에서 구체적으로 트랜잭션 실행이 어떻게 일어나는지는 맨 마지막에 종합해서 알아보겠다.

2. 이더 송금

1과 매우 유사하다.

트랜잭션 생성

  • 목표 주소 : 받는 이 주소
  • 이더 양 : value
  • 가스 가격 및 가스 한도
  • 서명 : 개인키 서명

트랜잭션 브로드캐스트 : 모든 노드에 전파

트랜잭션 검증

  • 충분한 잔액 + 서명 확인

트랜잭션 실행 (EVM!!!)

  • 받는 이 주소를 확인 (없다면 취소)
  • 보내는 이 잔액 빼고 받는 이 늘리고
  • 가스 비용 계산해서 보내는 이 잔액에서 차감

트랜잭션 완료

  • 블록체인의 상태가 업데이트됨

3. 특정 컨트랙트의 상태변수를 +1 하는 경우

트랜잭션 생성

  • 목표 계정 : 특정 컨트랙트 주소
  • 데이터 : 상태 변수를 +1 증가시키는 함수 호출
  • 가스 가격, 가스 한도
  • 서명 : 송신자 개인키 서명

트랜잭션 브로드 캐스트

  • 모든 노드에게 전파

트랜잭션 검증

  • 서명이 올바른가 ?
  • 충분한 자금을 가지고 있는가?

트랜잭션 실행 (EVM!!!)

  • 목표 계정(주소)를 보고, 컨트랙트 주소를 확인
  • 해당 컨트랙트의 데이터를 통해 해당 함수 호출
  • 함수가 실행되고, 변수 + 1 증가

가스 소비 및 비용 지불

트랜잭션 완료

  • 상태 업데이트

이제 당신은 EVM이 동작하는 원리를 거의 깨달았다.
마지막으로 EVM 내부 구조를 살펴보고 어떻게 동작하는지 알아보자.

EVM 내부 동작 원리

내부 구조를 살펴보자.
stack, memory 등의 용도는 알 거라고 믿는다.

위에서 살펴봤듯이 대부분의 경우

트랜잭션 생성 > 브로드캐스팅 > 검증 > EVM 실행

의 순서로 진행되는 것을 확인했다.
그렇다면 EVM에서 구체적으로 어떻게 실행이 되는 건지 내부구조와 함께 살펴보자.

시나리오 : 특정 컨트랙트의 상태 변수를 업데이트하는 함수 호출

트랜잭션 검증까지는 했다 치고, EVM이 어떻게 돌아가는지만 자세히 보자.

0. PC(다음 실행할 명령어 위치 가르키는), 메모리, 스택 초기화

1. 트랜잭션의 목표 주소 부분 : EVM이 스마트 컨트랙트 주소 확인

2. 해당 컨트랙트의 상태를 읽어옴 (저장된 상태 변수들 불러옴)

3. 트랜잭션의 데이터 부분 : 해당 함수 호출 확인 (상태변수 +1 하는 함수)

4. 해당 함수의 바이트 코드 실행 (상태변수 변경)

2. 해당 컨트랙트의 상태를 읽어옴 (저장된 상태 변수들 불러옴)

profile
시리즈 클릭하셔서 카테고리 별로 편하게 보세용

1개의 댓글

comment-user-thumbnail
2024년 1월 21일

evm은 컨트랙트를 실행하는 환경이라고 알고 있는데 단순 이더전송 트랜잭션도 처리가 되나요? 저는 안되는 걸로 공부했어서요. 이더 전송 트랜잭션은 컨트랙트 코드가 없고, 노드들에 의해서 기록되는 걸로 이해했습니다. 의견을 듣고싶네요!

답글 달기