Transaction Phase
Этап исполнения транзакции в TVM: storage → credit → compute → action → bounce. Каждая фаза изменяет состояние контракта по своим правилам.
Синонимы: фаза транзакции, ton tx phases, transaction phases
Transaction Phase — это последовательность этапов, через которые проходит каждая транзакция в TON. В отличие от EVM, где транзакция — это монолитный вызов, в TON исполнение делится на несколько чётко выделенных фаз, и понимание их структуры критично при отладке.
Полный список фаз
- Storage Phase. Сначала сеть списывает с контракта накопленную storage-fee — оплату за хранение состояния с момента предыдущей транзакции.
- Credit Phase. Если транзакция инициирована входящим internal-сообщением, к балансу контракта прибавляется
valueсообщения. Это происходит до compute, чтобы контракт мог потратить полученные TON в той же транзакции. - Compute Phase. TVM исполняет код контракта: парсит сообщение, обновляет данные, формирует список исходящих сообщений (actions). Это самая «дорогая» фаза — здесь сжигается gas.
- Action Phase. Действия из списка применяются: исходящие сообщения отправляются, обновляется storage, выполняется reserve-логика. Может частично провалиться, если, например, баланса не хватает на forward-fee.
- Bounce Phase. Если compute-phase упала с ошибкой и у входящего сообщения был
bounce=true, формируется bounce-сообщение и отправляется обратно отправителю.
Почему это важно
- Exit code транзакции — это код возврата compute-phase. Код 0 означает успех, всё остальное — ошибки (например, 13 = out of gas, 33 = invalid signature, и т. д.).
- Action-phase может упасть отдельно. Compute прошёл успешно, но action не смог отправить сообщение — у этого свой код ошибки.
- Storage-phase идёт всегда. Даже если компьют-фаза упала, storage-fee уже списана.
- Bounce — отдельная транзакция. Возврат TON в результате bounce — это новая транзакция в шарде отправителя, и у неё свои фазы.
Эта структура — основа отладки. Когда транзакция «не сработала», первый шаг — посмотреть, какая именно фаза не прошла и с каким exit-code.