No history yet

Архитектура и стек EVM

EVM: стековая машина

Виртуальная машина Ethereum (EVM) — это сердце сети, среда, в которой исполняются все смарт-контракты. В отличие от большинства современных процессоров, использующих регистровую архитектуру, EVM является стековой машиной. Представьте себе стопку тарелок: вы можете добавлять новую тарелку только сверху и брать тоже только верхнюю. Это и есть принцип стека: «последним пришел, первым вышел» (LIFO — Last-In, First-Out). Все операции в EVM, от простого сложения до сложных вычислений, работают с данными, расположенными на вершине этого стека.

EVM — это стековая машина.

Когда EVM нужно выполнить операцию, например, сложить два числа, она не ищет их в ячейках памяти по адресам. Вместо этого она берет два верхних элемента из стека, выполняет операцию и кладет результат обратно на вершину стека. Такой подход упрощает архитектуру самой виртуальной машины, делая ее более предсказуемой и безопасной для децентрализованной среды.

Основные инструкции и исполнение

Взаимодействие со стеком происходит с помощью набора инструкций, называемых опкодами. Каждая инструкция — это простое действие. Главные из них — это PUSH и POP.

PUSH помещает элемент на вершину стека. Существуют разные версии этой команды, от PUSH1 до PUSH32, где число указывает на количество байт (от 1 до 32), которые нужно поместить в стек.

POP удаляет верхний элемент стека. Эта инструкция используется, когда результат операции больше не нужен и его следует убрать, чтобы освободить место.

; Пример простого сложения

PUSH1 0x05  ; Поместить 5 в стек. Стек: [5]
PUSH1 0x0A  ; Поместить 10 в стек. Стек: [10, 5]
ADD         ; Взять 10 и 5, сложить, результат 15 положить в стек. Стек: [15]
POP         ; Удалить 15 из стека. Стек: []

Жизненный цикл исполнения байт-кода начинается, когда транзакция вызывает смарт-контракт. EVM загружает байт-код контракта и начинает его выполнять инструкция за инструкцией. За отслеживание текущей инструкции отвечает Программный счетчик (Program Counter, PC). Это, по сути, указатель, который хранит адрес следующей инструкции в байт-коде. После выполнения каждой инструкции PC автоматически увеличивается, чтобы перейти к следующей, если только текущая инструкция не является командой перехода, такой как JUMP.

Работа с данными в стеке

EVM работает с 256-битными (32-байтными) словами. Такой размер был выбран неслучайно. Он идеально подходит для криптографических операций, которые лежат в основе Ethereum, например, для хеш-функции Keccak-256, которая генерирует 256-битный хеш. Это упрощает работу с адресами, ключами и другими криптографическими данными, так как они умещаются в одно слово EVM.

Однако работа со стеком имеет свои ограничения. Глубина стека в EVM ограничена 1024 элементами. Это сделано для предотвращения атак типа «отказ в обслуживании», когда злоумышленник мог бы бесконечно заполнять стек, расходуя ресурсы сети. Если контракт пытается поместить в стек 1025-й элемент, выполнение транзакции прерывается с ошибкой.

Поскольку операции могут брать аргументы только с вершины стека, для работы с элементами, находящимися глубже, нужны специальные инструкции. Для этого служат DUP и SWAP.

DUP (от duplicate) дублирует элемент стека. Например, DUP1 копирует самый верхний элемент, DUP2 копирует второй сверху элемент и кладет копию наверх.

SWAP меняет местами два элемента в стеке. SWAP1 меняет местами первый и второй элементы, SWAP2 — первый и третий, и так далее.

; Пример использования DUP и SWAP
; Начальный стек: [10, 5, 2]

PUSH1 0x02
PUSH1 0x05
PUSH1 0x0A

; Задача: вычислить (10 + 2) * 10
; Стек: [10, 5, 2]

SWAP2       ; Меняем 10 и 2. Стек: [2, 5, 10]
ADD         ; Складываем 2 и 10. Стек: [12, 5]
DUP2        ; Дублируем 5-й элемент (второй с конца). Стек: [5, 12, 5]
POP         ; Убираем лишний 5-й элемент. Стек: [12, 5]
SWAP1       ; Меняем 12 и 5. Стек: [5, 12]
PUSH1 0x0A  ; Снова добавляем 10. Стек: [10, 5, 12]
SWAP2       ; Меняем 10 и 12. Стек: [12, 5, 10]
DUP1        ; Дублируем 12. Стек: [12, 12, 5, 10]
POP         ; Убираем лишний 12. Стек: [12, 5, 10]
POP         ; Убираем 5. Стек: [12, 10]
MUL         ; Умножаем 12 на 10. Стек: [120]

Этот пример, хотя и несколько искусственный, показывает, как с помощью DUP и SWAP можно манипулировать данными для выполнения сложных вычислений, не выходя за рамки стековой архитектуры. Понимание этих низкоуровневых операций — ключ к оптимизации смарт-контрактов и анализу их безопасности.

Теперь проверим, как вы усвоили ключевые идеи архитектуры EVM.

Quiz Questions 1/5

Какая архитектура используется в Виртуальной машине Ethereum (EVM)?

Quiz Questions 2/5

Какой опкод используется для дублирования второго сверху элемента стека и размещения его копии на вершине?

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