Глубины EVM: Опкоды и Внутреннее Устройство
Архитектура и стек 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.
Какая архитектура используется в Виртуальной машине Ethereum (EVM)?
Какой опкод используется для дублирования второго сверху элемента стека и размещения его копии на вершине?
Понимание этих основ является фундаментом для дальнейшего изучения более сложных тем, таких как оптимизация газа и безопасность смарт-контрактов на низком уровне.