Почему перевод USDT требует 65,000 энергии, а на пустой адрес — 131,000
Спросите, сколько энергии берёт перевод USDT в TRON, — и любой источник даст одни и те же два ответа: около 65,000 единиц или около 131,000, когда у получателя USDT нет. По ставке сжигания сети, 100 sun за единицу, это те самые 6.5 TRX и 13.1 TRX, которые кошельки показывают как комиссию. Откуда берутся эти два числа, почти никто не говорит. Мы спросили ноду, и её собственный учёт делит каждое из них надвое. Больше трёх четвертей энергии — это надбавка по динамической модели энергии сети, и USDT платит её по самому высокому коэффициенту, который разрешает сеть. Лишние 66,000 для адреса без USDT — это 15,000 единиц дополнительной работы с той же надбавкой.
Что сообщает нода об одном переводе
Нода умеет прогнать вызов контракта, не отправляя его. Она исполняет вызов на собственной копии цепочки и после ответа отбрасывает результат, так что ничего не подписывается и не оплачивается. 7 сентября 2026 года мы прогнали четыре таких вызова — каждый переводом наименьшей суммы, одной единицы, то есть миллионной доли USDT, с кошелька, где лежали тысячи, — к четырём видам получателей: с USDT и без него, с аккаунтом в сети и без. Через несколько минут мы повторили набор на других адресах — всего восемь вызовов.
В каждом ответе есть цифра, которую все цитируют, — energy_used, и рядом вторая — energy_penalty. Оба прогона дали для каждого вида получателя одну и ту же пару:
| Получатель, 7 сентября 2026 года | energy_used | energy_penalty | Разница |
|---|---|---|---|
| USDT есть, аккаунт активирован | 64,285 | 49,635 | 14,650 |
| USDT есть, аккаунт ни разу не активирован | 64,285 | 49,635 | 14,650 |
| USDT нет, аккаунт активирован | 130,285 | 100,635 | 29,650 |
| USDT нет, аккаунт ни разу не активирован | 130,285 | 100,635 | 29,650 |
Есть ли у получателя аккаунт, значения не имеет: адрес, о котором сеть никогда не слышала, стоит столько же, сколько старый с таким же балансом. Решает баланс, и граница проходит по нулю. Во втором прогоне получатель с одной-единственной единицей USDT, миллионной долей токена, получил более дешёвую цифру. Что это значит для заказа, написано в посте о неактивированных аккаунтах.
27 октября 2026 года мы повторили два из этих вызовов — с того же кошелька на те же два адреса, один с USDT и один пустой. Оба вернули те же energy_used и energy_penalty, что и в сентябре, с точностью до единицы.
Надбавка и её параметры
У сети есть переключатель того, что она называет динамической энергией, а у каждого контракта — свой energy_factor. С ним идут ещё три параметра сети, и, судя по названиям, это порог использования, шаг, на который растёт коэффициент, и потолок: контракт, которым активно пользуются, платит за каждый вызов больше энергии. Мы прочитали параметры 3 сентября 2026 года и ещё раз 27 октября, когда заодно прочитали собственный коэффициент USDT. Между двумя чтениями параметры не менялись.
| Прочитано из сети | Значение |
|---|---|
Динамическая энергия включена, getAllowDynamicEnergy | 1 |
Порог, getDynamicEnergyThreshold | 5,000,000,000 |
Шаг, getDynamicEnergyIncreaseFactor | 2,000 |
Потолок, getDynamicEnergyMaxFactor | 34,000 |
energy_factor у USDT, 27 октября 2026 года | 34,000 |
Ставка сжигания в sun за единицу, getEnergyFee | 100 |
USDT стоит на потолке. В тот же вечер, когда мы прочитали этот коэффициент, перевод держателю показал тот же energy_penalty, что и в сентябре, — значит, сентябрьские цифры тоже сходятся с коэффициентом 34,000.
Разложение 65,000 и 131,000
Прочитаем energy_penalty как надбавку, а остальное — как собственную работу вызова, его базовую стоимость. Тогда два вида перевода различаются на 15,000 единиц работы и 51,000 единиц надбавки:
| Энергия на перевод | USDT есть | USDT нет | Разница |
|---|---|---|---|
| Базовая стоимость | 14,650 | 29,650 | 15,000 |
| Надбавка | 49,635 | 100,635 | 51,000 |
| Итого | 64,285 | 130,285 | 66,000 |
Арифметика в колонке разницы точна: добавочные 15,000 единиц работы несут 51,000 единиц надбавки — семнадцать на каждые пять, а это и есть коэффициент 34,000, взятый в десятитысячных долях. Значит, 66,000, которые разделяют две цитируемые цифры, — это один блок дополнительной работы с надбавкой по коэффициенту USDT.
Остальной вызов немного отклоняется от этой ставки. Семнадцать пятых от 14,650 дали бы 49,810, а нода сообщила 49,635 — на 175 единиц меньше. Случай пустого баланса тоже на 175 единиц ниже, так что зазор лежит в работе, общей для обоих видов. Поскольку 49,635 не получается как семнадцать пятых ни от какого целого числа, недостача не может быть куском вызова, ускользающим от надбавки, а коэффициент читался как 34,000 в тот вечер, когда тот же вызов показал ту же надбавку. Картина похожа на округление, как если бы надбавка вычислялась по отдельности на каждом из множества мелких шагов вызова. Мы не сверяли это с кодом ноды, поэтому таблица печатает то, что сообщила нода, а 175 единиц остаются необъяснёнными.
Из чего состоят добавочные 15,000 единиц работы
Баланс USDT — это ячейка в собственном хранилище контракта токена, отдельная от аккаунта TRON, поэтому адрес без аккаунта и может держать USDT. Перевод на адрес с балансом перезаписывает ячейку, в которой уже лежит число. Перевод на нулевой баланс пишет в пустую. Обычное объяснение разницы — запись в пустую ячейку стоит дороже перезаписи, и 15,000 с ним согласуется. Наши замеры измерили стоимость, но причину не проверяли, так что считайте это объяснением, с которым числа согласны.
Если это так, адрес, который когда-то держал USDT и отправил всё без остатка, должен стоить по большей цифре: его ячейка снова на нуле. По меньшей мере одна страница в поисковой выдаче утверждает, что такой адрес всё же может получить меньшую. Замера под этот случай мы не планировали, но один из записанных его всё равно покрывает. Получатель с нулевым балансом в первом прогоне был взят из ленты переводов USDT как отправитель: ровно за неделю до замера он отправил чуть больше сорока четырёх USDT. Значит, USDT на нём было, и его опустошили, а перевод на него обошёлся в 130,285 — столько же, сколько на адрес, сгенерированный для прогона. Это один адрес, прочитанный один раз.
От 64,285 к 65,000
Круглые цифры лежат чуть выше замеренных. Наш сервис округляет так же: заказ у нас рассчитывается на 65,000 или 131,000 единиц для двух видов перевода при замеренной потребности 64,285 и 130,285. В обоих случаях остаётся запас в 715 единиц. Округлять вверх безопаснее: перевод, которому не хватило энергии, либо сжигает TRX отправителя на недостающее, либо, если сжигать ничего не разрешено, завершается ошибкой, когда энергия уже потрачена (как выглядит такой отказ). Если сжигать, а не арендовать, замеренные цифры выходят чуть меньше круглых:
| Получатель | Замеренная энергия | Сжигание по 100 sun за единицу |
|---|---|---|
| USDT есть | 64,285 единиц | 6.4285 TRX |
| USDT нет | 130,285 единиц | 13.0285 TRX |
Обе цифры — это одна только энергия. Перевод тратит ещё и пропускную способность — отдельный счётчик с гораздо меньшим счётом (энергия и пропускная способность рядом).
Что сдвинуло бы цифры
Первый рычаг — коэффициент. Он принадлежит контракту и, судя по названиям параметров, растёт ступенями вместе с использованием контракта, вплоть до потолка. USDT сейчас на потолке, так что отсюда коэффициент может только держаться или снижаться — если не изменят сам потолок. Порог, шаг и потолок — параметры сети, и менять их может управление сетью. На потолке надбавка составляет больше трёх четвертей того, что тратит перевод USDT. По этим цифрам без неё тот же перевод держателю обошёлся бы в свою базовую стоимость — 14,650 единиц.
Второй — ставка сжигания, getEnergyFee: 100 sun за единицу в оба дня, когда мы её читали. Она определяет, сколько TRX стоит сжигание энергии, а количество энергии остаётся прежним, какой бы она ни была. Сеть меняла её и раньше, а руководство по комиссии показывает арифметику по сегодняшней ставке. Сторона энергии не сдвинулась за семь недель между двумя нашими сериями замеров: 64,285 и 130,285 — оба раза.
Узнать, какая из двух цифр достанется получателю, можно до того, как что-либо подписано: GET /v1/address-check в справочнике API →