Виртуальная машина Эфириума (EVM) обеспечивает выполнения смарт-контрактов в сети Ethereum. Во многом именно благодаря этому решению эфир и его блокчейн стали так популярны в мире криптовалют. Что такое и как работает EVM?

Смарт-контракты

Еще до появления Биткоина апологеты криптографии писали о технологии смарт-контрактов. В работах Ника Сабо (Nick Szabo) 90-х годов можно найти довольно хорошо разработанную «
теорию умных контрактов». Если коротко, смарт-контракт – это компьютерный алгоритм, выполнение которого происходит автоматически при достижении заранее запрограммированных условий. То есть смарт-контракт может работать без участия человека. Что помимо очевидного плюса в виде автоматизации процесса способно убрать из уравнения лишние инстанции в виде арбитров и контролеров.

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

Ответ простой – Ethereum Virtual Machine, сокращенно EVM.

Почему Эфириум

Казалось бы, главная криптовалюта мира – это Биткоин. Его доминирование не поддается сомнению. Логично, что смарт-контракты как важная часть криптомира просто обязаны были быть реализованы именно на блокчейне Биткоина. Да, в принципе его блокчейн поддерживает реализацию смарт-контрактов – он понимает язык сценариев Script. Например, мультиподпись – это по своей сути смарт-контракт.

Однако проблема в том, что блокчейн Биткоина не был специально создан для смарт-контрактов, поэтому их функционал там сильно уступает блокчейнам, в архитектуру которых изначально закладывалась полноценная реализация подобного функционала. К примеру, Биткоин не записывает свое текущее состояние в каждый момент времени. Вместо этого он просто записывает, кто чем владеет, и кто что кому передал. Это позволяет хранить, отправлять и получать монеты при помощи UTXO (An unspent transaction output), в котором выбор возможных условий для транзакции весьма ограничен. Но это значит, что смарт-контракт не может обращаться к текущему состоянию блокчейна или изменять его, что сильно урезает возможности. В Ethereum же это возможно благодаря EVM – вычислительной среде, специально созданной для обеспечения работы смарт-контрактов.

Поэтому, если блокчейн Биткоина часто и справедливо называют «распределенным реестром», то EVM в Ethereum – это «распределенный компьютер», который значительно лучше работает с алгоритмами. Чем смарт-контракты, собственно, и являются.

Что такое EVM

В официальной документации Ethereum EVM дано такое 
определение:

«Глобальный виртуальный компьютер, состояние которого сохраняет и согласовывает каждый участник сети Эфириума. Любой участник может запросить выполнение произвольного кода на EVM и выполнение этого кода меняет состояние EVM».

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

Если посмотреть на EVM со стороны, то можно представить множество компьютеров, единообразно выполняющих один и тот же код по заранее заданным правилам. Спойлер: логика работы EVM изнутри значительно сложнее.

Пару слов о создателях: EVM – совместное детище Виталка Бутерина и Гэвина Вуда (Gavin Wood). Основные идеи, лежащие в основе EVM, можно прочесть в
технической документации Гэвина Вуда. Вуд разработал язык программирования смарт-контрактов Solidity. И, кстати, после работы над Эфириумом Вуд переключился в 2016 году на собственный проект – Polkadot.

Состояния EVM

Логика состояний – ключевая для описания механизма работы EVM. Документация определяет проект Ethereum как распределенную систему состояний. Состояние – это крупная структура данных, содержащая не только все аккаунты и балансы, но также состояние машины, которая способна выполнять произвольный код и меняться от блока к блоку в соответствии с заранее определенным набором правил. Конкретные правила изменения состояния от блока к блоку, собственно, и
определяются виртуальной машиной Эфириума.

По большому счету, EVM можно описать как математическую функцию, генерирующую определенный выход (output) при заданном вводе (input). Формально это описывается
следующим образом:

Y(S, T) = S’, где S – это старое действительное состояние, T – набор действительных транзакций, а Y — функция перехода между состояниями, дающая новое выходное состояние S’. EVM поддерживает два варианта транзакций: вызовы сообщений и создание контракта.

Функция перехода состояния EVM позволяет Эфириуму от блока к блоку обновляться до нового действительного состояния в ответ на входные данные смарт-контракта. То есть благодаря EVM Эфириум – это не просто децентрализованная система записей, регистрирующая операции с криптовалютой. Но платформа, на которой можно разворачивать компьютерные программы, способные взаимодействовать с состоянием Эфириума. Изменения состояния позволяют разработчикам создавать при помощи смарт-контрактов собственные валюты, NFT, децентрализованные приложения (dApp) или автономные организации (DAO).

Какие языки понимает EVM

Задача EVM – принять, прочитать и исполнить код смарт-контракта. Да, контракт – это просто программа, содержащая команды для машины. Загвоздка в том, что EVM – виртуальная машина, объединяющая десятки тысяч компьютеров, обязанных исполнить эту программу по единым для всех правилам.

И это при том, что существует несколько языков программирования, на которых разрешается писать смарт-контракты для EVM. Самые популярные – это Solidity и Vyper. Но как код, написанный программистами на разных языках, становится понятным для виртуальной машины?

Единство и ясность обеспечивается благодаря байткодам – низкоуровневым инструкциям, с которыми EVM умеет работать. Смарт-контракт, написанный на Solidity или Vyper (или другом поддерживаемом высокоуровневом языке) преобразуется при компиляции в набор байткодов. Каждый шаг инструкции в байт-коде представляет собой операцию, называемую опкодом. Именно в виде таких кодов смарт-контракт и выполняется. 

Иными словами, смарт-контракт – это совокупность машинных инструкций (опкодов), которые могут представлять собой стандартные машинные операции, к примеру, XOR (Исключающее «или»), AND (оператор «и»), ADD (сложение), MUL (умножение). А могут – специализированные для блокчейна инструкции, к примеру: ADDRESS (получить адрес текущего аккаунта), BALANCE (получить баланс выбранного аккаунта), BLOCKHASH (Получить хеш блока). Список опкодов можно посмотреть
здесь, а узнать, как высокоуровневый код преобразуется в опкоды для EVM, можно
здесь.

Газовый вопрос

Ключевой переменной для выполнения смарт-контракта является газ – аналог комиссии в Эфириуме. Газ измеряется в Gwei, которая равна 0.000000001 ETH. Он нужен для того, чтобы EVM смогла до конца обработать все действия, инициируемые смарт-контрактом. Чем этих действий больше и чем они сложнее – тем выше плата за газ. В перечне опкодов для EVM можно посмотреть, сколько газа необходимо ради 
выполнения каждой операции. Однако важно понимать: не все операции имеют стабильную цену в газе – очень часто на плату влияет загруженность сети Эфириума.

По мере выполнения кода газ потребляется в соответствии со стоимостью комиссионных для выполняемых операций и загрузки сети. Если в какой-то момент газ заканчивается, возникает исключение «закончился газ» (OOG – Out of Gas) и выполнение контракта немедленно останавливается, а транзакции отменяются. В этом случае никакие изменения в состоянии Ethereum не применяются, за исключением списания газа для оплаты ресурсов, которые были использованы на выполнение кода до точки остановки.

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

Обобщающие тезисы

  • Смарт-контракт — это программа, работающая на блокчейне Эфириума. Она представляет собой набор кода и данных, который находится по определенному адресу в блокчейне Ethereum.

  • Задача EVM – исполнить код смарт-контракта в сети и обеспечить изменение состояния Ethereum.

  • EVM поддерживает ряд языков программирования, самые популярные из которых – Solidity и Vyper.

  • Выполнение смарт-контракта требует уплаты газа. Чем сложнее контракт – тем больше газа потребляет. Также плата за газ зависит от загруженности сети Эфириума.

Подытожим

Виртуальная машина Эфириума – EVM, основополагающее решение проекта, благодаря которому обеспечивается выполнения смарт-контрактов в сети. Этим Эфириум отличается от предшественников на рынке криптовалют, а его популярность и эффективность (как и эффективность решения EVM) успела пройти проверку временем.