Открыть сервис

Виртуальная машина Ethereum

Виртуальная машина Ethereum (EVM, от англ. Ethereum Virtual Machine) — это вычислительная среда, являющаяся ключевым компонентом блокчейна Ethereum, которая обеспечивает исполнение смарт-контрактов и определяет правила изменения состояния сети. EVM представляет собой изолированную, детерминированную и стековую виртуальную машину, работающую на каждом узле (ноде) сети Ethereum. Она позволяет выполнять код на специализированном байт-коде, который компилируется из языков высокого уровня, таких как Solidity и Vyper.

История

Концепция виртуальной машины для блокчейна Ethereum была впервые описана Виталиком Бутериным в 2013 году в первоначальном проекте Ethereum. Идея заключалась в создании «мирового компьютера» — единой децентрализованной платформы, способной выполнять произвольные алгоритмы, а не только простые транзакции с криптовалютой, как в Bitcoin. EVM была реализована как часть протокола Ethereum и запущена вместе с основной сетью (Frontier) 30 июля 2015 года. С момента запуска EVM претерпела несколько обновлений (хардфорков), которые вносили изменения в её работу, например, введение новых опкодов (операционных кодов) или изменение стоимости газа. Ключевым обновлением стало внедрение EIP-1559 в 2021 году, которое изменило механизм расчета комиссий, но не затронуло базовую архитектуру EVM. Переход сети Ethereum с алгоритма консенсуса Proof-of-Work на Proof-of-Stake (The Merge) в сентябре 2022 года не изменил логику работы EVM, так как она осталась независимой от механизма консенсуса.

Архитектура и принципы работы

EVM функционирует как распределенная конечная машина состояний (state machine). Состояние Ethereum — это огромная структура данных, которая хранит информацию о всех счетах (аккаунтах) и их балансах, а также о хранилищах смарт-контрактов. Каждая транзакция, отправленная в сеть, инициирует переход из одного состояния в другое. EVM гарантирует, что этот переход будет выполнен одинаково на всех узлах сети, что обеспечивает консенсус.

Основные компоненты

  • Стек (Stack): EVM использует стековую архитектуру. Все операции выполняются с данными, которые извлекаются и помещаются на стек. Максимальная глубина стека составляет 1024 элемента.
  • Память (Memory): Временная, адресуемая по байтам область памяти, которая существует только во время выполнения конкретной транзакции. Она очищается после завершения вызова. Память используется для хранения временных данных и передачи аргументов между функциями.
  • Хранилище (Storage): Постоянная, адресуемая по ключам (256-битным словам) база данных, привязанная к конкретному смарт-контракту. В отличие от памяти, данные в хранилище сохраняются между вызовами контракта и являются частью глобального состояния блокчейна. Операции записи в хранилище являются самыми дорогими с точки зрения газа.
  • Газ (Gas): Единица измерения вычислительных усилий, необходимых для выполнения операций в EVM. Каждая инструкция (опкод) имеет фиксированную или переменную стоимость газа. Пользователи платят комиссию за газ, чтобы стимулировать валидаторов (майнеров/стейкеров) включать их транзакции в блок. Если газа не хватает, выполнение транзакции отменяется, а все изменения состояния откатываются, но уплаченный газ не возвращается.
  • Счетчики (Program Counter, PC): Указывает на текущую исполняемую инструкцию в байт-коде контракта.
  • Калл-данные (Calldata): Данные, переданные в транзакции или вызове контракта. Они доступны только для чтения и содержат аргументы функции, которую необходимо выполнить.

Процесс выполнения

  1. Пользователь создает транзакцию, которая включает адрес контракта-получателя и данные (calldata), закодированные в соответствии с ABI (Application Binary Interface).
  2. Транзакция распространяется по сети и попадает в пул неподтвержденных транзакций.
  3. Валидатор (или майнер до The Merge) выбирает транзакцию для включения в блок.
  4. На каждом узле сети запускается экземпляр EVM для этой транзакции.
  5. EVM загружает байт-код контракта по указанному адресу.
  6. EVM последовательно выполняет инструкции байт-кода, используя стек, память и хранилище, а также потребляя газ.
  7. Если выполнение успешно, состояние сети обновляется (например, изменяется баланс, записываются данные в хранилище). Если происходит ошибка (например, нехватка газа, переполнение стека, неверный опкод), состояние откатывается к исходному, а газ списывается.

Набор инструкций (Опкоды)

EVM имеет около 140 уникальных опкодов (на момент обновления Shanghai), которые можно разделить на несколько категорий:

  • Арифметические и логические: ADD, SUB, MUL, DIV, AND, OR, XOR, NOT и т.д.
  • Операции со стеком, памятью и хранилищем: PUSH, POP, DUP, SWAP, MLOAD, MSTORE, SLOAD, SSTORE.
  • Операции с данными транзакции и блокчейна: CALLER, ADDRESS, BALANCE, BLOCKHASH, TIMESTAMP, GASLIMIT.
  • Операции перехода (jump): JUMP, JUMPI (условный переход), JUMPDEST (метка для перехода).
  • Операции вызова (call): CALL, STATICCALL, DELEGATECALL, CALLCODE. Эти опкоды позволяют одному контракту вызывать функции другого контракта.
  • Операции завершения: RETURN, REVERT, STOP, SELFDESTRUCT.

Языки программирования для EVM

Написание кода напрямую на байт-коде EVM крайне трудоемко и неудобно. Поэтому разработчики используют языки высокого уровня, которые затем компилируются в байт-код.

  • Solidity: Самый популярный и широко используемый язык. Разработан специально для Ethereum. Имеет синтаксис, похожий на JavaScript, C++ и Java. Поддерживает наследование, библиотеки, сложные пользовательские типы данных.
  • Vyper: Альтернативный язык, ориентированный на простоту, безопасность и аудит. Имеет синтаксис, похожий на Python. В Vyper намеренно отсутствуют некоторые возможности Solidity (например, модификаторы, перегрузка функций, бесконечные циклы), чтобы снизить риск ошибок.
  • Yul: Промежуточный язык низкого уровня, который может быть скомпилирован в байт-код EVM. Используется для оптимизации и написания библиотек.

Применение и значение

EVM является фундаментом для всей экосистемы децентрализованных приложений (dApps) на Ethereum и множества совместимых блокчейнов.

Совместимость с EVM (EVM-compatible)

Успех EVM привел к появлению множества других блокчейнов, которые реализуют совместимую с ней среду выполнения. Это позволяет разработчикам портировать свои dApps с Ethereum на другие сети с минимальными изменениями. К таким блокчейнам относятся: Binance Smart Chain (BSC), Polygon, Avalanche (C-Chain), Fantom, Arbitrum, Optimism, zkSync и многие другие. Совместимость с EVM стала стандартом де-факто для индустрии блокчейнов.

Критика и ограничения

Несмотря на свою важность, EVM имеет ряд недостатков, которые подвергаются критике:

  • Высокая стоимость газа: Выполнение сложных операций, особенно запись в хранилище, требует значительных затрат газа, что делает использование сети дорогим в периоды высокой нагрузки. Это привело к развитию решений второго уровня (Layer 2), таких как Rollups, которые обрабатывают транзакции вне основной сети, а затем публикуют результаты в EVM.
  • Ограниченная производительность: EVM обрабатывает транзакции последовательно, что ограничивает пропускную способность сети (около 15-30 транзакций в секунду). Это значительно меньше, чем у централизованных платежных систем (Visa).
  • Сложность разработки и безопасность: Язык Solidity, несмотря на популярность, имеет ряд особенностей, которые могут приводить к уязвимостям (реентерабельность, переполнение целых чисел). Ошибки в смарт-контрактах могут приводить к потере средств, как это произошло с атакой на DAO в 2016 году.
  • Детерминированность и отсутствие случайности: EVM не имеет встроенного генератора случайных чисел, что усложняет реализацию некоторых игровых и лотерейных механик. Разработчики вынуждены использовать внешние источники случайности (оракулы) или псевдослучайные алгоритмы, которые могут быть предсказаны.

Источники

  • Wood, G. (2014). Ethereum: A secure decentralised generalised transaction ledger (Ethereum Yellow Paper).
  • Buterin, V. (2013). Ethereum Whitepaper: A Next-Generation Smart Contract and Decentralized Application Platform.
  • Antonopoulos, A. M., & Wood, G. (2018). Mastering Ethereum: Building Smart Contracts and DApps. O'Reilly Media.
  • Документация Ethereum Foundation (ethereum.org).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →