TVM и EVM
Введение
Ethereum Virtual Machine (EVM) и TON Virtual Machine (TVM) — это две стековые виртуальные машины, разработанные для запуска кода смарт-контрактов. Несмотря на наличие общих черт, между ними есть и заметные различия.
Различия TVM и EVM
Представление данных
EVM
- Основные единицы данных
- EVM работает в основном с 256-битными целыми числами, так как она была спроектирована для удобной работы с криптографическими функциями Ethereum (например, хеширование Keccak-256 и операции с эллиптическими кривыми).
- Типы данных в основном ограничены целыми числами, байтами и иногда массивами этих типов, но все они должны соответствовать 256-битным правилам обработки.
- Хранилище состояний
- Всё состояние блокчейна Ethereum представляет собой сочетание 256-битных адресов с 256-битными значениями. Это отображение поддерживается структурой данных, известной как Merkle Patricia Trie (MPT).
- MPT позволяет Ethereum эффективно доказывать согласованность и целостность состояния блокчейна с помощью криптографических проверок, что жизненно важно для децентрализованных систем вроде Ethereum.
- Ограничения структуры данных
- Упрощение до 256 бит означает, что EVM изначально не предназначена для обработки сложных или пользовательских структур данных напрямую. Разработчикам часто требуется внедрять дополнительную логику в смарт-контракты для имитации более сложных структур данных, что может привести к увеличению затрат на газ и увеличению сложности.
TON Virtual Machine (TVM)
- Архитектура на основе ячеек
- TVM использует уникальную модель «bag of cells»» для представления данных. Каждая ячейка может содержать до 128 байтов данных и до 4 ссылок на другие ячейки.
- Эта структура позволяет TVM изначально поддерживать произвольные алгебраические типы данных и более сложные конструкции, такие как деревья или направленные ациклические графы (DAG), непосредственно в своей модели хранения.
- Гибкость и эффективность
- Модель ячеек обеспечивает значительную гибкость, позволяя TVM обрабатывать широкий спектр структур данных более естественно и эффективно, чем EVM.
- Например, возможность создания связанных структур с помощью ссылок на ячейки позволяет создавать динамические и потенциально бесконечные структуры данных, которые важны для определённых типов приложений, таких как децентрализованные социальные сети или сложные децентрализованные финансовые протоколы (DeFi).
- Обработка сложных данных
- Возможность управлять сложными типами данных, изначально заложенная в архитектуре виртуальной машины, снижает необходимость их имитации в смарт-контрактах, что потенциально снижает стоимость и увеличивает скорость выполнения. Конструкция TVM особенно выгодна для приложений, требующих сложного управления состоянием или взаимосвязанных структур данных. Она предоставляет разработчикам надёжную основу для создания сложных и масштабируемых децентрализованных приложений.
Стековая машина
EVM
- EVM работает как традиционная стековая машина, используя принцип «последним пришёл — первым вышел» (LIFO) для управления вычислениями.
- Она обрабатывает операции, помещая и выталкивая 256-битные целые числа (стандартный размер для всех элементов в стеке).
TON Virtual Machine (TVM)
- TVM также функционирует как стековая машина, но с ключевым отличием: она поддерживает как 257-битные целые числа, так и ссылки на ячейки.
- Это позволяет TVM помещать и выводить эти два различных типа данных в стек/из стека, обеспечивая повышенную гибкость в прямом управлении дан ными.
Пример операций со стеком
Предположим, мы хотим сложить в EVM два числа: 2
и 2
. Процесс будет включать помещение чисел в стек и последующий вызов инструкции ADD
. Результат 4
останется наверху стека.
Мы можем выполнить эту операцию таким же образом и в TVM. Но давайте рассмотрим другой пример с более сложными структурами данных, такими как хеш-таблицы и ссылки на ячейки. Предположим, у нас есть хеш-таблицы с парами ключ-значение, где ключи являются целыми числами, а значения — либо целыми числами, либо ссылками на ячейки. Допустим, эта структура содержит следующие записи:
{
1: 10
2: cell_a (which contains 10)
}
Мы хотим сложить значения, связанные с ключами 1
и 2
, и сохранить результат с ключом 3
. Давайте рассмотрим операции, происходящие в стеке:
- Поместить ключ
1
в стек:stack = (1)
- Вызвать
DICTGET
для ключа1
(извлечь значение, связанное с ключом наверху стека): Извлекает значение 10.stack
= (10) - Поместить ключ
2
в стек:stack = (10, 2)
- Вызвать
DICTGET
для ключа2
: Извлекает ссылку на Cell_A.stack
= (10, Cell_A) - Загрузить значение из Cell_A: Выполняется инструкция по загрузке значения из ссылки на ячейку.
stack
= (10, 10) - Вызвать инструкцию
ADD
: При выполнении инструкцииADD
TVM извлечёт два верхних элемента из стека, сложит их и поместит результат обратно в стек. В этом случае верхние два элемента — 10 и 10. После сложения стек будет содержать результат:stack
= (20) - Поместить ключ 3 в стек:
stack = (20, 3)
- Вызвать
DICTSET
: Сохраняет 20 с ключом 3. Обновлённая хеш-таблица:
{
1: 10,
2: cell_a,
3: 20
}
Чтобы сделать то же самое в EVM, нам нужно задать mapping, хранящий пары ключ-значение, а также функцию, в которой мы будем работать напрямую с 256-битными целыми числами из маппинга. Важно отметить, что EVM поддерживает сложные структуры данных с помощью языка Solidity, но эти структуры построены поверх более простой модели данных EVM, которая принципиально отличается от более выразительной модели данных TVM.