---
title: "Віртуальна машина Етеріуму (EVM)"
description: "Вступ до віртуальної машини Етеріуму та її зв'язок зі станом, транзакціями та смарт-контрактами."
lang: uk
---

Віртуальна машина Етеріуму (EVM) — це децентралізоване віртуальне середовище, яке узгоджено та безпечно виконує код на всіх вузлах [Етеріуму](/). Вузли запускають EVM для виконання смарт-контрактів, використовуючи «[газ](/developers/docs/gas/)» для вимірювання обчислювальних зусиль, необхідних для [операцій](/developers/docs/evm/opcodes/), що забезпечує ефективний розподіл ресурсів і безпеку мережі.

## Передумови {#prerequisites}

Для розуміння EVM необхідне базове знайомство із загальною термінологією інформатики, такою як [байти](https://wikipedia.org/wiki/Byte), [пам'ять](https://wikipedia.org/wiki/Computer_memory) та [стек](<https://wikipedia.org/wiki/Stack_(abstract_data_type)>). Також буде корисно орієнтуватися в концепціях криптографії та блокчейну, таких як [хеш-функції](https://wikipedia.org/wiki/Cryptographic_hash_function) та [дерево Меркла](https://wikipedia.org/wiki/Merkle_tree).

## Від реєстру до автомата станів {#from-ledger-to-state-machine}

Аналогія «розподіленого реєстру» часто використовується для опису блокчейнів, таких як Біткоїн, які забезпечують роботу децентралізованої валюти за допомогою фундаментальних інструментів криптографії. Реєстр зберігає записи про активність, які повинні відповідати набору правил, що визначають, що можна, а що не можна робити для зміни реєстру. Наприклад, адреса Біткоїна не може витратити більше Біткоїнів, ніж вона отримала раніше. Ці правила лежать в основі всіх транзакцій у Біткоїні та багатьох інших блокчейнах.

Хоча Етеріум має власну нативну криптовалюту (етер), яка дотримується майже тих самих інтуїтивно зрозумілих правил, він також підтримує набагато потужнішу функцію: [смарт-контракти](/developers/docs/smart-contracts/). Для цієї складнішої функції потрібна більш витончена аналогія. Замість розподіленого реєстру Етеріум є розподіленою [машиною станів](https://wikipedia.org/wiki/Finite-state_machine). Стан Етеріуму — це велика структура даних, яка містить не лише всі акаунти та баланси, але й _стан машини_, який може змінюватися від блоку до блоку відповідно до заздалегідь визначеного набору правил і який може виконувати довільний машинний код. Конкретні правила зміни стану від блоку до блоку визначаються EVM.

![A diagram showing the make up of the EVM](./evm.png)
_Діаграму адаптовано з [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_

## Функція переходу стану Етеріуму {#the-ethereum-state-transition-function}

EVM поводиться як математична функція: отримуючи вхідні дані, вона видає детермінований результат. Тому досить корисно більш формально описати Етеріум як такий, що має **функцію переходу стану**:

```
Y(S, T)= S'
```

Отримуючи старий дійсний стан `(S)` та новий набір дійсних транзакцій `(T)`, функція переходу стану Етеріуму `Y(S, T)` створює новий дійсний вихідний стан `S'`

### Стан {#state}

У контексті Етеріуму стан — це величезна структура даних, яка називається [модифікованим деревом Меркла-Патрісії](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/), що зберігає всі [акаунти](/developers/docs/accounts/), пов'язані хешами, і зводиться до єдиного кореневого хеша, який зберігається в блокчейні.

### Транзакції {#transactions}

Транзакції — це криптографічно підписані інструкції від акаунтів. Існує два типи транзакцій: ті, що призводять до викликів повідомлень, і ті, що призводять до створення контракту.

Створення контракту призводить до створення нового акаунта контракту, що містить скомпільований байт-код [смарт-контракту](/developers/docs/smart-contracts/anatomy/). Щоразу, коли інший акаунт здійснює виклик повідомлення до цього контракту, він виконує його байт-код.

## Інструкції EVM {#evm-instructions}

EVM виконується як [стекова машина](https://wikipedia.org/wiki/Stack_machine) з глибиною 1024 елементи. Кожен елемент — це 256-бітне слово, яке було обрано для зручності використання з 256-бітною криптографією (наприклад, хешами Keccak-256 або підписами secp256k1).

Під час виконання EVM підтримує тимчасову _пам'ять_ (як масив байтів з адресацією за словами), яка не зберігається між транзакціями.

### Тимчасове сховище {#transient-storage}

Тимчасове сховище — це сховище пар «ключ-значення» для кожної транзакції, доступ до якого здійснюється за допомогою опкодів `TSTORE` та `TLOAD`. Воно зберігається під час усіх внутрішніх викликів у межах однієї транзакції, але очищається в кінці транзакції. На відміну від пам'яті, тимчасове сховище моделюється як частина стану EVM, а не фрейму виконання, проте воно не фіксується в глобальному стані. Тимчасове сховище забезпечує ефективний з точки зору газу обмін тимчасовим станом між внутрішніми викликами під час транзакції.

### Сховище {#storage}

Контракти містять _префіксне дерево сховища_ Меркла-Патрісії (як масив слів з адресацією за словами), пов'язане з відповідним акаунтом і є частиною глобального стану. Це постійне сховище відрізняється від тимчасового сховища, яке доступне лише протягом однієї транзакції та не є частиною префіксного дерева постійного сховища акаунта.

### Опкоди {#opcodes}

Скомпільований байт-код смарт-контракту виконується як низка [опкодів](/developers/docs/evm/opcodes) EVM, які виконують стандартні стекові операції, такі як `XOR`, `AND`, `ADD`, `SUB` тощо. EVM також реалізує низку специфічних для блокчейну стекових операцій, таких як `ADDRESS`, `BALANCE`, `BLOCKHASH` тощо. Набір опкодів також включає `TSTORE` та `TLOAD`, які надають доступ до тимчасового сховища.

![A diagram showing where gas is needed for EVM operations](../gas/gas.png)
_Діаграми адаптовано з [Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_

## Реалізації EVM {#evm-implementations}

Усі реалізації EVM повинні відповідати специфікації, описаній у Жовтій книзі Етеріуму.

За десятирічну історію Етеріуму EVM зазнала кількох переглядів, і існує кілька реалізацій EVM різними мовами програмування.

[Клієнти виконання Етеріуму](/developers/docs/nodes-and-clients/#execution-clients) включають реалізацію EVM. Крім того, існує безліч автономних реалізацій, зокрема:

- [Py-EVM](https://github.com/ethereum/py-evm) — _Python_
- [evmone](https://github.com/ethereum/evmone) — _C++_
- [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) — _JavaScript_
- [revm](https://github.com/bluealloy/revm) — _Rust_

## Подальше читання {#further-reading}

- [Жовта книга Етеріуму](https://ethereum.github.io/yellowpaper/paper.pdf)
- [Jellopaper або KEVM: Семантика EVM у K](https://jellopaper.org/)
- [Бежева книга (The Beigepaper)](https://github.com/chronaeon/beigepaper)
- [Опкоди віртуальної машини Етеріуму](https://www.ethervm.io/)
- [Інтерактивний довідник з опкодів віртуальної машини Етеріуму](https://www.evm.codes/)
- [Короткий вступ у документації Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6)
- [Опанування Етеріуму — Віртуальна машина Етеріуму](https://github.com/ethereumbook/ethereumbook/blob/openedition/13evm.asciidoc)

## Пов'язані теми {#related-topics}

- [Газ](/developers/docs/gas/)

## Посібники: Віртуальна машина Етеріуму (EVM) / Опкоди в Етеріумі {#tutorials}

- [Розуміння специфікацій EVM у Жовтій книзі](/developers/tutorials/yellow-paper-evm/) _— Покроковий розбір формальної специфікації EVM із Жовтої книги Етеріуму._
- [Зворотна розробка контракту](/developers/tutorials/reverse-engineering-a-contract/) _— Як здійснити зворотну розробку скомпільованого смарт-контракту за допомогою опкодів EVM._

<QuizWidget quizKey="evm" />
