TON Virtual Machine (TVM, іноді TON VM) віртуальна машина, що виконує смарт-контракти в блокчейні TONЦе виконавчий шар мережі: кожен смарт-контракт Машина обробляє вхідні повідомлення, змінює постійний стан контракту і формує вихідні повідомлення для інших контрактів.
Архітектура TVM підпорядкована трьом вимогам: повна детермінативність виконання (один і той самий вхід дає один і той же результат на будь-якому вузлі), висока щільність коду (мінімум місця в блокчейні) і зворотна сумісність при розширенні набору інструкцій.
Історія#
TVM була розроблена командою Telegram у 2018 році разом з першою версією протоколу TON.:
- 2018 перша версія TVM, випущена з тестовою мережею TON. Основна увага функціональність смарт-контрактів і інтеграція з протоколом.
- Март 2020 публікація детальної технічної документації з описом типів даних, оптимізації та контрактної інструкції.
- 2020 (запуск mainnet) TVM підтримує повноцінний набір операцій і забезпечує детермінований виконання в production-мережі.
Після передачі проекту спільноті розробка TVM продовжується через TEP-процес оновлення вводяться через пропозиції поліпшень і активуються через консенсус валідаторів.
Основи#
TVM використовує бітові рядки як фундаментальне представлення даних.
- Шістнадцятизначне позначення рядки довжиною, помноженою на чотири біти, діляться на групи по 4 біта, кожна записується однією шістнадцятирічною цифрою (0F).
- Серіалізація в октати ряд ділиться на групи по 8 бітів і записується як послідовність байтів; при необхідності додається вирівнювання до 8.
Структура стеку#
TVM є стековою віртуальною машиною. Це означає, що дані зберігаються в структурі стек (last-in-first-out), а не в названих змінних або реєстрах. Більшість операцій (арифметика, порівняння, передача параметрів) беруть аргументи з стеку і кладуть результат туди ж. Стекова модель простіша за реєстральний підхід і дає більш щільне кодування інструкцій важливо для зменшення on-chain зберігання.
Типи значень
TVM стек працює з фіксованим набором примітивних типів:
- Integer 257-бітний знаковий цілий (вибір розрядності дозволяє вмістити 256-бітні хэші плюс знак без втрат).
- Cell об'єкт, що містить до 1023 бітів даних і до 4 посилань на інші ячелки.
- Tuple організована колекція значень різних типів.
- Slice поміж ячеек: вказує на решту даних і посилання при читанні.
- Builder буфер для послідовної збірки нової Cell.
- Continuation представлення точки продовження виконання; см. нижче.
- Null відсутність значення; маркер для неініціалізованих полів.
Категорії інструкцій
Інструкції TVM групуються за призначенням:
- стекові та кортежні перестановки стеку, операції з tuple;
- константні вставка передбачених значень на стек;
- арифметичні стандартні арифметичні операції з автоматичною переповненням;
- операції з ячейками читає Slice, записує Builder, звертається за посиланнями;
- управління потоком умовні розгалуження, цикли, виклики продовжень;
- прикладні примітиви спеціалізовані операції TON: робота з адресами, підписами, актуатором повідомлень.
Одиниці та їх типи#
Клітка (Cell) атомна одиниця зберігання в TVM і в самій блокчейні TON. Кожна Cell містить до 1023 бітів даних і до 4 посилань на інші Cell. Граф клітин, що утворюється через посилання, орієнтований ациклічний граф (DAG): цикли недопустимі. Будь-які дані блокчейна (смарт-контракти, стани, повідомлення, блоки) зберігаються як такий граф.
Типи ячеек
- Звичайні (тип-1) стандартний носій даних і посилань.
- Екзотичні (exotic cells) типи 2–255Використовуються для обрізаних гілок (truncated branches), посилань на бібліотеки і доказів Merkle.
Екзотичні клітини дозволяють, наприклад, передавати частковий снімк блокчейна з криптографічними доказами бази легких клієнтів TON.
Продовження (Continuations)#
Continuation центральна конструкція TVM для управління потоком. По суті це відкладене обчислення: маркер, що містить код для виконання, поточний стек і збережений стан контрольних реєстрів. Continuation можна покласти на стек, передати як параметр, активізувати і продовжити виконання з фіксованої точки.
На continuation побудовані виклики підпрограм, умовні операції, цикли і обробка виняток. Аналог у більш звичних мовах first-class functions; у TVM continuation потужніший і охоплює також неповний продовження програми.
Типи продовжень
- Звичайні містять код, стек, список збережених реєстрів і кодну сторінку (див. нижче).
- Прості лише код і сторінка коду, без збережених даних стеку.
- Текуче (cc, current continuation) відображає код, який зараз виконується; ключова частина стану машини.
Управління переключається між продовженнями інструкціями JMP (передача управління) і RET (повернення). Винятки спеціальні продовження, що активуються при помилці: вони отримують параметри помилки і визначають подальшу поведінку. Умовні та ітераційні конструкції (IF, WHILE, REPEAT) реалізовані над continuations.
Кодові сторінки#
Кожне звичайне продовження несе 16-бітне поле кодової сторінки (cp), яке визначає, як декодувати його інструкції.
Інструкції кодуються двоічним префіксом це дає однозначне декодування і щільне представлення. Якщо префікс не відповідає допустимій інструкції поточної кодної сторінки, генерується виключення недопустимого опкоду.
Між кодовими сторінками можливе автоматичне переключення в залежності від виконаної операції це дозволяє спеціалізувати сторінки під часті операції (маніпуляції зі стеком, обробка даних) і скоротити обсяг коду.
TVM vs Ethereum Virtual Machine#
TVM і EVM обидві стекові віртуальні машини для смарт-контрактів, але мають ключові відмінності.
| Свойство | TVM | EVM |
|---|---|---|
| Базова модель даних | Граф ячеек (Cell, до 1023 біт + 4 посилання) | 256-бітні слова + Merkle Patricia Trie |
| Розмір Integer | 257 бітів | 256 бітів |
| Переповнення | Автоматична | Ручна (Solidity ≥0.8) |
| Криптографія | Curve25519, Weil pairings (zk-SNARKs), sha256 | secp256k1, keccak256 |
| Основна мова контрактів | FunC (статична типіфікація, ADT) | Solidity |
| Збереження стану | Розподілено за ячейками контрактів | MPT з глобальним станом |
Граф клітин спрощує роботу з складними структурами (дерева, DAG), вимагає менше пам'яті і обчислювальних ресурсів, ніж MPT. Автоматична переповнення перевіряє знижує клас типових вразливостей. Підтримка Curve25519 і Weil pairings дає криптографічні можливості, недоступні в EVM з коробки.
Подібні статті#
️ Потрібно підтвердити#
-: дати етапів розробки TVM (2018 перша версія, березень 2020 документація, 2020 mainnet) потрібні точні дати публікацій. -: приклади FunC-коду не приведені користь для розробника стаття дала б більше з мінімальним hello world сніпетом.