TVM и EVM
Ethereum Virtual Machine (EVM) и TON Virtual Machine (TVM) - это две стековые виртуальные машины, разработанные для запуска кода смарт-контрактов. Несмотря на то, что у них есть общие черты, между ними есть заметные различия.
Представление данных
Ethereum Virtual Machine (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).
- Обработка сложных данных
- Возможность управлять сложными типами данных, изначально заложенная в архитектуре VM, снижает необходимость их имитации в смарт-контрактах, что потенциально снижает стоимость и увеличивает скорость выполнения.
- Конструкция TVM особенно выгодна для приложений, требующих сложного управления состоянием или взаимосвязанных структур данных, предоставляя разработчикам надежную основу для создания сложных и масштабируемых децентрализованных приложений.
Стековая машина
Ethereum Virtual Machine (EVM)
- EVM работает как традиционная стековая машина, где она использует стек "последним пришел — первым вышел" (LIFO) для управления вычислениями.
- Она обрабатывает операции, помещая и выталкивая 256-битные целые числа, которые являются стандартным размером для всех элементов в стеке.
TON Virtual Machine (TVM)
- TVM также функционирует как стековая машина, но с ключевым отличием: она поддерживает как 257-битные целые числа, так и ссылки на ячейки.
- Это позволяет TVM помещать и выводить эти два различных типа данных в стек/из стека, обеспечивая повышенную гибкость в прямой управлении данными.
Пример операций со стеком
Предположим, мы хотим сложить два числа (2 и 2) в EVM. Процесс будет включать помещение чисел в стек и последующий вызов инструкции 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