Як працює Ethereum Virtual Machine (EVM)?
Ethereum відомий не лише як друга за капіталізацією криптовалюта, а й як перший масовий програмований блокчейн. Саме можливість запускати смарт-контракти, створювати DeFi-протоколи, NFT-маркетплейси, DAO та інші децентралізовані застосунки зробила його основою цілої Web3-екосистеми. У центрі цієї програмованості стоїть Ethereum Virtual Machine (EVM) — віртуальна машина, яка виконує код смарт-контрактів і визначає, як змінюється стан мережі.
У цьому матеріалі ми детально розберемося, що таке EVM, як вона влаштована, з чого складається її архітектура, як виконується байткод, навіщо потрібен gas, які є типи акаунтів та стану, що таке opcodes, чому EVM-сумісність стала стандартом для нових блокчейнів, а також яким може бути майбутнє EVM в умовах масштабування Ethereum.
1. Що таке Ethereum Virtual Machine простими словами
Ethereum Virtual Machine — це абстрактна обчислювальна машина, яка виконує код смарт-контрактів у мережі Ethereum. Вона працює поверх блокчейна і забезпечує:
- однаковий результат виконання коду на всіх нодах мережі;
- ізоляцію та безпеку виконання смарт-контрактів;
- управління станом усіх акаунтів і контрактів;
- обмеження ресурсів за допомогою механізму gas.
Якщо спростити, EVM часто називають глобальним децентралізованим комп’ютером. Кожен вузол мережі Ethereum запускає свою локальну копію EVM, яка виконує однакові інструкції і таким чином синхронно підтримує один і той самий стан блокчейна.
2. Основні функції EVM
EVM виконує кілька фундаментальних функцій, без яких Ethereum не був би тим, чим він є сьогодні:
- Виконання смарт-контрактів. Увесь код, написаний на Solidity, Vyper чи інших мовах, компілюється в байткод, який виконується саме EVM.
- Визначення переходів стану. Кожна транзакція — це перехід від одного глобального стану мережі до іншого; EVM відповідає за його коректність.
- Робота з акаунтами. Вона керує акаунтами користувачів і контрактів, їхнім балансом ETH, nonce, кодом та сховищем.
- Облік gas. EVM рахує, скільки обчислювальних ресурсів споживає кожна операція, і забезпечує обмеження.
- Детермінованість виконання. Одна й та сама транзакція повинна на всіх нодах мати один і той самий результат.
3. Архітектура EVM: основні компоненти
EVM — це стекова віртуальна машина, яка працює подібно до простого процесора. Вона оперує з декількома ключовими структурами даних та абстракціями.
3.1. Акаунти в EVM
В Ethereum є два типи акаунтів:
| Тип акаунта | Опис | Особливості |
|---|---|---|
| EOA (Externally Owned Account) | Акаунт, керований приватним ключем користувача. | Має баланс ETH та nonce, але не містить коду. Транзакції ініціюються тільки з EOA. |
| Contract Account | Акаунт смарт-контракту, який містить код та сховище. | Не має приватного ключа, не може сам «підписати» транзакцію. Активується викликом з іншого контракту або EOA. |
3.2. Стек (Stack)
Стек — головна структура даних, з якою працює EVM. Це LIFO-структура (останнім зайшов — першим вийшов), що вміщує до 1024 елементів. Усі арифметичні, логічні та багато інших операцій працюють саме зі стеком: інструкції беруть операнди зі стеку та повертають результат назад.
3.3. Пам’ять (Memory)
Пам’ять — це тимчасове, лінійне й адресоване байтами сховище, доступне під час виконання транзакції або виклику контракту. Після завершення виклику пам’ять очищується. Вартість використання пам’яті зростає із збільшенням її розміру.
3.4. Сховище (Storage)
Сховище — це постійна пам’ять контракту. Дані в сховищі зберігаються у блокчейні навічно (поки існує ланцюг), і саме тому будь-які операції SSTORE є одними з найдорожчих по gas. Сховище організоване як асоціативний масив ключ–значення з 256-бітними словами.
3.5. Байткод та opcodes
Смарт-контракти зазвичай пишуть на високорівневих мовах типу Solidity. Потім вони компілюються в байткод — набір інструкцій, які складаються з opcodes (операційних кодів). Саме ці opcodes виконує EVM.
Приклади opcodes:
ADD,MUL,SUB— арифметичні операції;AND,OR,NOT— логічні операції;SLOAD,SSTORE— робота зі сховищем;CALL,DELEGATECALL— виклики інших контрактів;JUMP,JUMPI— зміна потоку виконання;LOG1–LOG4— генерація подій (logs).
4. Механізм gas: як EVM обмежує ресурси
Як будь-яка обчислювальна система, Ethereum потребує механізму, який запобігатиме зловживанням обчислювальними ресурсами. У централізованих системах це контролює адміністратор або серверні обмеження. У децентралізованому Ethereum для цього використовується gas.
Gas — це одиниця, яка вимірює обсяг обчислювальної роботи, необхідний для виконання тієї чи іншої операції в EVM. Кожна інструкція має свою вартість у gas. Наприклад, проста операція додавання може коштувати кілька одиниць gas, тоді як запис у сховище — тисячі.
| Операція | Приклад opcode | Типова вартість (gas, приблизно) |
|---|---|---|
| Арифметика | ADD, MUL |
3–5 |
| Завантаження зі сховища | SLOAD |
800 |
| Запис у сховище (новий слот) | SSTORE |
20 000 |
| Виклик контракту | CALL |
700 + змінна частина |
Вартість транзакції у ETH визначається формулою:
Вартість транзакції = Gas Used × Gas Price
Користувач задає max gas (gas limit) і gas price (або max fee), а мережа обчислює, скільки реально було витрачено. Якщо gas закінчується раніше, ніж виконався контракт, транзакція revert’иться, але витрачений gas не повертається (лише невикористана частина відшкодовується, в залежності від моделі).
5. Як EVM виконує смарт-контракт: покроковий приклад
5.1. Крок 1: Формування та підпис транзакції
Користувач (EOA) формує транзакцію: вказує адресу контракту, який потрібно викликати, дані виклику (encoded функція + аргументи), gas limit, max fee тощо. Транзакція підписується приватним ключем.
5.2. Крок 2: Потрапляння в mempool
Після підпису транзакція надсилається в мережу та потрапляє в mempool — список усіх транзакцій, які очікують на включення в блок. Валідатори відбирають транзакції з більш вигідними комісіями.
5.3. Крок 3: Обробка транзакції валідатором
Коли валідатор (в Ethereum після переходу на Proof of Stake) формує блок, він послідовно виконує транзакції в EVM. Для кожної транзакції:
- перевіряється підпис і коректність структури;
- перевіряється, чи достатньо балансу для оплати gas;
- оновлюється nonce акаунта;
- код контракту завантажується в EVM.
5.4. Крок 4: Виконання байткоду
EVM розпочинає виконання опкодів контракту. Кожна інструкція:
- читає/записує дані зі стеку, пам’яті або сховища;
- змінює внутрішній стан машини;
- зменшує доступний баланс gas.
Якщо під час виконання стається помилка або газ закінчується, транзакція вважається невдалою, а зміни в стані (за винятком оплати gas) відкатуються.
5.5. Крок 5: Оновлення глобального стану
Після успішного виконання контракта EVM формує новий стан:
- оновлюються баланси акаунтів;
- змінюється сховище контрактів;
- створюються логи (події), доступні через RPC і індексатори;
- оновлюється корінь дерева станів (state root) блоку.
Новий блок із оновленим станом розсилається іншим нодам, які повторно виконують ті самі транзакції і повинні отримати той самий результат. Якщо результат відрізняється — блок відкидається.
6. Модель стану Ethereum та роль EVM
Стан Ethereum описується як набір акаунтів і зв’язків між ними. Внутрішньо він зберігається у вигляді деревоподібних структур (Merkle Patricia Trie), що дозволяє швидко перевіряти цілісність даних і формувати «криптографічні відбитки» стану.
EVM виступає як машина станів: на вхід подається попередній стан та набір транзакцій, а на виході отримуємо новий стан. Важливо, що цей процес строго детермінований: немає випадкових елементів, які могли б змінити результат виконання.
7. Мови програмування та EVM: Solidity, Vyper та інші
Хоча EVM працює лише з байткодом, розробники рідко пишуть контракти безпосередньо на рівні opcodes. Замість цього використовуються високорівневі мови, які компілюються в EVM-байткод.
- Solidity — найпопулярніша мова для Ethereum, схожа на JavaScript/TypeScript.
- Vyper — більш стримана мова з синтаксисом, подібним до Python, зі спрощеною моделлю безпеки.
- Yul — проміжна низькорівнева мова, ближча до EVM-байткоду.
Процес виглядає так: розробник пише контракт на Solidity → компілятор (наприклад, solc) перетворює код у байткод → під час деплою байткод записується в акаунт контракту → при виклику EVM читає цей байткод і виконує його.
8. Переваги EVM як обчислювальної моделі
Ethereum Virtual Machine має низку важливих переваг, завдяки яким вона стала стандартом де-факто:
- Універсальність. EVM — Turing-complete машина: у теорії на ній можна реалізувати будь-яку логіку.
- Децентралізація. Одна й та сама логіка виконується на тисячах вузлів без єдиного центру контролю.
- Безпека. Ізоляція виконання, обмеження gas, чітка модель стану.
- Сумісність між блокчейнами. Багато ланцюгів реалізували EVM-сумісність, що дозволяє запускати той самий код у різних мережах.
- Величезна екосистема. Інструменти, бібліотеки, фреймворки, гігантська кількість прикладів і готових рішень.
9. Обмеження та недоліки EVM
Разом з тим у EVM є й слабкі сторони:
- Обмежена продуктивність. Усі ноди мають повторювати виконання коду, тому складні обчислення обходяться дорого.
- Висока вартість зберігання даних. Постійне сховище дуже дороге, що змушує розробників економити кожен байт.
- Ризики помилок у контрактах. Смарт-контракти незворотні: одна помилка в коді може коштувати мільйони.
- Ізоляція від зовнішнього світу. Контракти не можуть напряму звертатися до HTTP-API чи баз даних — потрібні оракули.
10. EVM-сумісні блокчейни
Популярність EVM призвела до того, що інші блокчейни почали реалізовувати сумісність з нею, щоб залучити існуючих розробників і проєкти з Ethereum. Це дозволяє деплоїти ті самі смарт-контракти без значних змін.
Найвідоміші EVM-сумісні мережі:
- BNB Chain;
- Polygon (PoS chain);
- Avalanche C-Chain;
- Fantom;
- Arbitrum, Optimism (L2 для Ethereum);
- Gnosis Chain та інші.
Сумісність із EVM стала свого роду «золотим стандартом» для нових ланцюгів, адже розробникам не потрібно вивчати нові мови чи інструменти — достатньо знати Solidity.
11. Безпека смарт-контрактів і роль EVM
Хоч EVM забезпечує детерміноване виконання та обмеження ресурсів, безпека контрактів значною мірою залежить від розробника. EVM не «розуміє», чи відповідає логіка контракту економічним очікуванням: вона просто виконує байткод.
Типові вразливості смарт-контрактів:
- reentrancy-атаки (повторний вхід у функцію до завершення попереднього виклику);
- integer overflow/underflow (для старих версій Solidity без вбудованих перевірок);
- неправильні права доступу (відсутність
onlyOwner, неочевидні backdoor’и); - маніпуляції з ціною через оракул (oracle manipulation);
- логічні помилки бізнес-логіки (невірна формула, порядок викликів тощо).
Для зменшення ризиків використовуються аудити смарт-контрактів, формальна верифікація, стандартизовані бібліотеки (наприклад OpenZeppelin) та обмежувальні шаблони коду.
12. Майбутнє EVM: масштабування та еволюція
Ethereum активно рухається в напрямку масштабування та підвищення ефективності. Це напряму впливатиме й на роль EVM.
12.1. L2-рішення та rollups
Все більше обчислень виноситься на Layer 2 (Arbitrum, Optimism, zkSync, Scroll тощо), які часто зберігають сумісність із EVM або навіть реалізують zkEVM — докази коректності виконання EVM-коду за допомогою zero-knowledge proof.
12.2. eWASM і потенційна заміна EVM
Уже кілька років обговорюється перехід від EVM до eWASM (Ethereum-flavored WebAssembly), який потенційно може:
- бути швидшим та ефективнішим;
- підтримувати більше мов програмування;
- мати гнучкішу модель виконання.
Водночас EVM має настільки велику екосистему, що повна й швидка міграція малоймовірна. Натомість можлива поетапна інтеграція або гібридні моделі.
13. Висновок
Ethereum Virtual Machine — це фундамент, на якому побудовано весь сучасний Ethereum та значна частина мультичейн-екосистеми Web3. Вона визначає, як виконуються смарт-контракти, як змінюється стан мережі, як обліковуються ресурси та як забезпечуються детермінованість і безпека виконання.
Розуміння принципів роботи EVM — критично важливе для розробників смарт-контрактів, архітекторів DeFi-протоколів, аудиторів безпеки та всіх, хто серйозно працює з Ethereum або EVM-сумісними мережами. Знання про стек, пам’ять, сховище, gas, транзакції, типи акаунтів та модель стану дозволяють писати ефективніший, безпечніший та дешевший у виконанні код.
У найближчі роки роль EVM навряд чи зменшиться: навпаки, завдяки розвитку rollups, zkEVM та інфраструктури L2, вона може стати ще важливішою як спільний стандарт для множини блокчейн-мереж, що формують єдину програмовану економіку.

