Виртуальная машина Ethereum (EVM)
Последнее обновление страницы: 25 февраля 2026 г.
Виртуальная машина Ethereum (EVM) — это децентрализованная виртуальная среда, которая стабильно и безопасно исполняет код на всех узлах Ethereum. Узлы запускают EVM для выполнения смарт-контрактов, используя "газ" для измерения вычислительных усилий, необходимых для операций, обеспечивая эффективное распределение ресурсов и безопасность сети.
Предварительные условия
Для понимания EVM необходимо базовое знакомство с общепринятой терминологией в информатике, такой как байтыopens in a new tab, памятьopens in a new tab и стекopens in a new tab. Также было бы полезно ознакомиться с такими понятиями криптографии и блокчейна, как хеш-функцииopens in a new tab и дерево Мерклаopens in a new tab.
От реестра к машине состояний
Аналогия с «распределенным реестром» часто используется для описания таких блокчейнов, как Биткойн, которые позволяют децентрализовать валюту с использованием фундаментальных инструментов криптографии. Реестр содержит запись о деятельности, которая должна соответствовать набору правил, регулирующих, что кто-то может и не может сделать для изменения реестра. Например, биткойн-адрес не может потратить больше биткойнов, чем получил ранее. Эти правила лежат в основе всех транзакций во многих блокчейнах, включая Биткойн.
Хотя у Ethereum есть собственная криптовалюта (эфир), которая следует почти тем же интуитивно понятным правилам, он также предоставляет гораздо более мощную функцию: смарт-контракты. Для этой более сложной функции требуется более сложная аналогия. Вместо распределенного реестра Ethereum представляет собой распределенную машину состоянийopens in a new tab. Состояние Ethereum — это большая структура данных, в которой хранятся не только все аккаунты и балансы, но и состояние машины, которое может изменяться от блока к блоку в соответствии с заранее определенным набором правил и которое может выполнять произвольный машинный код. Конкретные правила изменения состояния от блока к блоку определяются EVM.
Схема адаптирована из Ethereum EVM illustratedopens in a new tab
Функция перехода состояний Ethereum
EVM ведет себя как математическая функция: при вводе данных производится детерминированный вывод. Поэтому будет полезно более формально описать Ethereum как имеющий функцию перехода состояний:
1Y(S, T)= S'Для старого валидного состояния (S) и нового набора валидных транзакций (T) функция перехода состояний Ethereum Y(S, T) создает новое валидное выходное состояние S'
Состояние
В контексте Ethereum состояние — это огромная структура данных, называемая модифицированным деревом Меркла-Патриции, в которой все аккаунты связаны хешами и сводятся к одному корневому хешу, хранящемуся в блокчейне.
Транзакции
Транзакции — это криптографически подписанные инструкции от аккаунтов. Есть два типа транзакций: те, которые приводят к вызовам сообщений, и те, которые приводят к созданию контракта.
Создание контракта приводит к созданию нового аккаунта контракта, содержащего скомпилированный байт-код смарт-контракта. Всякий раз, когда другая учетная запись выполняет вызов сообщения для этого контракта, она выполняет свой байткод.
Инструкции EVM
EVM выполняется как стековая машинаopens in a new tab с глубиной стека в 1024 элемента. Каждый элемент стека — это 256-битное слово, выбранное для удобства использования в 256-битной криптографии (например, хэши Keccak-256 или подписи secp256k1).
Во время выполнения EVM поддерживает временную память (в виде массива байтов с пословной адресацией), которая не сохраняется между транзакциями.
Временное хранилище
Временное хранилище — это хранилище типа «ключ — значение» для каждой транзакции, доступ к которому осуществляется с помощью опкодов TSTORE и TLOAD. Оно сохраняется во всех внутренних вызовах в рамках одной транзакции, но очищается в конце транзакции. В отличие от памяти, временное хранилище моделируется как часть состояния EVM, а не фрейма исполнения, однако оно не фиксируется в глобальном состоянии. Временное хранилище обеспечивает эффективный с точки зрения расхода газа временный совместный доступ к состоянию между внутренними вызовами во время транзакции.
Хранилище
Контракты содержат дерево Меркла-Патриции хранилища (в виде массива слов с пословной адресацией), связанное с соответствующим аккаунтом и являющееся частью глобального состояния. Это постоянное хранилище отличается от временного хранилища, которое доступно только на время одной транзакции и не является частью дерева постоянного хранилища аккаунта.
Машинный код
Скомпилированный байт-код смарт-контракта исполняется как набор опкодов EVM, которые выполняют стандартные стековые операции, такие как XOR, AND, ADD, SUB и т. д. EVM также реализует ряд специфичных для блокчейна стековых операций, таких как ADDRESS, BALANCE, BLOCKHASH и т. д. Набор опкодов также включает TSTORE и TLOAD, которые предоставляют доступ к временному хранилищу.
Схемы адаптированы из Ethereum EVM illustratedopens in a new tab
Реализации EVM
Все реализации EVM должны соответствовать спецификации, описанной в Желтой книге Ethereum.
За десятилетнюю историю Ethereum EVM претерпела несколько изменений, и существует несколько реализаций EVM на различных языках программирования.
Клиенты исполнения Ethereum включают в себя реализацию EVM. Кроме того, существует несколько автономных реализаций, включая:
- Py-EVMopens in a new tab - Python
- evmoneopens in a new tab - C++
- ethereumjs-vmopens in a new tab - JavaScript
- revmopens in a new tab - Rust
Дополнительные материалы
- Желтая книга Ethereumopens in a new tab
- Jellopaper, также известная как KEVM: семантика EVM в Kopens in a new tab
- Бежевая книгаopens in a new tab
- Опкоды виртуальной машины Ethereumopens in a new tab
- Интерактивный справочник по опкодам виртуальной машины Ethereumopens in a new tab
- Краткое введение в документации Solidityopens in a new tab
- Осваиваем Ethereum — виртуальная машина Ethereumopens in a new tab