Транзакция в TON — процесс, включающий:
- Отправку входящего сообщения для активации смарт-контракта;
- Выполнение действий внутри контракта;
- Генерацию исходящих сообщений другим участникам.
Общие компоненты транзакции#
- Аккаунт, которому принадлежит транзакция;
- Логическое время транзакции;
- 0 или 1 входящее сообщение;
- N исходящих сообщений;
- Начальное и конечное состояние аккаунта (включая баланс);
- Общая сумма сборов валидаторов;
- Подробное описание (тип + промежуточные шаги).
Логическое время
- Точное упорядочивание событий в асинхронной системе смарт-контрактов;
- Каждое исходящее сообщение получает свой timestamp;
- Строго возрастающее для сообщений одного контракта;
- Валидаторы используют для упорядочивания и обработки.
Виды транзакций#
| Тип | Назначение |
|---|---|
| Обычные | Обрабатывают входящее сообщение, меняют состояние, генерируют исходящие |
| Хранения | Сбор платежей за хранение аккаунта (никакого кода не вызывают) |
| Tick | В начале каждого блока мастерчейна |
| Tock | В конце блока мастерчейна |
| Разделяющие (split) | Аккаунт разделяется на ξ и ξ' (шардирование) |
| Объединяющие (merge) | Объединение аккаунтов (оптимизация) |
Фазы обычной транзакции#
- Фаза хранения (storage) — сбор платы за хранение;
- Фаза кредитования (credit) — аккаунт получает сумму входящего сообщения;
- Вычислительная фаза (compute) — код контракта вызывается в TVM, завершается exit-кодом + новые данные + список действий;
- Фаза действия (action) — выполнение действий из списка;
- Фаза отскока (bounce) — если прервана и установлен bounce-флаг → сообщение возвращается отправителю.
Особенности#
Транзакции хранения
- Вставляются валидаторами при условиях:
- Аккаунт долго не использовался;
- Баланс недостаточен для оплаты хранения;
- Если баланс упадёт ниже минимума → аккаунт замораживается, код и данные заменяются хешем.
Tick + Tock
- Зарезервированы для специальных системных смарт-контрактов;
- Автоматически вызываются в каждом блоке.
Разделение
- Транзакция подготовки разделения (как tock) для ξ — последняя в блоке шардчейна;
- Транзакция установки разделения для ξ' со ссылкой на подготовку.
Объединение
- Транзакция подготовки объединения для ξ' → конвертация состояния и баланса в сообщение-конструктор;
- Транзакция установки объединения для ξ обрабатывает сообщение.