Тест выплат USDT до основной сети: что меняет Nile и что имитирует песочница
Интеграция выплат должна встретить свой первый сбой там, где дешевле, чем в основной сети, и в TRON для этого есть два места. Nile — публичная тестовая сеть: настоящая цепочка, где транзакции подписываются и попадают в блоки, работающая на собственных параметрах. Песочница вроде нашей повторяет API поверх симулированной цепочки: она отказывается от настоящей сети и получает исходы, которых настоящая сеть по запросу не даст. Параметры основной сети и Nile мы прочитали 3 сентября 2026 года, а транзакции на Nile подписали на следующий день.
Что у Nile общего с основной сетью
Nile отвечает на тот же вызов getchainparameters, что и основная сеть, и параметры, которые определяют цену перевода, вернулись одинаковыми. Энергия стоит 100 sun за единицу в обеих сетях, поэтому перевод, которому не хватило энергии, сжигает TRX по той же ставке в каждой. Бесплатная пропускная способность, плата за создание аккаунта, плата за мемо и три параметра динамической энергии тоже совпадают.
| Параметр сети, прочитан 3 сентября 2026 года | Основная сеть | Nile |
|---|---|---|
Цена энергии в sun за единицу, getEnergyFee | 100 | 100 |
Бесплатная пропускная способность на аккаунт, getFreeNetLimit | 600 | 600 |
Плата за создание аккаунта в sun, getCreateAccountFee | 100,000 | 100,000 |
Плата за мемо в sun, getMemoFee | 1,000,000 | 1,000,000 |
Порог динамической энергии, getDynamicEnergyThreshold | 5,000,000,000 | 5,000,000,000 |
Коэффициент роста динамической энергии, getDynamicEnergyIncreaseFactor | 2,000 | 2,000 |
Максимальный коэффициент динамической энергии, getDynamicEnergyMaxFactor | 34,000 | 34,000 |
Задержка разморозки в днях, getUnfreezeDelayDays | 14 | 1 |
Самая долгая блокировка делегации в блоках, getMaxDelegateLockPeriod | 864,000 | 144,000 |
Интервал обслуживания, getMaintenanceTimeInterval | 21,600,000 | 1,800,000 |
Потолок процессорного времени одной транзакции, getMaxCpuTimeOfOneTx | 80 | 160 |
Что меняет Nile
Для всякого, кто имеет дело с энергией, первое различие — разморозка: на Nile она занимает один день против четырнадцати в основной сети, поэтому тест, который замораживает TRX, а затем выводит их, заканчивается на тринадцать дней раньше, чем та же последовательность в боевой среде. Самая долгая блокировка, которую может нести делегация, — 144,000 блоков на Nile, пять суток при трёх секундах на блок, против 864,000 блоков, тридцати суток, в основной сети. Блокировку дольше пяти суток на Nile отрепетировать нельзя вовсе; а то, в чём блокировка отказывает, одинаково в обеих сетях.
Восемь из параметров, которые вернула основная сеть, на Nile имеют другое значение. Помимо этих двух, это интервал обслуживания, потолок процессора из таблицы и четыре параметра, управляющие производителями блоков, предложениями и возможностями контрактов. Ни один из этих шести мы в поток выплат не прослеживали.
Стейкинг даёт и разное количество энергии, потому что каждая сеть делит один и тот же энергетический лимит между собственным суммарным стейком, а стейк Nile намного меньше. В обоих наших прогонах на Nile 4 сентября делегированный нами стейк появился на принимающем аккаунте как 7,376 единиц энергии. Тот же стейк в основной сети при суммарном стейке, прочитанном днём раньше, даёт 958 единиц, так что Nile выдаёт почти в восемь раз больше. Стейк, рассчитанный по Nile, оставил бы кошелёк основной сети с нехваткой.
| Энергия от стейкинга | Основная сеть, 3 сентября 2026 года | Nile, 4 сентября 2026 года |
|---|---|---|
Энергетический лимит всей сети, TotalEnergyLimit | 180,000,000,000 | 180,000,000,000 |
Суммарный стейк под энергию, TotalEnergyWeight | 18,770,236,993 | 2,440,088,105 |
| Энергия у получателя от 100 делегированных TRX | 958 единиц, вычислено | 7,376 единиц, замерено |
Тестовый USDT — другой контракт
Код выплат несёт адрес контракта USDT, который вызывает. 27 октября 2026 года мы спросили у ноды Nile контракт по адресу USDT основной сети, TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t, и ответом был пустой объект, {}: на этом адресе в тестовой сети контракта нет. Тестовые токены на Nile идут из другого контракта по другому адресу, поэтому адрес контракта принадлежит конфигурации, рядом с URL ноды, а сборка, жёстко прописавшая его, будет вызывать неверный адрес в одной из двух сетей.
Мы не измеряли, сколько энергии стоит один перевод тестового токена Nile. Nile берёт ту же плату за единицу, но токен — другой контракт, поэтому ничто на Nile не подтверждает цифры основной сети: около 65,000 единиц держателю и около 131,000 единиц адресу без USDT. Тестовые TRX берутся из кранов, и те их нормируют: тот, которым мы пользовались в сентябре, позволял один запрос на кошелёк и на IP раз в 24 часа.
Подписанная транзакция к тому же остаётся в той сети, для которой была собрана. Каждая транзакция TRON несёт ссылку на недавний блок своей цепочки, и наш API сверяет эту ссылку с основной сетью, прежде чем купит какую-либо энергию. Транзакция в mode B, собранная против Nile, отклоняется ответом 400 с details.reason, равным ref_block_unknown. Когда сеть не отвечает на нашу проверку, заказ принимается без проверки, а отказ ноды после доставки оплачивается, поэтому собирайте каждую транзакцию против актуального блока основной сети перед отправкой.
Что имитирует песочница
Наша песочница отвечает по адресу https://sandbox.nrg.market/v1 и запускает тот же код, что и боевая среда, поверх тестовых денег, симулированной цепочки и симулированных поставщиков энергии. Ключи там начинаются с nrg_test_ и выдаются в кабинете песочницы, где регистрация самостоятельная. Два стенда ничего не делят: отдельные базы данных, балансы, вебхуки и секреты. Когда интеграция там работает, вы меняете базовый URL и ключ; сценарий работы с API на обоих одинаков.
Тестовые деньги приходят без крана. Подтверждение email зачисляет стартовый баланс, а POST /v1/sandbox/deposit зачисляет ещё по тому же пути, что проходит настоящий депозит: строка deposit в журнале с txid, начинающимся с sandbox-, и настоящий вебхук deposit.credited. В боевой среде такого пути нет, и она отвечает 404.
| Тестовые деньги в песочнице | По контракту API |
|---|---|
| При подтверждении email или первом входе через Google | 10000 TRX |
Один вызов POST /v1/sandbox/deposit | до 100000 TRX |
| Вызовов депозита на клиента за сутки по UTC | 10 |
Тестовая сеть не выдаст нужный исход по запросу. Песочница привязывает несколько адресов к фиксированному поведению — так же, как работают тестовые номера карт: это валидные адреса TRON, за которыми нет приватного ключа. Получатель определяет вид энергии и то, что происходит после ready; отправитель — как проходят покупка и делегация.
| Адрес | Роль | Что делает песочница |
|---|---|---|
TLLmUhBYgU125KkPpeTdP1vz1zqhoZwn9v | Получатель | USDT нет, поэтому kind: double. Он к тому же не активирован и остаётся пустым, сколько бы переводов на него ни пришло. |
TDUvBqzR3cYY6zYopYdJ9jWrxQRs9QmvQM | Получатель | Перевод не появляется никогда. Позиция ждёт в ready, становится expired на send_before и оплачивается — как в боевой среде. |
TKLeQhXSUba1GG1wdznyMc49oqModZ8Fbm | Получатель | В чёрном списке USDT: заказ отклоняется ответом 422 blacklisted_recipient. |
TQ6ey8qT87bnzBJXj7gVTGCkrU4wUJ1EWQ | Отправитель | Покупка не удаётся ни у одного поставщика. Позиция заканчивается как failed с purchase_failed, а резерв снимается. |
TYWZsWdM9u8QKJTi6XEmenpvCPwg1xmPCC | Отправитель | Первый поставщик недоступен, а переключение на резервного удаётся. Ничто в ответе об этом не говорит. |
TNhq25t5XTEuk3mC9cTcAGB5rr3xuCkGyr | Отправитель | Делегация подтверждается примерно через 25 секунд — для кода, которому приходится ждать. |
| Любой другой валидный адрес | Любая | Получатель, у которого USDT есть, и делегация, подтверждающаяся за 2–8 секунд. |
Две стороны комбинируются, поэтому пакет, где вперемешку стоят отказывающий отправитель и обычные, заканчивается как partially_completed, хотя ничего особого не просили (что этот статус значит для инвойса). Сценарные отправители общие для всех клиентов стенда, поэтому, когда проверяется именно тайминг, берите свежий адрес отправителя — собственный: он получает обычные 2–8 секунд, а его делегации принадлежат только ему.
Цены на стенде живые. Тариф песочницы повторяет боевой с отставанием примерно в две минуты, в худшем случае в три, так что оценка, отрепетированная там, возвращает цену, которую боевая среда называла две-три минуты назад. Mode B не требует настоящего ключа: симулированная цепочка не проверяет подписи, поэтому транзакция, подписанная любым одноразовым ключом, разбирается так же, как в боевой среде, и проходит broadcasting, broadcasted и confirmed, а отправка подтверждается примерно за три секунды.
Что показывает только основная сеть
Песочница не может доказать ту часть, что делает сеть: энергия на ней никуда по-настоящему не приходит, а подтверждённая там делегация — факт о нашем симуляторе. Nile тоже не может решить это для нашего сервиса, потому что мы не продаём энергию ни в одной тестовой сети. Придёт ли настоящая энергия на настоящий кошелёк и пройдёт ли затем перевод без сжигания TRX, вы узнаёте в боевой среде.
Некоторые ветки не получить ни на одном стенде никаким запросом: 503 capacity_unavailable и ошибки позиции broadcast_failed, transaction_reverted и broadcast_window_missed. Каждая зависит от предложения энергии, от сети или от того, что сервис поставлен нами на паузу. Пишите эту обработку по контракту и телам вебхуков и проверяйте её как код, который никогда не запускался.
Значительную часть боевой среды можно опробовать бесплатно. POST /v1/estimate принимает до 500 получателей и возвращает те же kind, energy_units и warnings, что посчитал бы заказ, а POST /v1/webhooks/{webhook_id}/test отправляет вашему приёмнику настоящую подписанную доставку. POST /v1/orders стоит настоящих TRX в любом режиме, поэтому первый боевой заказ на один перевод — последняя репетиция и единственная, на которой видно, как энергия приходит.
Каждый сценарный адрес из этого поста отвечает на стенде, на тестовых деньгах и вашем собственном ключе nrg_test_: откройте кабинет песочницы и выпишите его →