Перейти к основному контенту
Change page

Виртуальная машина Эфириума (EVM)

Виртуальная машина Эфириума (EVM) — это децентрализованная виртуальная среда, которая согласованно и безопасно выполняет код на всех узлах Эфириума. Узлы запускают 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).

От реестра к автомату состояний

Аналогия «распределенного реестра» часто используется для описания блокчейнов, таких как Биткоин, которые обеспечивают работу децентрализованной криптовалюты с использованием фундаментальных инструментов криптографии. Реестр ведет запись активности, которая должна соответствовать набору правил, определяющих, что можно и чего нельзя делать для изменения реестра. Например, адрес Биткоина не может потратить больше биткоинов, чем он получил ранее. Эти правила лежат в основе всех транзакций в Биткоине и многих других блокчейнах.

Хотя у Эфириума есть собственная нативная криптовалюта (эфир), которая следует почти тем же интуитивно понятным правилам, он также обеспечивает гораздо более мощную функцию: смарт-контракты. Для этой более сложной функции требуется более сложная аналогия. Вместо распределенного реестра Эфириум представляет собой распределенный автомат состояний (opens in a new tab). Состояние Эфириума — это большая структура данных, которая содержит не только все аккаунты и балансы, но и состояние машины, которое может меняться от блока к блоку в соответствии с заранее определенным набором правил и которое может выполнять произвольный машинный код. Конкретные правила изменения состояния от блока к блоку определяются EVM.

A diagram showing the make up of the EVM Диаграмма адаптирована из Иллюстрированного руководства по EVM Эфириума (opens in a new tab)

Функция перехода состояния Эфириума

EVM ведет себя как математическая функция: получая входные данные, она выдает детерминированный результат. Поэтому весьма полезно более формально описать Эфириум как имеющий функцию перехода состояния:

Y(S, T)= S'

Получая старое допустимое состояние (S) и новый набор допустимых транзакций (T), функция перехода состояния Эфириума Y(S, T) создает новое допустимое выходное состояние S'

Состояние

В контексте Эфириума состояние — это огромная структура данных, называемая модифицированным префиксным деревом Меркла-Патриции, которая хранит все аккаунты, связанные хешами и сводимые к единому корневому хешу, хранящемуся в блокчейне.

Транзакции

Транзакции — это криптографически подписанные инструкции от аккаунтов. Существует два типа транзакций: те, которые приводят к вызовам сообщений, и те, которые приводят к созданию контрактов.

Создание контракта приводит к созданию нового контрактного аккаунта, содержащего скомпилированный байт-код смарт-контракта. Всякий раз, когда другой аккаунт выполняет вызов сообщения к этому контракту, он выполняет свой байт-код.

Инструкции 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, которые предоставляют доступ к временному хранилищу.

A diagram showing where gas is needed for EVM operations Диаграммы адаптированы из Иллюстрированного руководства по EVM Эфириума (opens in a new tab)

Реализации EVM

Все реализации EVM должны соответствовать спецификации, описанной в желтой книге Эфириума.

За десятилетнюю историю Эфириума EVM претерпела несколько изменений, и существует несколько реализаций EVM на различных языках программирования.

Клиенты исполнения Эфириума включают реализацию EVM. Кроме того, существует множество автономных реализаций, в том числе:

Дополнительная литература

Руководства: Виртуальная машина Эфириума (EVM) / Коды операций в Эфириуме