К основному содержанию
T TON Adoption
← Словарь
NODE/03 · Term

Transaction Phase

Этап исполнения транзакции в TVM: storage → credit → compute → action → bounce. Каждая фаза изменяет состояние контракта по своим правилам.

Синонимы: фаза транзакции, ton tx phases, transaction phases

Transaction Phase — это последовательность этапов, через которые проходит каждая транзакция в TON. В отличие от EVM, где транзакция — это монолитный вызов, в TON исполнение делится на несколько чётко выделенных фаз, и понимание их структуры критично при отладке.

Полный список фаз

  1. Storage Phase. Сначала сеть списывает с контракта накопленную storage-fee — оплату за хранение состояния с момента предыдущей транзакции.
  2. Credit Phase. Если транзакция инициирована входящим internal-сообщением, к балансу контракта прибавляется value сообщения. Это происходит до compute, чтобы контракт мог потратить полученные TON в той же транзакции.
  3. Compute Phase. TVM исполняет код контракта: парсит сообщение, обновляет данные, формирует список исходящих сообщений (actions). Это самая «дорогая» фаза — здесь сжигается gas.
  4. Action Phase. Действия из списка применяются: исходящие сообщения отправляются, обновляется storage, выполняется reserve-логика. Может частично провалиться, если, например, баланса не хватает на forward-fee.
  5. 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.

См. также