EVM 동작 정리
내용
컨트랙트 생성
- EOA, 사용자 계정
- CA, 컨트랙트 계정
- 상태값의 storage hash
- evm 코드의 code hash
- EOA가 컨트랙트를 생성한다.
- 바이트 코드가 이더리움 상태 데이터베이스(Level DB)에 저장된다.
- 트랜잭션이 컨트랙트를 호출할 때마다 EVM에 의해 실행된다.
- 컨트랙트 생성 TX 예시
컨트랙트 호출
- tx의 input으로 함수를 실행한다.
- input의 앞 4바이트는 function selector로 컨트랙트의 함수를 나타낸다.
- 컨트랙트 명령어 TX 예시
Bootstrap of EVM in Geth
- ApplyTransaction
- ApplyMessage
- TransactionDb
- Call
- Run
- 호출 깊이 증가 및 복원: 함수 시작시 호출 깊이 증가, 끝나면 복원
- 읽기 전용 모드 설정
- 반환 데이터 초기화
- 코드 실행 여부 결정
- 실행 환경 설정: 메모리, 스택 및 컨텍스트 설정
- 디버깅 모드 처리
- 메인 루프 실행: 컨트랙트 코드를 한 명령어씩 읽어가며 실행 (인터프리터)
- 가스비용 계산
- 메모리 확장
- 명령어 실행
- input data를 읽어온다.
- 앞 4byte는 function selector로 evm의 어떤 함수인지 확인 한다.
- 바이트코드를 opCode로 변환한다.
- opCode단위로 실행한다.
- 컨트랙트 실행 TX 추적 예시
- 오류 및 중단 처리
- 결과 반환
정리
- EVM
- CosmWasm
참고