Два счётчика, два счёта
| Energy | Bandwidth | |
|---|---|---|
| За что платит | Исполнение кода смарт-контракта | Размер транзакции в байтах |
| Кому нужен | USDT и любым другим переводам TRC-20, обменам, approve | Всем транзакциям без исключения |
| Бесплатный лимит | Нет | 600 единиц на аккаунт в сутки |
| Курс сжигания при нехватке | Задан getEnergyFee, ~0,0001 TRX за единицу | 0,001 TRX за единицу |
| Обычный перевод USDT | ~64 285, либо ~130 285 первому получателю | ~345 |
| Как получить | Застейкать TRX, арендовать либо позволить сети сжечь ваши TRX | Те же три пути, но обычно хватает суточного лимита |
Energy: плата за вычисления
Energy измеряет работу виртуальной машины TRON. У каждой операции, которую исполняет контракт, есть цена, и их сумма — это то, что расходует ваша транзакция.
Поэтому перевод USDT дорогой, а перевод TRX — нет. Перемещение TRX протокол выполняет сам как обновление баланса. Перемещение USDT означает просьбу к контракту обновить собственный реестр, и вы платите за каждый шаг этой работы.
- Бесплатного лимита энергии не существует. У адреса, который никогда не стейкал и не арендовал, её ноль.
- Энергия — это пул адреса, а не резерв под конкретную транзакцию. Всё, что вы подписываете, черпает из одного пула.
- Застейканная и делегированная энергия восстанавливается примерно за 24 часа после расхода.
Bandwidth: плата за место
Bandwidth измеряет байты. Транзакция, сериализуемая в 345 байт, требует 345 Bandwidth независимо от того, что она делает: вызов контракта и обычный перевод тарифицируются по размеру одинаково.
Каждому аккаунту ежедневно даётся 600 бесплатных Bandwidth, лимит обновляется скользящим окном. Этого с запасом хватает на один перевод TRC-20 и совсем не хватает на два — поэтому неожиданностью обычно оказывается именно второй перевод за день.
В абсолютных числах Bandwidth дёшев: около 0,345 TRX за перевод, если приходится сжигать. Проблемы он создаёт не ценой, а тем, что кошельку с арендованной энергией и нулём TRX платить за него нечем.
Почему один не заменяет другой
Это отдельные счётчики с отдельным учётом, и сеть проверяет оба. Наличие 650 000 энергии не даёт ни одного байта Bandwidth, а полный суточный лимит Bandwidth не исполнит ни строчки кода контракта.
- Энергии много, Bandwidth и TRX нет — транзакция отклоняется ещё до исполнения.
- Bandwidth много, энергии и TRX нет — вызов контракта падает с OUT_OF_ENERGY, а комиссию всё равно списывают.
- Не хватает обоих, но есть TRX — транзакция пройдёт, и вы заплатите по собственному курсу пересчёта сети за оба ресурса, а это самый дорогой способ совершать операции.
Примеры расчёта
| Транзакция | Energy | Bandwidth | Примечание |
|---|---|---|---|
| Отправить TRX | 0 | ~270 | Покрывается бесплатным лимитом |
| Отправить USDT существующему держателю | ~64 285 | ~345 | Первый перевод за сутки по Bandwidth бесплатен |
| Отправить USDT первому получателю | ~130 285 | ~345 | Новая ячейка хранилища удваивает энергию |
| Разрешить контракту тратить USDT (approve) | ~15 000–30 000 | ~350 | Зависит от контракта |
| Отправить на неактивированный адрес | Как выше | ~100 | Плюс 1 TRX за создание аккаунта |
Как получить каждый из них
Три пути к энергии не одинаково применимы к Bandwidth, и эту асимметрию полезно знать до того, как строить на ней планы.
| Путь | Energy | Bandwidth |
|---|---|---|
| Ничего не делать | Сеть сжигает TRX по курсу getEnergyFee | 600 бесплатных единиц в сутки, дальше сжигается TRX |
| Застейкать TRX | Начисляет энергию пропорционально стейку, восстанавливается ежедневно | Начисляет Bandwidth так же, но бесплатного лимита обычно достаточно |
| Арендовать | Обычный выбор: статья крупная, предсказуемая, её стоит оптимизировать | Возможно и осмысленно в основном при высокой частоте отправок |
На практике почти все оптимизируют энергию и не думают о Bandwidth, потому что энергия — счёт на два порядка больше. Bandwidth становится интересен, только когда с одного адреса уходит много транзакций в день и бесплатного лимита перестаёт хватать.
Как посмотреть свои ресурсы
Оба счётчика видны в блокчейне, поэтому гадать, что есть на адресе, не нужно.
- В TronScan откройте адрес и посмотрите панель Resources. Она показывает Energy и Bandwidth в формате «доступно из всего» и отделяет собственные ресурсы от делегированных вам.
- Программно вызовите getaccountresource на любой ноде. Он вернёт EnergyLimit и EnergyUsed, а также freeNetLimit, freeNetUsed, NetLimit и NetUsed. Доступная энергия — это EnergyLimit минус EnergyUsed; доступный Bandwidth — бесплатный и застейканный лимиты за вычетом израсходованного.
- Перед партией платежей проверяйте оба числа, а не одно. Кошелёк, прошедший проверку по энергии и не прошедший по Bandwidth, встанет ровно так же.
Делегированные ресурсы отображаются в той же панели, что и собственные, поэтому за минуту до истечения аренды адрес выглядит обеспеченным, а через минуту — пустым. Если важен тайминг, читайте цифры непосредственно перед подписью.
Как рассчитать оба
- Энергию считайте от получателя, а не от суммы. Держит USDT — закладывайте около 65 000. Получатель неизвестен или получает впервые — около 131 000.
- По Bandwidth рассчитывайте на один бесплатный перевод в сутки. Дальше держите TRX из расчёта примерно 0,35 TRX за перевод.
- Держите рабочий запас 5–10 TRX на любом адресе, который регулярно отправляет. Он покрывает Bandwidth, активацию адреса и округления и убирает целый класс сбоев.
- Для всего автоматического симулируйте каждый вызов через triggerconstantcontract и считайте от возвращённого energy_used, а не от константы.
Правило, которое выдерживает столкновение с реальностью: энергию арендуйте или стейкайте, потому что это крупная и предсказуемая статья расходов, а немного TRX держите на Bandwidth, потому что это мелкая статья, о которой легко забыть.