Виды транзакций в блокчейне TON
Транзакция в TON — это процесс, включающий в себя отправку входящего сообщения для активации смарт-контракта, выполнение соответствующих действий внутри контракта, а также отправку исходящих сообщений другим участникам сети, если это предусмотрено контрактом.
Общие компоненты транзакции
Каждая транзакция содержит следующие данные или косвенно к ним относится:
- Аккаунт, которому принадлежит транзакция
- Логическое время транзакции
- Одно или ноль входящих сообщений, обработанных транзакцией
- Количество сгенерированных исходящих сообщений
- Исходящие сообщения
- Начальное состояние аккаунта (включая его баланс)
- Конечное состояние аккаунта (включая его баланс)
- Общая сумма сборов валидаторов
- Подробное описание транзакции, содержащее всю или некоторую информацию, необходимую для её проверки, включая вид транзакции и некоторые промежуточные шаги, которые были выполнены
Логическое время в TON Blockchain служит для точного упорядочивания событий в системе, особенно важно в условиях асинхронности работы смарт-контрактов. Оно присваивается каждому исходящему сообщению и событию, создаваемым в транзакции, что позволяет считать создание каждого исходящего сообщения атомарным событием, зависящим от предыдущих сообщений и транзакций в том же аккаунте. Это обеспечивает строго возрастающее логическое время для сообщений, созданных одним и тем же смарт-контрактом, и помогает валидаторам эффективно упорядочивать и обрабатывать транзакции.
Схема отображает процесс транзакции в TON Blockchain, где показано взаимодействие смарт-контракта с сообщениями. Входящее сообщение (in msg) поступает на смарт-контракт (обозначен кружком с буквой «A»). Смарт-контракт, получив сообщение, может выполнить определённые действия и, в зависимости от их результата, сгенерировать одно или несколько исходящих сообщений (out msg 1 и out msg 2), которые отправляются другим участникам сети. Число «0» является кодом завершения (exit code), который показывает, что смарт-контракт завершил выполнение успешно и без ошибок. Транзакциями на схеме являются стрелки, обозначающие передачу данных от входящего сообщения к смарт-контракту и далее к исходящим сообщениям.
Виды транзакций
- Обычные транзакции
- Транзакции хранения
- Tick-транзакции
- Tock-транзакции
- Разделяющие транзакции
- Объединяющие транзакции
Обычные транзакции
Принадлежат аккаунту. Они обрабатывают одно входящее сообщение с адресом назначения, вычисляют новое состояние аккаунта и генерируют несколько исходящих сообщений с источником аккаунта.
Фазы обычной транзакции
Обычная транзакция выполняется в несколько фаз, которые можно рассматривать как тесно связанные «подтранзакции»:
- Фаза хранения — Собирает необходимые платежи за хранение состояния аккаунта на данный момент времени.
- Фаза кредитования — Аккаунт кредитуется на сумму полученного входящего сообщения.
- Вычислительная фаза — Код смарт-контракта вызывается внутри экземпляра TVM и завершается с выходным кодом, новыми постоянными данными и списком действий.
- Фаза действия — Если смарт-контракт успешно завершён, выполняются действия из списка.
- Фаза отскока — Если транзакция была прервана и входящее сообщение имеет установленный bounce-флаг, оно «отскакивает» его оригинальному отправителю.
Транзакции хранения
Транзакции этого типа могут быть вставлены валидаторами при соблюдении определённых условий сети, например, когда аккаунт долго не использовался или его баланс недостаточен для оплаты хранения. Они не обрабатывают никаких входящих сообщений и не вызывают какой-либо код. Их единственным назначением является сбор платежей за хранение аккаунта, что влияет на его статистику хранения и баланс. Если результирующий баланс Toncoin на аккаунте опустится ниже определённой суммы, аккаунт может быть заморожен, а его код и данные заменены их комбинированным хешем. Транзакции хранения очень похожи на отдельную фазу хранения обычной транзакции.
Tick и tock транзакции
Транзакции tick и tock зарезервированы для специальных системных смарт-контрактов, которые должны автоматически вызываться в каждом блоке. Tick-транзакции вызываются в начале каждого блока мастерчейна, а tock-транзакции — в конце.
Разделяющие транзакции
Разделяющие транзакции на самом деле состоят из двух транзакций. Если аккаунт ξ должен быть разделён на два аккаунта ξ и ξ' (например, для оптимизации шардирования, масштабируемости сети или распределения данных и нагрузки):
- Сначала выполняется транзакция подготовки разделения, похожая на tock-транзакцию для аккаунта ξ. Это должна быть последняя транзакция для ξ в блоке шардчейна.
- Затем добавляется транзакция установки разделения для аккаунта ξ' со ссылкой на соответствующую транзакцию подготовки разделения.
Объединяющие транзакции
Объединяющие транзакции также состоят из двух действий. Если аккаунт ξ' нуждается в объединении с аккаунтом ξ (например, для оптимизации шардирования, уменьшения нагрузки на сеть или объединения данных из разных шардчейнов):
- Сначала выполняется транзакция подготовки объединения для ξ', которая преобразует всё его постоянное состояние и баланс в специальное сообщение- конструктор с адресом назначения ξ.
- Затем транзакция установки объединения для ξ, ссылающаяся на соответствующую транзакцию подготовки объединения, обрабатывает это сообщение-конструктор.