EVM (Ethereum Virtual Machine)
EVM
- 스마트 컨트랙트 배포 및 실행을 처리하는 이더리움의 일부
- JVM과 비슷하게 바이트코드로 컴파일된 프로그래밍 언어의 인터프리터와 비슷한 계산 엔진
- 유사 튜링 완전 상태 머신 (넘겨진 가스량에 따라 유한 번의 계산을 수행하기 때문)
EVM의 경우 단일 스레드 머신처럼 동작하는데, 가스량 같은 연산 제한 방식이 없다면 무한 루프의 코드가 실행될 수 있게 되고, 그 경우 전체 이더리움 클라이언트가 무한루프에 빠지게 되면서 (Halting Problem) 이더리움을 사용할 수 없게 된다.
- 스택 기반 아키텍처, 완전한 가상 환경
- 트랜잭션 기반 상태 머신 : 트랜잭션을 통한 스마트 컨트랙트 코드의 실해 결과로 유효한 상태 변화를 이더리움 상태를 업데이트 함
실행 과정
- 트랜잭션이 스마트 컨트랙트 코드를 실행하면, 생성중인 현재 블록 및 처리 중인 특정 트랜잭션과 관련하여 필요한 모든 정보로 EVM이 인스턴스화 된다.
- EVM의 프로그램 코드 ROM에 컨트랙트 계정 코드가 로드된다.
- PC (프로그램 카운터) 0으로 설정된다.
- 스토리지 역시 컨트랙트 계정의 스토리지에서 로드된다. (EOA의 경우 코드와 스토리지가 없다)
- 메모리는 모두 0으로 설정, 모든 블록 및 환경 변수가 설정된다. (가스 공급량 등)
- 코드가 실행되면서 작업의 가스 비용에 따라 가스 공급량이 감소한다.
- 성공적으로 끝나기 전에 공급된 가스량을 모두 소비한 경우 OOG(Out of Gas) 예외가 발생하며 트랜잭션이 중단된다.
- 이더리움 상태는 변경되지 않는다.
- 송금자의 논스는 증가하며, 가스로 보낸 이더량만큼 감소한다.
- 성공적으로 완료된 경우
- 인스턴스화된 EVM에 적용된 변경 사항이 실제 월드 EVM에 업데이트된다.
- 성공적으로 끝나기 전에 공급된 가스량을 모두 소비한 경우 OOG(Out of Gas) 예외가 발생하며 트랜잭션이 중단된다.
- CA -> CA 호출이 일어난 경우 새로운 EVM이 호출한 CA의 EVM 샌드박스 기준으로 인스턴스화 된다. (2의 과정 반복)
트랜잭션이 성공하는 경우 상위 레벨의 EVM에 하위 레벨 EVM이 업데이트 된다고 생각하면 될 듯 하다.
출처
안드레아스 M. 안토노풀로스, 개빈 우드, 마스터링 이더리움, 제이펍, 2019-05-23