Виртуальная машина Ethereum (EVM)
Сеть Ethereum существует исключительно для поддержания единой, непрерывной, бесперебойной и неизменной работы государственной машины, которой является блокчейн Ethereum. Это среда, в которой живут все счета, смарт-контракты и данные Ethereum. В каждом конкретном блоке Ethereum имеет одно и только одно глобально принятое «состояние». Виртуальная машина Ethereum (EVM) определяет правила вычисления нового действительного состояния от блока к блоку.
Предварительные условия
Для понимания EVM требуется некоторое базовое понимание байтов, памяти и стека.
Также может быть полезно ознакомиться с некоторыми приемами криптографии, такими как хэш-функции.
Ethereum как государственная машина
Блокчейны, такие как Bitcoin, часто называют «распределенными книгами», которые позволяют существовать децентрализованной валюте, используя фундаментальные инструменты криптографии.
Криптовалюта может вести себя как «обычная» валюта благодаря правилам, которые определяют, что можно и что нельзя делать для изменения этой бухгалтерской книги. Например, адрес биткойна не может потратить больше биткойнов, чем он ранее получил. Эти правила лежат в основе всех транзакций, происходящих в Bitcoin, а также в других блокчейнах.
Хотя Ethereum также имеет свою родную криптовалюту, Эфир, он также позволяет использовать гораздо более мощную функцию, которую мы уже видели, — смарт-контракты. Для этой более сложной функции нам нужна более мощная аналогия, чем просто «распределенная бухгалтерская книга».
Вместо распределенной бухгалтерской книги Ethereum можно описать как распределенную машину состояний. Машина состояний — это, по сути, любая машина, которая может переходить из одного состояния в другое в ответ на определенные входные данные.
Простая машина состояний — это турникет с монетным управлением, обычно встречающийся в метро или на вокзалах, который не пропускает людей, если они не заплатили монетами или не имеют билета.
Начальное состояние турникета — заперто. В запертом состоянии, если вы продолжаете толкать его, он остается запертым. Если вы вставляете монету, он переходит в разблокированное состояние. Если вы продолжаете вставлять монеты, он остается в разблокированном состоянии. Как только вы надавите на разблокированное состояние (и кто-то пройдет через него), оно снова становится заблокированным.
В Ethereum состояние намного сложнее. Оно описывается с помощью большой структуры данных, которая содержит все состояние блокчейна. Конкретные правила того, как состояние может меняться от блока к блоку, определяются EVM.
Переход состояния в Ethereum
На высоком уровне EVM ведет себя подобно математической функции перехода состояния. Учитывая текущее состояние и новый набор допустимых транзакций, она создает новое состояние. Выход детерминирован, что означает, что при одинаковых входных данных он всегда будет производить один и тот же выход.
Y(S, T) = S'
Учитывая старое действительное состояние S
и новый набор действительных транзакций T
, функция перехода состояния Y
производит новое действительное состояние S'
.
Состояние в Ethereum хранится в виде действительно большой структуры данных, называемой триерой Меркла-Патриса. Вам не нужно понимать, как именно она структурирована, но если вы хотите, то можете прочитать приведенную ссылку.
Слой EVM
EVM живет как слой в программном стеке Ethereum.
Узлы Ethereum содержат реализации EVM, а EVM может выполнять на них код EVM. Код EVM — это скомпилированный байткод смарт-контракта, который может быть исполнен.
Генерация кода EVM
Инструкции EVM (OPCODES)
Сам EVM ведет себя как стековая машина с максимальной глубиной стека 1024 элемента. Каждый элемент в стеке представляет собой 256-битное (32 байта) слово.
Во время выполнения EVM поддерживает переходную память в виде массива байтов с адресом 32 байта, которая не сохраняется между транзакциями. Переходная память очищается при выполнении новой транзакции.
Умные контракты, однако, сохраняют свое собственное состояние в блокчейне. Это состояние также моделируется в виде тройки Меркла Патриция. Во время выполнения транзакции его обычно называют хранилищем EVM.
В EVM присутствует логика, позволяющая ему выполнять опкоды EVM, которые выполняют стандартные операции над стеком, такие как XOR
, ADD
, AND
, SUB
, MUL
и т.д. EVM также реализует ряд специфических для блокчейна стековых операций, таких как BALANCE
и BLOCKHASH
.
Когда смарт-контракт компилируется в байткод (представленный в шестнадцатеричном виде), он компилируется в опкоды EVM. Эти опкоды и выполняются на EVM.
Реализации EVM
Все реализации EVM должны придерживаться спецификации, описанной в «Желтой книге Ethereum». За время существования Ethereum EVM претерпел множество изменений, и в настоящее время существует множество реализаций EVM на различных языках программирования.
Все клиенты Ethereum включают в себя реализацию EVM. Помимо них, существует также несколько отдельных реализаций.
Клиенты Ethereum (с EVM)
- Geth | Язык программирования = Go
- OpenEthereum | Язык программирования = Rust
- Nethermind | Язык программирования = C# (.NET)
- Besu | Язык программирования = Java
- Erigon | Язык программирования = Go
Автономные реализации EVM
- Py-EVM | Язык программирования = Python
- evmone | Язык программирования = C++
- ethereumjs-evm | Язык программирования = Javascript
- Enclave EVM | Язык программирования = C++
Ресурсы
Ниже перечислены рекомендуемые, но необязательные материалы для чтения/просмотра, чтобы узнать больше о EVM.
- Ethereum EVM: иллюстрация
- Опкоды EVM
- Желтая газета Ethereum
- Понимание EVM
- Merkle Patricia Trie
Эта статья предоставлена LearnWeb3 DAO. Бесплатная, всеобъемлющая программа обучения по блокчейну от А до Я для разработчиков по всему миру.
Все от «Что такое блокчейн» до «Взлома смарт-контрактов» — и все, что между ними, а также многое другое!
Присоединяйтесь к нам сейчас, чтобы начать строить вместе с 25 000+ разработчиками.
Сайт
Discord
Twitter