Кто платит за вызов контракта в TRON: распределение ресурсов

Как виртуальная машина TRON решает, кто платит энергию за вызов контракта: consume_user_resource_percent, origin_energy_limit и доля вызывающего.

Опубликовано · Обновлено

В блокчейне TRON плата за исполнение смарт-контракта не обязательно ложится только на вызывающего. В отличие от EVM-сетей, где газ всегда платит аккаунт, инициировавший транзакцию, виртуальная машина TRON (TVM) использует модель с двумя плательщиками, которой управляют две настройки на уровне контракта: consume_user_resource_percent и origin_energy_limit.

Эти два параметра объясняют, почему отправитель USDT TRC20 в итоге платит всю энергию, тогда как некоторые децентрализованные приложения (DApp) и контракты в тестовой сети могут оплачивать исполнение за своих пользователей.

Контракт USDT TRC20 (TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t) задаёт consume_user_resource_percent равным 30 и origin_energy_limit равным 10 000 000[3]: на бумаге его создатель покрывает 70% каждого вызова. На аккаунте создателя было 9 330 энергии, и на момент нашей проверки 03.10.2026 она была израсходована полностью[4], поэтому отправитель платит все 64 285 или 130 285 энергии.

Порядок распределения ресурсов в TVM

Когда транзакция вызывает метод смарт-контракта в TRON, TVM определяет, с кого списывать ресурсы, в следующем порядке:

Contract Execution Request
            |
            v
Check `consume_user_resource_percent` (0 - 100%)
            |
  +---------+---------+
  |                   |
Caller Portion     Deployer Portion (100 - X%)
  |                   |
  |                   v
  |         Check deployer `origin_energy_limit` & balance
  |                   |
  |         +---------+---------+
  |         |                   |
  |     Sufficient         Exhausted
  |         |                   |
  v         v                   v
Caller   Deployer            Fallback:
Energy   Energy              Billed to Caller
  1. Доля создателя (consume_user_resource_percent):
    • При значении 100 всю энергию платит вызывающий.
    • При значении 0 создатель контракта платит 100% энергии, если у него есть доступные ресурсы.
    • При значении от 1 до 99 энергия на исполнение делится пропорционально между вызывающим и создателем.
  2. Потолок энергии создателя (origin_energy_limit):
    • Максимум энергии, который создатель вносит в один вызов. Сверх него остаток платит вызывающий.
  3. Переход оплаты на вызывающего:
    • Если застейканная энергия создателя закончилась или превышен origin_energy_limit, TVM списывает недостающее с вызывающего. Если у вызывающего тоже нет ни энергии, ни TRX, транзакция откатывается с ошибкой OUT_OF_ENERGY.

Что это значит для разработчиков

  • USDT: доля создателя задана (70%), но не обеспечена энергией, поэтому отправители платят всё сами: им нужна энергия или TRX.
  • Подключение пользователей без газа: разработчики DApp могут застейкать TRX на адресе создателя контракта и задать consume_user_resource_percent = 0, чтобы оплачивать энергию вызывающих, но не более origin_energy_limit за вызов (bandwidth вызывающие по-прежнему платят сами).

Чтобы проверить распределение ресурсов контракта, протестируйте вызовы в Nile по нашему руководству о тестировании энергии контракта в Nile.

Вопросы и ответы

Всегда ли за исполнение смарт-контракта в TRON платит вызывающий?

По умолчанию да. Но TRON позволяет создателю контракта частично оплачивать энергию вызывающих через параметры consume_user_resource_percent и origin_energy_limit.

Что такое consume_user_resource_percent в TRON?

Это параметр настройки смарт-контракта (от 0 до 100), который определяет, какой процент энергии на исполнение списывается с вызывающего, а какой — с создателя контракта.

Кто платит за переводы USDT TRC20?

На практике отправитель. В контракте USDT consume_user_resource_percent равен 30, то есть создатель покрывал бы 70% каждого вызова, но не более 10 000 000 энергии. Однако на аккаунте создателя было 9 330 энергии, и на 03.10.2026 она была израсходована полностью, поэтому вся стоимость ложится на отправителя.

Что происходит, когда энергия создателя контракта закончилась?

Остаток платит вызывающий: сначала из своей энергии, затем сжиганием TRX.