Как работает Ethereum Virtual Machine (EVM)?
Ethereum известен не только как вторая по величине криптовалюта по рыночной капитализации, но и как первый широко принятый программируемый блокчейн. Возможность развертывать смарт-контракты и строить DeFi-протоколы, NFT-маркетплейсы, DAO, игры и другие децентрализованные приложения сделала его фундаментом широкого Web3-ландшафта. В основе этой программируемости лежит Ethereum Virtual Machine (EVM) — виртуальная машина, которая выполняет код смарт-контрактов и определяет, как изменяется состояние сети.
В этом руководстве мы подробно разберём, что такое EVM, как она устроена, из каких компонентов состоит её архитектура, как выполняется байткод, зачем нужен газ, какие бывают аккаунты и состояние, что такое опкоды, почему EVM-совместимость стала стандартом для новых блокчейнов и каким может быть будущее EVM в контексте масштабирования Ethereum.
1. Что такое Ethereum Virtual Machine простыми словами?
Ethereum Virtual Machine — это абстрактная вычислительная машина, которая выполняет код смарт-контрактов в сети Ethereum. Она работает поверх блокчейна и обеспечивает:
- идентичные результаты выполнения на всех узлах сети;
- изоляцию и безопасность при выполнении смарт-контрактов;
- управление состоянием всех аккаунтов и контрактов;
- ограничение ресурсов через механизм газа.
Проще говоря, EVM часто называют глобальным децентрализованным компьютером. Каждый узел Ethereum запускает собственный локальный экземпляр EVM, который выполняет одни и те же инструкции и тем самым синхронно поддерживает одинаковое состояние блокчейна.
2. Основные функции EVM
EVM выполняет несколько ключевых функций, без которых Ethereum не работал бы так, как сегодня:
- Выполнение смарт-контрактов. Весь код на Solidity, Vyper и других языках компилируется в байткод, который исполняет EVM.
- Переходы состояния. Каждая транзакция — это переход от одного глобального состояния сети к другому; EVM гарантирует корректность этого перехода.
- Управление аккаунтами. Поддерживаются пользовательские и контрактные аккаунты, их ETH-балансы, nonce, код и хранилище.
- Учёт газа. EVM рассчитывает, сколько вычислительных ресурсов потребляет каждая операция, и применяет лимиты.
- Детерминированное выполнение. Одна и та же транзакция должна давать точно такой же результат на всех узлах.
3. Архитектура EVM: основные компоненты
EVM — стековая виртуальная машина, которая ведёт себя похожим образом на простой процессор. Она оперирует несколькими ключевыми структурами данных и абстракциями.
3.1. Аккаунты в EVM
В Ethereum существует два типа аккаунтов:
| Тип аккаунта | Описание | Ключевые характеристики |
|---|---|---|
| EOA (Externally Owned Account) | Аккаунт, которым управляет приватный ключ пользователя. | Имеет баланс ETH и nonce, но не имеет кода. Транзакции могут инициироваться только от EOA. |
| Contract Account | Аккаунт смарт-контракта, в котором хранится код и постоянное хранилище. | Не имеет приватного ключа и не может «подписывать» транзакции сам по себе. Активируется вызовами от других контрактов или EOA. |
3.2. Стек
Стек — основная структура данных, используемая EVM. Это структура типа LIFO (last in, first out — «последним пришёл, первым вышел»), в которой может находиться до 1024 элементов. Все арифметические, логические и многие другие операции работают через стек: инструкции считывают операнды из стека и помещают результат обратно.
3.3. Память
Память (memory) — это временное линейное, побайтно адресуемое пространство, доступное в рамках транзакции или вызова контракта. После завершения вызова память очищается. Стоимость использования памяти растёт по мере увеличения её объёма.
3.4. Хранилище
Хранилище (storage) — постоянная память контракта. Данные в хранилище сохраняются в блокчейне (пока существует цепь), поэтому любые операции SSTORE относятся к числу самых дорогих по газу. Хранилище организовано как хранилище ключ–значение с 256-битными словами.
3.5. Байткод и опкоды
Смарт-контракты обычно пишут на языках высокого уровня, таких как Solidity. Затем они компилируются в байткод — последовательность инструкций, состоящих из опкодов (operation codes, коды операций). Именно эти опкоды и исполняет EVM.
Примеры опкодов:
ADD,MUL,SUB— арифметические операции;AND,OR,NOT— логические операции;SLOAD,SSTORE— доступ к хранилищу;CALL,DELEGATECALL— вызовы других контрактов;JUMP,JUMPI— изменение потока управления;LOG1–LOG4— генерация событий (логов).
4. Механизм газа: как EVM ограничивает ресурсы
Как и любой вычислительной системе, Ethereum нужен механизм защиты от злоупотребления ресурсами. В централизованных системах это контролируют администраторы или лимиты серверов. В децентрализованном Ethereum это реализуется через механизм газа.
Газ — это единица измерения объёма вычислительной работы, которую выполняет EVM. Каждая инструкция имеет свою стоимость в газе. Например, простое сложение может стоить несколько единиц газа, тогда как запись в хранилище — тысячи.
| Операция | Пример опкода | Типичная стоимость (газ, примерно) |
|---|---|---|
| Арифметика | ADD, MUL |
3–5 |
| Чтение из хранилища | SLOAD |
800 |
| Запись в новый слот хранилища | SSTORE |
20 000 |
| Вызов контракта | CALL |
700 + переменная часть |
Стоимость транзакции в ETH определяется формулой:
Стоимость транзакции = Gas Used × Gas Price
Пользователь задаёт лимит газа (максимум газа) и цену газа (или максимальную комиссию), а сеть определяет, сколько газа было фактически израсходовано. Если газ заканчивается до того, как контракт завершит выполнение, транзакция ревертится, а изменения состояния откатываются (кроме уже израсходованного газа). Неиспользованный газ (в пределах лимита) возвращается пользователю в соответствии с текущей моделью комиссий.
5. Как EVM выполняет смарт-контракт: пошаговый пример
5.1. Шаг 1: Создание и подпись транзакции
Пользователь (EOA) формирует транзакцию: указывает адрес вызываемого контракта, данные вызова (закодированный селектор функции + аргументы), лимит газа, максимальную комиссию и т. д. Затем транзакция подписывается приватным ключом пользователя.
5.2. Шаг 2: Попадание в мемпул
После подписания транзакция отправляется в сеть и попадает в мемпул — набор всех неподтверждённых транзакций, ожидающих включения в блок. Валидаторы выбирают транзакции с наиболее привлекательными комиссиями.
5.3. Шаг 3: Обработка транзакции валидатором
Когда валидатор (в эпоху Proof of Stake) формирует блок, он последовательно выполняет транзакции в EVM. Для каждой транзакции:
- проверяется подпись и структура транзакции;
- проверяется, достаточно ли у аккаунта средств для оплаты газа;
- проверяется и увеличивается nonce отправителя;
- байткод контракта загружается в EVM.
5.4. Шаг 4: Выполнение байткода
EVM начинает выполнять опкоды контракта. Каждая инструкция:
- читаёт и/или записывает данные в стек, память или хранилище;
- обновляет внутреннее состояние виртуальной машины;
- уменьшает оставшийся баланс газа.
Если в ходе выполнения происходит ошибка или заканчивается газ, транзакция считается неуспешной, и все изменения состояния (кроме затраченного газа) откатываются.
5.5. Шаг 5: Обновление глобального состояния
После успешного выполнения контракта EVM формирует новое состояние:
- обновляются балансы аккаунтов;
- изменяется хранилище контрактов;
- генерируются логи (события), доступные через RPC и индексаторы;
- обновляется корень состояния (state root) блока.
Новый блок с обновлённым состоянием распространяется по сети. Другие узлы переисполняют те же транзакции и должны получить в точности тот же результат. Если какой-то узел получает отличающееся состояние, он отклоняет такой блок.
6. Модель состояния Ethereum и роль EVM
Состояние Ethereum представлено набором аккаунтов и связями между ними. Внутренне оно хранится в виде древовидных структур (Merkle Patricia Trie), которые позволяют эффективно проверять целостность данных и дают криптографический «отпечаток» состояния.
EVM выступает в роли машины состояний: на вход подаётся предыдущее состояние и набор транзакций, а на выходе получается новое состояние. Этот процесс строго детерминирован: нет случайных элементов, которые могли бы изменить результат выполнения.
7. Языки программирования и EVM: Solidity, Vyper и другие
Хотя сама EVM понимает только байткод, разработчики почти никогда не пишут контракты напрямую в виде опкодов. Вместо этого используют языки высокого уровня, которые компилируются в байткод EVM.
- Solidity — самый популярный язык для Ethereum, синтаксисом напоминает JavaScript/TypeScript.
- Vyper — более минималистичный язык с синтаксисом в стиле Python и фокусом на простоте и безопасности.
- Yul — низкоуровневый промежуточный язык, ближе к сырому байткоду EVM.
Процесс выглядит так: разработчик пишет контракт на Solidity → компилятор (например, solc) переводит код в байткод → при развёртывании этот байткод сохраняется в аккаунте контракта → при каждом вызове EVM считывает этот байткод и выполняет его.
8. Преимущества EVM как вычислительной модели
Ethereum Virtual Machine обладает рядом важных преимуществ, благодаря которым она стала де-факто стандартом:
- Универсальность. EVM — тьюринг-полная машина: теоретически на ней можно реализовать любую логику.
- Децентрализация. Одинаковая логика выполняется на тысячах узлов без центрального контроллера.
- Безопасность. Изоляция выполнения, лимиты газа и прозрачная модель состояния.
- Кросс-чейн совместимость. Многие блокчейны реализовали поддержку EVM, что позволяет запускать одни и те же контракты в разных сетях.
- Огромная экосистема. Инструменты, библиотеки, фреймворки и огромное количество проверенных боем контрактов.
9. Ограничения и недостатки EVM
У EVM есть и слабые стороны, о которых разработчикам важно помнить:
- Ограниченная пропускная способность. Каждый узел должен переисполнять один и тот же код, поэтому сложные вычисления стоят дорого.
- Дорогая постоянная память. On-chain-хранилище очень дорогое, поэтому разработчики вынуждены оптимизировать каждый байт.
- Риск ошибок в контрактах. Смарт-контракты на практике неизменяемы: одна ошибка может стоить миллионов.
- Изоляция от внешнего мира. Контракты не могут напрямую вызывать HTTP-API или базы данных — им нужны оракулы.
10. EVM-совместимые блокчейны
Популярность EVM привела к тому, что другие блокчейны реализовали совместимость с ней, чтобы привлечь существующих Ethereum-разработчиков и проекты. Это позволяет командам развёртывать одни и те же смарт-контракты с минимальными изменениями или вовсе без них.
Наиболее известные EVM-совместимые сети:
- BNB Chain;
- Polygon (PoS-цепь);
- Avalanche C-Chain;
- Fantom;
- Arbitrum, Optimism (L2-решения для Ethereum);
- Gnosis Chain и другие.
EVM-совместимость фактически стала «золотым стандартом» для новых цепочек, потому что разработчикам не нужно изучать новые языки и инструменты — достаточно знать Solidity и стандартный стэк Ethereum.
11. Безопасность смарт-контрактов и роль EVM
Хотя EVM обеспечивает детерминированное выполнение и лимиты ресурсов, безопасность смарт-контрактов во многом зависит от разработчика. EVM не «понимает», соответствует ли логика контракта задуманной экономической модели: она просто исполняет байткод.
Типичные уязвимости смарт-контрактов:
- Reentrancy-атаки (повторный вход в ту же функцию до завершения предыдущего вызова);
- Переполнение/недополнение целых чисел (в старых версиях Solidity без встроенных проверок);
- Неверный контроль доступа (отсутствие
onlyOwner, скрытые бэкдоры); - Манипуляция оракулом (подмена или эксплуатация источников данных/цен);
- Ошибки бизнес-логики (неверные формулы, неправильный порядок операций и т. д.).
Чтобы снизить риски, команды используют аудиты смарт-контрактов, формальную верификацию, стандартные библиотеки (например, OpenZeppelin), а также надёжные паттерны и лучшие практики разработки.
12. Будущее EVM: масштабирование и эволюция
Ethereum активно движется в сторону масштабирования и повышения эффективности. Это напрямую влияет на роль EVM.
12.1. L2-решения и роллапы
Всё больше вычислений переносится на Layer 2-решения (Arbitrum, Optimism, zkSync, Scroll и др.), многие из которых сохраняют совместимость с EVM или даже реализуют zkEVM — доказуемо корректное выполнение EVM с помощью технологий нулевого разглашения.
12.2. eWASM и возможная замена EVM
В течение нескольких лет в сообществе Ethereum обсуждается возможный переход от EVM к eWASM (Ethereum-варианту WebAssembly), который потенциально может:
- быть быстрее и эффективнее;
- поддерживать значительно больше языков программирования;
- обеспечивать более гибкую модель исполнения.
Однако у EVM настолько большая экосистема, что полная и быстрая миграция маловероятна. Более реалистичны постепенная интеграция и гибридные модели.
13. Заключение
Ethereum Virtual Machine — это фундамент, на котором построена современная экосистема Ethereum, а также значительная часть мультичейн-ландшафта Web3. Она определяет, как выполняются смарт-контракты, как меняется состояние сети, как учитываются ресурсы и как обеспечивается детерминированное и безопасное выполнение.
Понимание принципов работы EVM критически важно для разработчиков смарт-контрактов, архитекторов DeFi-протоколов, аудиторов безопасности и всех, кто серьёзно работает с Ethereum или EVM-совместимыми цепочками. Знание стека, памяти, хранилища, газа, транзакций, типов аккаунтов и модели состояния позволяет писать более эффективный, безопасный и оптимизированный по газу код.
В ближайшие годы роль EVM вряд ли уменьшится. Напротив, благодаря роллапам, zkEVM-решениям и L2-инфраструктуре она может стать ещё более центральным элементом как общего стандарта для многих блокчейн-сетей, которые вместе формируют единую программируемую глобальную экономику.

