Блог
10 мин чтения
|
04 июл. 2026 г.

Что такое адрес TRC20?

Что такое адрес TRC20, почему он начинается с T, hex и Base58, адреса контракта и wallet, а также как создавать адреса TRON через API.

Главы
C
Chaingateway Team
Эксперты по блокчейну

Адрес TRC20 — это адрес аккаунта TRON, используемый для отправки и получения токенов TRC20, прежде всего USDT. Он начинается с буквы T и состоит из 34 символов, например TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t. Строго говоря, отдельного «типа адреса TRC20» не существует: любой адрес TRON может одинаково хранить TRX, токены TRC10 и токены TRC20. Когда биржа запрашивает ваш «адрес USDT TRC20», имеется в виду ваш обычный адрес TRON.

Формат совершенно не похож на адреса 0x, знакомые вам по Ethereum или BSC, и TRON добавляет особенность, которая путает разработчиков больше всего остального: у того же адреса есть вторая, шестнадцатеричная запись, начинающаяся с 41. Это руководство разбирает кодировку, вопрос hex против Base58, разницу между адресами wallet и контракта, код валидации и то, как создавать адреса TRON в промышленных масштабах через API.

Формат: T плюс 33 символа, Base58Check

Адрес TRON в человекочитаемой форме закодирован в Base58Check. Base58 — тот же алфавит, что использует Bitcoin: все цифры и буквы, кроме 0, O, I и l, которые убрали, потому что их легко перепутать при печати. Итак, валидный адрес TRON:

  • начинается с T
  • имеет длину ровно 34 символа
  • содержит только символы алфавита Base58

Часть «Check» означает, что кодировка несёт встроенную контрольную сумму. Под поверхностью Base58 адрес — это 25 байт: байт-префикс 0x41, 20-байтовый идентификатор аккаунта и 4 байта контрольной суммы. Один неверно введённый символ ломает контрольную сумму, поэтому wallet может отклонить опечатку до подписания любой транзакции. Это важно, потому что, в отличие от необязательного регистра EIP-55 у Ethereum, контрольная сумма в адресе TRON не является опциональной. Она есть у каждого валидного адреса.

TRC-20 против ERC-20 против BEP-20: сравнение

USDT сам по себе живёт во всех трёх сетях, поэтому форматы ежедневно встречаются в формах вывода средств и тикетах поддержки. Что их различает, с цифрами по состоянию на середину 2026 года:

TRC-20 (TRON)ERC-20 (Ethereum)BEP-20 (BNB Smart Chain)
Формат адресаT + 33 символа Base580x + 40 hex-символов0x + 40 hex-символов
Контрольная суммаBase58Check, всегда присутствуетРегистр EIP-55, опциональноРегистр EIP-55, опционально
Риск перепутать с другимиОтсутствует, формат не проходит валидациюВысокий: идентичен строкам BEP-20Высокий: идентичен строкам ERC-20
Block time3 с12 с0,45 с
Время до финальности~57 с (19 block)~13–16 мин (две epoch)1–2 с
Типичная комиссия перевода USDT~6,4–13,4 TRX без застейканного energyдесятки центов в ETH, больше при высокой нагрузкенесколько центов в BNB

Средние строки объясняют, почему эта статья постоянно предупреждает о EVM-сетях, а не о самом TRON. Адрес ERC-20 и адрес BEP-20 — это одна и та же строка, поэтому ничто в адресе не говорит отправителю или валидатору, какая chain имеется в виду; адрес TRON никогда нельзя перепутать ни с одним из них. Ошибка, которую действительно совершают пользователи TRON, кроется в строках комиссий и сети: выбор не той сети в выпадающем списке биржи или недооценка стоимости дальнейшей пересылки депозитов.

Строки с таймингом заслуживают отметки времени. BSC достигла block time в 0,45 секунды с хардфорком Fermi в январе 2026 года — вторым сокращением block time за год, тогда как TRON производит block каждые 3 секунды с момента запуска, а Ethereum держит 12-секундные слоты с момента перехода на Proof of Stake. Окно финальности TRON в 19 block, около 57 секунд, — это то, что ждёт большинство бирж перед зачислением депозита TRC20, поэтому «отправлено» и «зачислено» разделяет минута даже когда всё работает исправно.

Как выводится адрес TRON

Вывод ближе к Ethereum, чем можно предположить по виду результата:

  1. Сгенерируйте приватный ключ на кривой secp256k1, той же кривой, что используют Bitcoin и Ethereum.
  2. Вычислите публичный ключ и хешируйте его алгоритмом Keccak-256.
  3. Оставьте последние 20 байт хеша. До этого момента процедура полностью совпадает с ethereum.
  4. Добавьте в начало байт 0x41 (mainnet-префикс TRON), получив 21 байт.
  5. Хешируйте эти 21 байт дважды алгоритмом SHA-256 и возьмите первые 4 байта как контрольную сумму.
  6. Добавьте контрольную сумму и закодируйте 25 байт в Base58.

Ведущая T — не конвенция, выбранная кем-то ради брендинга; она вытекает из математики. Любая 25-байтовая строка, начинающаяся с 0x41, кодируется в текст Base58, начинающийся с T.

Base58Check с реальными числами

Кодировки запоминаются лучше, когда их можно воспроизвести самостоятельно, поэтому вот адрес контракта USDT, собранный из своих частей. 21-байтовый payload — это префикс 41 плюс 20-байтовый идентификатор аккаунта:

payload: 41a614f803b6fd780986a42c78ec9c7f77e6ded13c
sha256(payload): 3a42512dd4f64e4d9dad3d5e6aa0ecf55adbd8a85979135cf211ba347278d029
sha256(again): 710277f5d80b170d90e2ec6c52caa368bc74b9226e3befe5c09825a0eedbfb68
checksum: 710277f5

Контрольная сумма — это первые 4 байта второго хеша. Добавьте её к payload, и у вас 25 байт: 41a614f803b6fd780986a42c78ec9c7f77e6ded13c710277f5. Считайте эти байты одним большим числом, делите его многократно на 58 и сопоставляйте каждый остаток с алфавитом Base58. Результат — TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t, адрес, который показывает любой wallet.

Декодирование проходит тот же путь в обратном направлении: из Base58 в 25 байт, отделите последние 4, хешируйте первые 21 дважды алгоритмом SHA-256 и сравните. Если сравнение не совпадает, какой-то символ был искажён при передаче, и адрес использовать нельзя. Именно эта проверка объясняет, почему неправильно введённый адрес TRON отклоняется любым приличным wallet: вероятность того, что случайная опечатка всё же даст совпадающую 4-байтовую контрольную сумму, составляет 1 к 2^32, примерно один к четырём миллиардам. EIP-55 Ethereum для сравнения улавливает опечатку примерно 15 контрольными битами, так что схема TRON заметно строже из двух.

Форма hex (41…) против формы Base58 (T…): один адрес, две записи

Вот часть, которую почти ни одна объясняющая статья не освещает. Когда вы работаете с собственным node API TRON или низкоуровневыми библиотеками, адреса возвращаются в шестнадцатеричном виде, начиная с 41. Контракт токена USDT, например:

Base58: TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t
Hex: 41a614f803b6fd780986a42c78ec9c7f77e6ded13c

Обе записи идентифицируют один и тот же аккаунт. Форма hex — это исходные 21 байт (префикс плюс идентификатор) без контрольной суммы; форма Base58 оборачивает эти байты контрольной суммой для человеческого использования. Wallet и обозреватели показывают T..., необработанные ответы node и подписанные payload транзакций используют 41....

Два практических следствия. Во-первых, никогда не сравнивайте адреса как строки без нормализации кодировки, иначе TR7N... и 41a6... будут выглядеть для вашего кода как разные аккаунты. Во-вторых, если убрать префикс 41 из формы hex, оставшиеся 20 байт имеют ту же форму, что и адрес Ethereum, поэтому некоторые библиотеки умеют конвертировать между представлениями TRON и EVM. Одинаковая форма не означает одинаковый аккаунт: ключ, используемый в обеих сетях, даёт несвязанные адреса, потому что вывод расходится начиная с шага 4.

Конвертация между двумя формами

Конвертация достаточно короткая, чтобы написать её самостоятельно, вместо того чтобы подключать TRON SDK. Переход от Base58 к hex означает декодирование и отбрасывание контрольной суммы; обратное направление пересчитывает её:

import bs58 from "bs58";
import { createHash } from "node:crypto";
const sha256 = (b) => createHash("sha256").update(b).digest();
function base58ToHex(address) {
const raw = Buffer.from(bs58.decode(address));
return raw.subarray(0, 21).toString("hex"); // отбрасываем 4 байта контрольной суммы
}
function hexToBase58(hex) {
const payload = Buffer.from(hex, "hex"); // 21 байт, начинается с 41
const checksum = sha256(sha256(payload)).subarray(0, 4);
return bs58.encode(Buffer.concat([payload, checksum]));
}

Выберите одну каноническую форму для хранения и конвертируйте на границах. Хранение в Base58 держит вашу базу данных в соответствии с тем, что показывают пользователи и обозреватели; хранение в hex соответствует тому, что содержат необработанные payload node. Оба варианта работают, но смешивание обоих в одной таблице — это то, как рождается баг «тот же адрес, нет совпадения», обычно обнаруживаемый при сверке депозитов в 2 часа ночи.

Адрес контракта против адреса wallet

И wallet, и smart contract существуют по адресам T..., и ничто в строке их не различает. Это различие важнее всего для USDT:

  • Ваш адрес wallet — это место, где вы получаете USDT. Он принадлежит вашему приватному ключу.
  • Адрес контракта TRC20 — это место, где находится код токена. Для USDT на TRON это TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t.

Вы столкнётесь с адресом контракта, когда добавляете пользовательский токен в wallet, когда проверяете на Tronscan, что токен действительно настоящий USDT, а не подделка с тем же именем, и когда вызываете токен из кода. Чего никогда нельзя делать — отправлять токены на адрес контракта. У токен-контрактов нет владельца, который мог бы отправить их обратно, поэтому переводы на контракт в почти всех случаях теряются навсегда. Обозреватели помечают аккаунты контрактов меткой «Contract» — это самый быстрый способ проверить, с каким типом адреса вы имеете дело.

Проверка адреса на Tronscan, шаг за шагом

Tronscan — блок-обозреватель TRON, и он снимает большинство сомнений менее чем за минуту.

Вставьте адрес в строку поиска. Страница аккаунта показывает баланс TRX, активы TRC20 и каждый входящий и исходящий перевод. Совершенно новый депозитный адрес показывает пустую страницу, это нормально; аккаунты TRON активируются первой входящей транзакцией, поэтому «данных пока нет» означает неиспользуемый, а не невалидный.

Далее проверьте тип аккаунта. Аккаунты контрактов несут видимую метку «Contract» ближе к верху страницы. Деньги идут на обычные аккаунты; если пункт назначения, который вам дали, оказывается помечен как контракт, не отправляйте.

Для токенов ищите по адресу контракта, а не по названию. Ввод «USDT» в Tronscan возвращает настоящий токен в окружении подделок с тем же тикером, а на TRON любой может задеплоить токен с именем USDT. Настоящий находится по адресу TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t, имеет шесть десятичных знаков, и его страница Tronscan показывает метку эмитента и число holder в десятках миллионов. Неизвестный токен, чья страница показывает несколько сотен holder и никакого проверенного эмитента, — не тот актив, за который вы его принимаете.

Последний шаг после любого перевода: найдите ID транзакции. Страница деталей перечисляет отправителя, получателя, контракт токена, сумму и статус подтверждения. Как только транзакция отображается подтверждённой после окна в 19 block, она финальна.

Не перепутайте сети

USDT существует одновременно на нескольких chain: как токен TRC20 на TRON, как токен ERC-20 на Ethereum, как токен BEP-20 на BSC. Один тикер, разные контракты, несовместимые сети.

TRON на самом деле дружелюбный случай здесь, потому что форматы визуально различаются: адрес T... нельзя вставить в форму вывода средств Ethereum без провала валидации, а адрес 0x... не проходит валидацию на TRON. Риск кроется в меню вывода средств бирж, где вы выбираете сеть из выпадающего списка рядом с полем адреса. Выберите «ERC20» и вставьте адрес TRON — хорошая биржа заблокирует это. Но если у вас есть адреса на нескольких сетях и вы по ошибке вставляете тот, что совпадает с выбранной сетью, никакой валидатор вас не спасёт. Указывайте сеть явно везде, где вы показываете или принимаете адрес. О стороне этой проблемы, связанной с EVM, где один адрес существует одновременно на многих chain, см. Что такое адрес BEP20?.

Address poisoning: атака, которую не ловят контрольные суммы

Каждая описанная выше проверка ловит случайности. Address poisoning — преднамеренная атака, и она работает именно потому, что отравленный адрес полностью валиден.

Схема: злоумышленник наблюдает за вашей on-chain активностью, а затем генерирует vanity-адрес, чьи первые и последние символы совпадают с адресом, с которым вы регулярно взаимодействуете. Сгенерировать адрес TRON, совпадающий, скажем, по четырём начальным и четырём конечным символам с целью, — вопрос вычислительного времени, а не взлома какой-либо криптографии. Затем злоумышленник подсаживает этого двойника в вашу историю транзакций, либо отправляя пылевую сумму TRX, либо, изящнее, злоупотребляя тем, что контракты TRC20 разрешают переводы с нулевой суммой: transferFrom на 0 USDT обходится злоумышленнику дёшево и появляется в вашей истории так, будто вы взаимодействовали с этим адресом.

Расплата наступает недели спустя, когда вы копируете «обычный адрес» из истории переводов вместо собственных записей. Wallet и обозреватели сокращают адреса до первых и последних символов — именно тех символов, которые злоумышленник подобрал, поэтому подделка на первый взгляд выглядит правильно. Потери от этой схемы не теоретические: в широко освещённом случае 2024 года пользователь Ethereum отправил около 68 миллионов долларов в WBTC на отравленный адрес. Дешёвые транзакции TRON делают шаг посева ещё дешевле там.

Защита неброская, но работает. Никогда не копируйте адреса из истории транзакций; копируйте их из собственной адресной книги, базы данных или экрана получения получателя. При проверке сравнивайте больше восьми символов, а лучше — сравните всю строку один раз и затем полагайтесь на allowlist. Для платформ правило структурное: адреса выплат берутся из вашей базы данных, введённые и проверенные один раз, и никогда не выводятся из on-chain истории. И привычка тестовой транзакции применима и здесь: небольшой перевод, подтверждённый на Tronscan как полученный нужной стороной, стоит несколько TRX и превосходит любую визуальную проверку.

Валидация адреса TRC20 в коде

Первичная проверка — это регулярное выражение против алфавита Base58:

const TRON_FORMAT = /^T[1-9A-HJ-NP-Za-km-z]{33}$/;

Регулярное выражение улавливает неверную длину и запрещённые символы, но не опечатки внутри алфавита. Для этого проверяют контрольную сумму:

import bs58 from "bs58";
import { createHash } from "node:crypto";
const sha256 = (buf) => createHash("sha256").update(buf).digest();
function isValidTronAddress(address) {
if (!/^T[1-9A-HJ-NP-Za-km-z]{33}$/.test(address)) return false;
const decoded = Buffer.from(bs58.decode(address));
if (decoded.length !== 25 || decoded[0] !== 0x41) return false;
const payload = decoded.subarray(0, 21);
const checksum = decoded.subarray(21);
const expected = sha256(sha256(payload)).subarray(0, 4);
return expected.equals(checksum);
}

Успешная проверка доказывает, что строка является корректно сформированным адресом TRON. Она не доказывает, что аккаунт существует on-chain или что кто-то владеет его ключом, и не может отличить wallet от контракта. Для вопроса о контракте запросите chain или проверьте обозреватель.

Откуда берутся адреса wallet: HD-вывод на TRON

Когда приложение-wallet выдаёт вам адрес TRON через несколько секунд после того, как вы записали двенадцать слов, вот что за этим стоит. Слова — это мнемоника BIP-39, разворачивающаяся в seed. Из seed BIP-32 выводит дерево пар ключей, всегда одно и то же дерево для одних и тех же слов. Затем BIP-44 назначает каждой blockchain собственную ветвь через зарегистрированный coin type, и у TRON это 195, поэтому стандартный путь для вашего первого адреса TRON выглядит как m/44'/195'/0'/0/0.

Coin type — деталь, которую стоит запомнить. Ethereum находится на coin type 60, TRON — на 195, и оба числа появляются на защищённом (hardened) уровне пути. Одни и те же слова seed, совершенно разные деревья ключей. Именно поэтому одна и та же recovery-фраза даёт адрес 0x в EVM-wallet и не связанный с ним адрес T в TRON-wallet, и поэтому ни один из wallet не видит средств другого. Если вы восстановите фразу в wallet только для Ethereum, и ваш баланс TRON кажется исчезнувшим, ничего не потеряно; wallet просто никогда не выводил ветвь 195. Восстановите те же слова в wallet с поддержкой TRON — и адрес, и баланс появятся снова.

Индекс в конце пути увеличивается: .../0/1 — ваш второй адрес TRON из тех же слов, .../0/2 — третий. Персональные wallet редко идут дальше нескольких штук. Для платформ ситуация обратная, и для них более безопасная конструкция — генерировать ключи независимо на клиента и регистрировать их через API, потому что тогда ни одна отдельная фраза не контролирует все депозитные адреса в системе.

Как получить адрес wallet TRC20

Есть два пути, и какой вам нужен, зависит от того, хотите ли вы один адрес для себя или множество адресов для приложения.

Путь wallet (один адрес, личное использование)

Установите wallet с поддержкой TRON: TronLink — стандартный браузерный wallet сети, Trust Wallet покрывает мобильные устройства, Ledger покрывает hardware. Создайте аккаунт, запишите recovery-фразу офлайн и откройте экран получения. Показанный там адрес T... — это ваш адрес wallet TRC20 для USDT и любого другого токена TRON. За его создание нет комиссии и не требуется этап регистрации; адрес работает в момент, когда wallet его сгенерировал.

Путь API (много адресов, для приложений)

Платформе, которая зачисляет депозиты по каждому клиенту, нужен адрес на клиента, и тысячекратные клики по UI wallet — не вариант. С REST API Chaingateway вы генерируете ключи в собственном окружении и регистрируете их для сети TRON. Аутентификация — Bearer-токен:

Terminal window
curl -X POST https://app.chaingateway.io/api/v2/tron/addresses/import \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"address": "TYourGeneratedTronAddress",
"privatekey": "<generated secp256k1 private key, hex>",
"password": "<encryption password for this key>"
}'

С заголовком X-Network: testnet тот же вызов нацелен на testnet TRON, так что весь flow можно сначала протестировать бесплатным тестовым TRX. Последующая отправка токенов идёт через POST /api/v2/tron/transactions/trc20. Quickstart разбирает оба вызова; 7-дневный пробный период без KYC-онбординга покрывает фазу тестирования, а тарифы — на странице цен.

Приём депозитов TRC20: flow webhook

Как только у каждого клиента есть адрес, остаётся проблема — замечать депозиты без опроса Tronscan. Схема:

  1. Назначьте выделенный адрес TRON на клиента и сохраните соответствие в своей базе данных.
  2. Зарегистрируйте webhook. Когда перевод TRC20 достигает адреса, ваш endpoint вызывается с данными транзакции.
  3. Проверьте HMAC-подпись webhook, затем зачислите клиенту.

Доставки подписаны, и доставка, которую пропустил ваш endpoint, не теряется: GET /api/v2/tron/webhooks/notifications/failed перечисляет то, что так и не дошло, а POST /api/v2/tron/webhooks/notifications/{id}/retry отправляет это заново. После сбоя GET /api/v2/tron/webhooks/notifications перечисляет прошлые уведомления для сверки. Детали и код проверки подписи — в руководстве по webhook.

Один момент, специфичный для TRON: получение бесплатно, но дальнейшая пересылка депозитов стоит energy и bandwidth. С тех пор как proposal #104 снизил цену energy с 210 до 100 Sun, перевод USDT стоит примерно 6,4 TRX на активный адрес и примерно 13,4 TRX на пустой, если платить без застейканного energy. Планируйте расходы на консолидацию с калькулятором комиссий TRON; постоянные отправители снижают текущий расход, стейкая TRX ради energy, что API покрывает через POST /api/v2/tron/freeze.

Часто задаваемые вопросы

Да. Адрес TRC20 — это просто адрес аккаунта TRON, используемый в контексте токенов TRC20. Один и тот же адрес T... хранит TRX, токены TRC10 и токены TRC20. Обозначение «TRC20» на страницах вывода средств бирж относится к стандарту токена и сети, а не к особому типу адреса.

34 символа, начинается с T. Под кодировкой Base58Check лежат 25 байт: байт-префикс 0x41, 20-байтовый идентификатор аккаунта и 4-байтовая контрольная сумма.

TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t. Именно там находится код токена, это не адрес для отправки средств. Используйте его, чтобы проверить токены на Tronscan или вручную добавить USDT в wallet; переводы, отправленные на сам контракт, безвозвратны.

Это шестнадцатеричная запись того же адреса. Необработанные ответы node TRON и payload транзакций используют hex с префиксом 41; wallet и обозреватели используют форму Base58, начинающуюся с T. Конвертируйте между ними, прежде чем сравнивать адреса в коде.

Нет, и форматы защищают вас здесь: адрес 0x не проходит валидацию TRON, а адрес T... не проходит валидацию Ethereum. Реальный риск — выбрать не ту сеть в меню вывода средств биржи, вставляя адрес, которым вы владеете в другой chain. Всегда сверяйте название сети с форматом адреса.

Нет. Testnet TRON (Shasta, Nile) используют тот же префикс 0x41, поэтому адреса testnet тоже начинаются с T и проходят ту же валидацию. Строго разделяйте ключи testnet и mainnet в вашей конфигурации; формат адреса не предупредит вас, если вы их перепутаете.

Получение бесплатно; отправка стоит energy и bandwidth. Без застейканного energy перевод USDT обходится примерно в 6,4 TRX на активный адрес получателя и примерно в 13,4 TRX на пустой, по цене energy в 100 Sun, установленной proposal #104. Калькулятор комиссий TRON рассчитывает актуальные цифры для вашего случая, а стейкинг TRX ради energy снижает то, что вы платите фактически.

Транзакция попадает в block примерно за 3 секунды и считается финальной после 19 block, примерно через 57 секунд, как только две трети Super Representatives построили блоки поверх неё. Большинство бирж зачисляют депозиты TRC20 после этого окна, поэтому около минуты между отправкой и зачислением — нормальное поведение, а не зависшая транзакция.

Готовы собрать это сами? Получите свой API-ключ — 7-дневный пробный период, без карты — или посмотрите API Tron для полного справочника по эндпоинтам.

C
Chaingateway Team
Эксперты по блокчейну

Команда Chaingateway стремится упростить интеграцию блокчейна для разработчиков по всему миру.