﻿---
title: "이더리움 가상 머신(EVM)"
description: "포크별 EVM 트랜잭션, 메시지 호출 프레임, 바이트코드, 스택, 메모리, 스토리지, 가스, REVERT, DELEGATECALL, 프리컴파일, 영수증 및 상태 대조를 설명합니다."
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 이더리움 가상 머신(EVM)

> 교육 목적으로만 제공되며 투자 또는 보안 자문이 아닙니다. EVM 동작은 정확한 체인, 포크, 상태, 바이트코드, 호출 맥락, 가스 체계, 클라이언트 및 프로토콜 업그레이드에 따라 달라집니다.

<a id="answer"></a>

## 핵심 답변

이더리움 가상 머신은 특정 포크 규칙에 따라 바이트코드를 해석하는 실행 계층의 상태 전이 머신입니다. 동일한 유효 사전 상태, 최상위 트랜잭션 또는 메시지, 블록 환경과 포크 사양이 주어지면 사양을 준수하는 실행 클라이언트는 동일한 사후 상태 또는 실패 결과를 계산해야 합니다. EVM은 트랜잭션 순서를 정하거나 합의 완결성을 제공하지 않으며, 프런트엔드를 인증하거나 모든 EVM 호환 체인을 이더리움만큼 안전하게 만들지도 않습니다.

외부에서 서명된 트랜잭션은 최상위 프로토콜 객체입니다. 컨트랙트 사이의 활동은 중첩된 메시지 호출과 호출 프레임으로 이루어지며, 각각 별도의 트랜잭션 nonce, 영수증 또는 해시를 가진 독립 트랜잭션이 아닙니다. 각 프레임은 코드, 프로그램 카운터, 256비트 스택, 메모리, 호출 데이터, 반환 데이터, 가스와 실행 맥락을 가집니다. 영구 스토리지는 계정에 속하고 임시 스토리지는 해당 포크 규칙에 따라 한 트랜잭션 동안만 유지됩니다.

<a id="mechanism"></a>

## 작동 방식

1. 실행 스냅숏을 고정합니다. 체인과 `chainId`, 네트워크, 블록 번호와 해시, 정규 또는 확정 상태, 포크, 실행 클라이언트와 사양 개정판, 사전 상태 또는 상태 루트, 트랜잭션 유형, 서명된 원시 바이트, 트랜잭션 해시와 영수증을 기록합니다. 결정성은 이 정확한 맥락을 전제로 합니다.
2. 트랜잭션 봉투를 해독하고 실행 전 유효성과 실행 결과를 분리합니다. 서명과 발신자, nonce, 목적지 또는 컨트랙트 생성, 가치, 호출 데이터, 가스 한도, 수수료 필드, 접근 목록과 유형별 필드를 검증합니다. 블록 포함 전에 거부된 트랜잭션은 포함된 뒤 실행되어 되돌려진 트랜잭션이 아닙니다.
3. 최상위 메시지와 전체 호출 트리를 구성합니다. `CALL`, `STATICCALL`, `DELEGATECALL`, 컨트랙트 생성과 프리컴파일 프레임별로 호출자, 맥락 주소, 코드 주소, `msg.sender`, `msg.value`, 가치 이전, 호출 데이터, 반환 데이터, 전달 가스와 성공 플래그를 기록합니다. 탐색기의 내부 트랜잭션 표시는 추적 보기이지 서명된 트랜잭션이 아닙니다.
4. 각 프레임의 프로그램 카운터, 스택, 메모리, 호출 데이터, 반환 데이터, 로그, 영구 스토리지 및 임시 스토리지 장부를 추적합니다. `CALL`은 피호출자의 주소와 스토리지 맥락을 사용합니다. `DELEGATECALL`은 호출자의 주소와 스토리지 맥락에서 대상 코드를 실행하면서 상위 발신자와 가치를 유지합니다. `STATICCALL`은 상태 변경을 금지합니다.
5. 대상 포크의 가스 규칙을 적용합니다. 고유 가스, 옵코드 동적 비용, 메모리 확장, 콜드 및 웜 접근, 호출 전달, stipend, 프리컴파일 비용, 환급과 환급 상한을 계산합니다. 그런 다음 사용 가스와 유효 가스 가격으로 트랜잭션 수수료를 가치 이전과 별도로 계산합니다. 가스 추정치는 조건부이며 보장이 아닙니다.
6. 프레임 결과를 범위별로 확정합니다. 상위 프레임이 최종 커밋되면 `RETURN`은 현재 프레임을 커밋합니다. `REVERT`는 현재 프레임과 하위 프레임을 되돌리고 데이터를 반환하며, 현재 프레임의 남은 가스를 반드시 모두 소모하지는 않습니다. 예외 중단은 다릅니다. 부모는 실패한 저수준 호출을 포착하고 계속할 수 있으므로 자식 호출이 실패해도 최상위 영수증 상태는 `1`일 수 있습니다. 블록에 포함된 최상위 실행이 실패해도 발신자의 nonce와 실제 지불한 가스는 소모됩니다.
7. 영수증 상태, 사용 가스, 로그, 생성 주소와 반환 데이터를 사전·사후 상태의 잔액, nonce, 코드, 영구·임시 스토리지, 토큰 장부, 실행 추적과 블록 상태 루트에 맞춰 대조합니다. 필요하면 독립 클라이언트로 재실행하고, 프록시 구현, 스토리지 배치, 프리컴파일, 컴파일러 EVM 대상과 포크 업그레이드를 합의 완결성과 별도로 감사합니다.

<a id="example"></a>

## 계산 예시

- **블록에 포함된 최상위 되돌리기와 수수료 장부.** 유형 2 트랜잭션의 가스 한도가 `80,000`, 사용 가스가 `52,000`, 기본 수수료가 `20 gwei`, 최대 우선 수수료가 `3 gwei`, 최대 수수료가 `40 gwei`라고 합시다. 유효 가스 가격은 `min(40, 20 + 3) = 23 gwei`이고 실제 수수료는 `52,000 * 23 gwei = 0.001196 ETH`입니다. 이 중 `52,000 * 20 gwei = 0.001040 ETH`가 소각되고 우선 수수료는 `52,000 * 3 gwei = 0.000156 ETH`입니다. 사용하지 않은 `28,000 gas`에는 요금이 부과되지 않습니다. 최상위 실행이 되돌려지면 스토리지, 가치 이전과 로그 효과는 취소되지만 발신자 nonce와 실제 수수료는 남습니다.
- **포착된 자식 호출 실패.** 컨트랙트 A의 시작값이 `A.x = 5`라고 합시다. A가 B를 호출하고 B는 `B.y = 9`를 기록하고 로그를 낸 뒤 `REVERT`를 실행합니다. B의 기록과 로그는 되돌려집니다. A는 `success = false`를 확인하고 `A.x = 7`을 기록한 뒤 정상 반환합니다. 최종 영수증 상태는 `1`, `A.x = 7`이고 B는 이전 값을 유지합니다. 따라서 최상위 성공은 모든 자식 호출이 성공했다는 증거가 아닙니다.
- **DELEGATECALL 스토리지 맥락.** 프록시는 `slot0 = 5`, 구현 계정은 `slot0 = 99`라고 합시다. 구현 코드는 슬롯 0을 읽고 `7`을 더해 저장합니다. `DELEGATECALL`을 통해 실행하면 프록시는 `slot0 = 12`로 바뀌고 구현 계정은 `slot0 = 99`로 유지됩니다. 프록시 주소와 스토리지 맥락이 적용되고 상위 발신자와 가치는 유지됩니다. 호환되지 않는 스토리지 배치는 프록시 상태를 훼손할 수 있습니다.
- **포크에 따른 SELFDESTRUCT.** EIP-6780 규칙에서 `2 ETH`를 보유한 기존 컨트랙트가 수익자 B에게 `SELFDESTRUCT`를 실행한다고 합시다. B는 `2 ETH`를 받고 컨트랙트 잔액은 0이 되지만 기존 계정, 코드와 스토리지는 삭제되지 않습니다. 삭제 동작은 컨트랙트가 같은 트랜잭션에서 생성된 뒤 자가 파괴될 때만 남습니다. 이는 포크별 동작이며 과거 또는 모든 EVM 체인으로 확대할 수 없습니다.

<a id="risks"></a>

## 위험

- 잘못된 체인, 블록, 포크, 클라이언트 또는 사전 상태에서 재실행하는 위험.
- 비정규 또는 체인 재편으로 대체된 상태를 최종 실행 맥락으로 간주하는 위험.
- 사전 검증 거부와 블록 포함 후 실행 되돌리기를 혼동하는 위험.
- 대기 중 시뮬레이션이 이후 포함 상태와 일치한다고 가정하는 위험.
- 최상위 되돌리기, 예외 중단 또는 가스 부족을 놓치는 위험.
- 부모가 포착한 자식 호출 실패를 놓치는 위험.
- 호출 맥락, 코드 주소, 호출자, 발신자 또는 가치를 잘못 읽는 위험.
- `DELEGATECALL` 스토리지 배치 불일치로 프록시 상태를 훼손하는 위험.
- 재진입 또는 안전하지 않은 외부 가치·제어 이전을 허용하는 위험.
- 검증하지 않은 반환 데이터, 성공 플래그 또는 사용자 정의 오류를 신뢰하는 위험.
- 로그나 실행 추적을 권위 있는 최종 상태로 간주하는 위험.
- 콜드·웜 접근, 메모리 또는 호출 전달 가스를 잘못 계산하는 위험.
- 환급, 환급 상한, stipend 또는 `63/64` 규칙을 잘못 적용하는 위험.
- 잘못된 프리컴파일 주소, 입력, 가스 규칙 또는 포크 의미를 사용하는 위험.
- 영구 스토리지, 메모리와 임시 스토리지 수명을 혼동하는 위험.
- `STATICCALL` 안에서 상태 변경이 성공하리라 예상하는 위험.
- EIP-6780 이전의 `SELFDESTRUCT` 삭제 가정을 적용하는 위험.
- 프록시 구현, 관리자 또는 컴파일러 대상 변경을 놓치는 위험.
- 규칙이 다른 실행 클라이언트나 업그레이드하지 않은 클라이언트를 운용하는 위험.
- EVM 호환성에서 합의, 브리지, 토큰, 거버넌스 또는 완결성 보안을 추론하는 위험.

<a id="misconceptions"></a>

## 흔한 오해

- Solidity 소스 코드가 온체인에서 직접 실행되는 객체다.
- 포함된 트랜잭션이 되돌려지면 비용이 들지 않고 nonce도 바뀌지 않는다.
- 영수증 상태 `1`은 모든 내부 호출이 의도대로 성공했다는 증거다.
- 이벤트나 실행 추적이 권위 있는 자산 및 스토리지 상태다.
- EVM 호환성은 옵코드, 가스, 프리컴파일, 합의와 보안이 동일함을 보장한다.

<a id="related"></a>

## 관련 주제

- [계정 기반 모델](/ko/crypto/account-based-model/)
- [가스 수수료](/ko/crypto/gas-fee/)
- [스마트 컨트랙트](/ko/crypto/smart-contract/)

<a id="sources"></a>

## 출처

- [Ethereum Virtual Machine (EVM)](https://ethereum.org/developers/docs/evm/) - Ethereum.org(확인일: 2026-08-12)
- [Ethereum Yellow Paper: a formal specification of Ethereum, a programmable blockchain](https://ethereum.github.io/yellowpaper/paper.pdf) - Ethereum Foundation(확인일: 2026-08-12)
- [Ethereum Execution Layer Specification](https://ethereum.github.io/execution-specs/) - Ethereum Execution Specs(확인일: 2026-08-12)
- [Introduction to Smart Contracts](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html) - Solidity Documentation(확인일: 2026-08-12)
- [EIP-7: DELEGATECALL](https://eips.ethereum.org/EIPS/eip-7) - Ethereum Improvement Proposals(확인일: 2026-08-12)
- [EIP-140: REVERT instruction](https://eips.ethereum.org/EIPS/eip-140) - Ethereum Improvement Proposals(확인일: 2026-08-12)
- [EIP-2929: Gas cost increases for state access opcodes](https://eips.ethereum.org/EIPS/eip-2929) - Ethereum Improvement Proposals(확인일: 2026-08-12)
- [EIP-6780: SELFDESTRUCT only in same transaction](https://eips.ethereum.org/EIPS/eip-6780) - Ethereum Improvement Proposals(확인일: 2026-08-12)

Source: https://wiki.fcontext.com/ko/crypto/evm/index.mdx
