Пять минут или час: как выбрать срок аренды энергии TRON
Мы продаём энергию TRON на двух сроках аренды: 300 секунд и 3,600 секунд. Обе доставляют одну и ту же энергию на один и тот же перевод, и обе оцениваются за единицу энергии на весь срок. Час оставляет эту энергию на адресе дольше. Пять минут подходят программе, которая отправляет по сигналу, а лишнее время стоит оплачивать, когда между приходом энергии и уходом перевода стоит человек или длинный пакет.
Аренда — это количество энергии и срок
Заказ называет перевод и, если нужно что-то кроме пяти минут по умолчанию, duration_s. Энергия определяется переводом: около 65,000 единиц, когда у получателя USDT уже есть, около 131,000, когда нет. Срок аренды это количество не меняет. Цена определяется сроком аренды: current_price_sun — это стоимость одной единицы на весь срок, так что цена часа — это цена единицы, удерживаемой в течение часа, и умножать на двенадцать нечего.
На часовой аренде заказ на один перевод покупает энергию на один перевод и час, чтобы его отправить. Перевод тратит те же единицы на второй минуте, что и на пятидесятой, а потраченная энергия почти не возвращается, пока идёт аренда: использованная энергия счёта сходит обратно в течение следующих суток, а час составляет примерно двадцать четвёртую часть этих суток. Сколько держится арендованная энергия разбирает этот суточный цикл и двое других часов делегации.
Окно — это срок аренды без трёх секунд
Когда энергия подтверждена на адресе-отправителе, в заказе появляется send_before. На пятиминутной аренде это 297 секунд после подтверждения, на часовой — 3,597. Три секунды одинаковы для любого срока аренды, и всё, что они делают, — заставляют окно закрыться раньше аренды. Сеть отсчитывает аренду от блока, в котором прошла делегация, мы отсчитываем окно от момента, когда увидели эту делегацию подтверждённой, и зазор между двумя моментами обычно больше трёх секунд. Перевод, отправленный в самом конце любого из окон, может дойти до сети, когда энергия уже ушла домой, и сжечь полную комиссию в TRX.
Этот зазор одинаков по размеру на обеих арендах. На пяти минутах он вычитается из 297 секунд, на часе — из 3,597, а правило остаётся тем же: отправляйте по вебхуку order.ready или по первому опросу, показавшему send_before, и держитесь подальше от дедлайна.
У пакета один общий дедлайн. Он отсчитывается от последней делегации, подтверждённой в заказе, и не может быть позже, чем позволяет первая успешная покупка, ведь энергия не может начаться раньше, чем её купили. Покупаем мы примерно по секунде на позицию, а позиции, до которых мы добираемся, когда до конца окна остаётся меньше тридцати секунд, не покупаются: они закрываются как failed с purchase_failed, а резерв под них возвращается. На пятиминутной аренде это обрезает крупный пакет примерно на 269-м переводе. На часовой полный пакет из 500 помещается с большей частью окна в запасе.
Что покупает час
Самое простое применение — набор переводов, которые вы отправите в течение часа, но не все сразу. Прогон выплат, который уходит по мере поступления одобрений, или очередь, которую ваш код разбирает в собственном темпе, можно заказать одним пакетом на часовой аренде. Энергия на все переводы приходит на кошелёк-отправитель вместе, и каждый перевод уходит, когда готов. Заказывайте только то, что отправите. Позиция, окно которой закрылось неиспользованным, заканчивается как expired и оплачивается, потому что энергия была доставлена и простояла всё окно.
Час покрывает и отправку, которая ждёт человека. В mode A вы сами подписываете и отправляете перевод, а заказ никогда не видит, как он подписан: подходят и аппаратный кошелёк, и второй согласующий. Пять минут оставляют согласующему мало места, час оставляет много. Mode B второго согласующего не вмещает, потому что принимает одну подпись владельца на Permission_id 0 и отклоняет мультиподпись.
Mode B нуждается в часе меньше всего — даже для транзакции, подписанной заранее. Там вы отдаёте нам подписанный перевод, а мы отправляем его в сеть в том же проходе, который помечает энергию готовой, так что один перевод от более долгого окна ничего не выигрывает. Окно к тому же ограничено собственным сроком действия транзакции за вычетом тридцати секунд. Поэтому час помогает заказу в mode B, только когда покупка пакета занимает больше пяти минут и его транзакции подписаны так, чтобы действовать дольше. Так подписать можно: мы принимаем срок действия до 23 часов 59 минут после того, как транзакция дошла до нас. Что на самом деле делает API энергии TRON разбирает mode B начиная с запроса.
Заказ на объём (energy_units) больше 131,000 единиц обязан брать час. Такая позиция покупается частями у нескольких продавцов, и срок каждой части идёт от её собственной делегации, поэтому на пяти минутах первая часть начала бы истекать, пока последняя ещё приходила. Более короткая аренда отклоняется ответом 400 invalid_request, details.reason — bulk_needs_longer_lease.
Во сколько обходился час по сравнению с пятью минутами
Большая часть рынка продаёт час. Из семнадцати прайс-листов, которые наше наблюдение прочитало 7 сентября 2026 года, шестнадцать называли один час. У каждой из двух наших аренд своя цена, пересчитываемая по рынку, поэтому ни одна не выводится из другой. GET /v1/tariff/history рисует одну аренду на запрос, а с range=30d возвращает 720 почасовых точек того, по чему мы продавали. Обе серии мы прочитали 27 октября 2026 года и сравнили час за часом.
| Час против пяти минут, 30 дней, прочитано 27 октября 2026 года | Результат |
|---|---|
| Почасовых точек в каждой серии | 720 |
| Часов, когда часовая аренда стоила дороже | 416 из 720 |
| Часов, когда обе стоили одинаково | 116 из 720 |
| Часов, когда часовая аренда стоила дешевле | 188 из 720 |
| Сколько стоил час на каждые 100, которые стоили пять минут, по отдельным часам | от 71 до 122 |
| То же, все 30 дней вместе | 102 |
| То же, каждая из последних четырёх полных недель, от старых к новым | 102, 101, 98, 106 |
| То же, 46 часов с 00:00 UTC 26 октября | 108 |
Часовая аренда стоила дороже в большую часть часов и дешевле в некоторые, а за месяц обе вышли близко. Наценка менялась от недели к неделе, и в одну из четырёх недель час вышел дешевле. Большая часть того месяца продавалась по прежнему суточному расписанию цен, а 26 октября его заменила одна цена на каждую аренду. Последняя строка начинается в 00:00 UTC этого дня, так что её первые часы могли ещё нести расписание, а двух суток слишком мало, чтобы сказать, удержится ли разрыв.
История фиксирует, по чему мы продавали, и ничего не обещает на следующий час. Сегодняшние цены на обе аренды — на странице цен, а products[] в GET /v1/tariff возвращает те же цифры. Когда энергия TRON дешевле всего читает ту же историю по часам суток.
Как выбрать срок аренды
Выбирайте по самому долгому, что может занять ваша отправка после прихода энергии. Если это секунды — берите пять минут. Если дольше — берите час и заказывайте только те переводы, которые сделаете внутри него.
Пусть ваш код каждый раз читает сроки аренды из products[]. Продукты включаются и выключаются без релиза: суточная аренда снята с продажи 25 октября 2026 года, а заказ или оценка, называющие срок, которого нет в продаже, получают 400 invalid_request, а действующие сроки перечислены в details.allowed. Срок аренды входит в тело заказа, поэтому повтор под тем же ключом идемпотентности с другим duration_s отклоняется ответом 409 idempotency_conflict и ничего не создаёт.
Кошельку, который отправляет весь день, не подходит ни одна аренда, а дольше часа в продаже ничего нет. Для него и создано правило Auto-refill: вы называете адрес и суточный лимит, и кошелёк пополняется заново после каждого своего перевода.
Чего мы не измеряли
Мы не измеряли, сколько заказы наших клиентов на часовой аренде ждут между доставкой и отправкой, поэтому ничто здесь не говорит, какую часть часа использует типичный заказ. Зазор между началом аренды в сети и у нас выведен из того, как считается окно, и отдельно мы его не засекали. Сравнение цен охватывает один месяц, почти целиком под прежним суточным расписанием.
Оцените один и тот же пакет на обеих арендах, прежде чем выбирать, — ничего при этом не резервируется: POST /v1/estimate принимает duration_s →