Віртуальна машина Етеріуму (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.
Діаграму адаптовано з Ethereum EVM illustrated (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, які надають доступ до тимчасового сховища.
Діаграми адаптовано з Ethereum EVM illustrated (opens in a new tab)
Реалізації EVM
Усі реалізації EVM повинні відповідати специфікації, описаній у Жовтій книзі Етеріуму.
За десятирічну історію Етеріуму EVM зазнала кількох переглядів, і існує кілька реалізацій EVM різними мовами програмування.
Клієнти виконання Етеріуму включають реалізацію EVM. Крім того, існує безліч автономних реалізацій, зокрема:
- Py-EVM (opens in a new tab) — Python
- evmone (opens in a new tab) — C++
- ethereumjs-vm (opens in a new tab) — JavaScript
- revm (opens in a new tab) — Rust
Подальше читання
- Жовта книга Етеріуму (opens in a new tab)
- Jellopaper або KEVM: Семантика EVM у K (opens in a new tab)
- Бежева книга (The Beigepaper) (opens in a new tab)
- Опкоди віртуальної машини Етеріуму (opens in a new tab)
- Інтерактивний довідник з опкодів віртуальної машини Етеріуму (opens in a new tab)
- Короткий вступ у документації Solidity (opens in a new tab)
- Опанування Етеріуму — Віртуальна машина Етеріуму (opens in a new tab)
Пов'язані теми
Посібники: Віртуальна машина Етеріуму (EVM) / Опкоди в Етеріумі
- Розуміння специфікацій EVM у Жовтій книзі — Покроковий розбір формальної специфікації EVM із Жовтої книги Етеріуму.
- Зворотна розробка контракту — Як здійснити зворотну розробку скомпільованого смарт-контракту за допомогою опкодів EVM.