Перейти до основного вмісту

Огляд TVM

Всі смарт-контракти TON виконуються на власній віртуальній машині TON (TVM). TVM побудована за принципом "стека", що робить її ефективною і простою в реалізації.

Цей документ дає уявлення про те, як TVM виконує транзакції з висоти пташиного польоту.

порада

Курс TON: TVM

Перед початком курсу переконайтеся, що ви добре розумієте основи технології блокчейн. Якщо у вас є прогалини в знаннях, рекомендуємо пройти курс Blockchain Basics with TON (RU версія, CHN версія). :::

Курс [TON Blockchain Course] (https://stepik.org/course/176754/) - це вичерпний посібник з розробки TON Blockchain.

Модуль 2 повністю охоплює TVM, транзакції, масштабування та бізнес-кейси.

Перевірте курс TON Blockchain

CHN

RU

Транзакції та етапи

Коли на акаунті в одному з ланцюжків TON відбувається якась подія, вона викликає транзакцію. Найпоширенішою подією є "надходження якогось повідомлення", але, взагалі кажучи, це можуть бути "тик-так", "злиття", "розщеплення" та інші події.

Кожна транзакція складається з 5 етапів:

  1. Фаза зберігання - на цій фазі розраховується плата за зберігання, накопичена контрактом через зайняття певного місця в стані ланцюжка. Детальніше в [Плата за зберігання] (/develop/smart-contracts/fees#storage-fee).
  2. Фаза кредитування - на цій фазі розраховується баланс контракту щодо (можливої) вартості вхідного повідомлення і стягнутої плати за зберігання.
  3. Фаза обчислення - на цій фазі TVM виконує контракт (див. нижче) і результатом виконання контракту є сукупність реквізитів exit_code, actions (серіалізований список дій), gas_details, new_storage та деяких інших.
  4. Фаза дій - якщо фаза обчислень пройшла успішно, в цій фазі обробляються "дії" з фази обчислень. Зокрема, дії можуть включати відправку повідомлень, оновлення коду смарт-контракту, оновлення бібліотек тощо. Зауважте, що деякі дії можуть зазнати невдачі під час обробки (наприклад, якщо ми спробуємо відправити повідомлення з більшим TON, ніж є в контракті), в такому випадку вся транзакція може повернутися назад або ця дія може бути пропущена (це залежить від режиму дій, іншими словами, контракт може відправити повідомлення типу "відправити або повернути" або "спробувати відправити, якщо не буде ігноруватися").
  5. Фаза відмов - якщо фаза обчислення завершилася невдало (повернуто код_виходу >= 2), у цій фазі формується повідомлення про відмову для транзакцій, ініційованих вхідним повідомленням.

Обчислювальна фаза

На цій фазі відбувається виконання TVM.

Стан ТВМ

У будь-який момент часу стан ТВМ повністю визначається 6 властивостями:

  • Стек (див. нижче)
  • Керуючі регістри - (див. нижче), простіше кажучи, це означає до 16 змінних, які можуть бути безпосередньо встановлені та прочитані під час виконання
  • Поточне продовження - об'єкт, який описує поточну виконувану послідовність інструкцій
  • Поточна кодова сторінка - простими словами, це означає версію TVM, яка запущена в даний момент
  • Ліміти газу - набір з 4 цілих значень: поточний ліміт газуgl, максимальний ліміт газу gm, залишок газуgr та кредит газу gc
  • Контекст бібліотеки - хеш-мапа бібліотек, які може викликати TVM

ТВМ - це штабелеукладальна машина

TVM - це стекова машина з останнім входом і першим виходом. Всього існує 7 типів змінних, які можна зберігати в стеку, три з яких не є комірками:

  • Ціле - знакові 257-розрядні цілі числа
  • Кортеж - впорядкована колекція до 255 елементів з довільними типами значень, які можуть бути різними.
  • Нуль.

І чотири різних смаки клітин:

  • Комірка - базова (можливо, вкладена) непрозора структура, що використовується TON Blockchain для зберігання всіх даних
  • Зріз - спеціальний об'єкт, який дозволяє читати з комірки
  • Конструктор - спеціальний об'єкт, який дозволяє створювати нові комірки
  • Продовження - спеціальний об'єкт, який дозволяє використовувати комірку як джерело інструкцій TVM

Регістри управління

  • c0 - Містить наступне продовження або продовження повернення (подібно до адреси повернення підпрограми у звичайному дизайні). Це значення має бути продовженням.
  • c1 - Містить альтернативне продовження (повернення); це значення має бути Продовженням.
  • c2 - Містить обробник виключення. Це значення є продовженням, яке викликається щоразу, коли виникає виняток.
  • c3 - допоміжний регістр, містить поточний словник, по суті хеш-мапу, що містить код усіх функцій, які використовуються у програмі. Це значення повинно бути продовженням.
  • c4 - Містить корінь постійних даних, або просто розділ контракту data. Це значення є коміркою.
  • c5 - Містить дії виведення. Це значення є коміркою.
  • c7 - Містить корінь тимчасових даних. Це кортеж.

Ініціалізація TVM

TVM ініціалізується, коли виконання транзакції доходить до фази обчислень, а потім виконує команди (опкоди) з Поточного продовження, поки не залишиться більше команд для виконання (і не буде продовження для переходів назад).

Детальний опис процесу ініціалізації можна знайти тут: TVM Ініціалізація

Інструкція з експлуатації TVM

Список інструкцій TVM можна знайти тут: TVM-інструкції.

Результат виконання TVM

Окрім коду виходу та даних про спожитий газ, TVM опосередковано виводить наступні дані:

  • Регістр c4 - комірка, яка буде збережена як нові "дані" смарт-контракту (якщо виконання не буде повернуто на цій або наступних фазах)
  • c5 register - (список вихідних дій) комірка з останньою дією у списку та посилання на комірку з попередньою дією (рекурсивно)

Всі інші значення регістрів ігноруються.

Зауважте, що оскільки існує обмеження на максимальну глибину комірок <1024, і особливо обмеження на глибину c4 і c5 <=512, то буде обмеження на кількість вихідних дій в одному tx <=255. Якщо контракту потрібно відправити більше, він може відправити повідомлення із запитом continue_sending самому собі і відправити всі необхідні повідомлення у наступних транзакціях.

Дивіться також