Адреса и Аккаунты
Адреса в TON — это не просто идентификаторы, а сложная система, включающая информацию о workchain, формате отображения и флагах. Подобно тому, как почтовый адрес содержит страну, город и улицу, адрес TON кодирует workchain ID, хеш состояния и флаги bounceable/non-bounceable. Неправильное использование формата адреса — одна из самых частых причин потери средств новичками.
Адреса в TON существенно отличаются от адресов Ethereum. В этом уроке разберём формат адресов, типы аккаунтов и состояния, в которых может находиться аккаунт.
Формат адресов
Адрес TON состоит из двух частей:
- workchain_id — номер workchain (8 бит, знаковый)
- account_id — 256-битный хеш (SHA-256 от StateInit контракта)
Итого: 36 байт (1 байт workchain + 32 байта хеша + 2 байта CRC16 + 1 байт флагов).
Raw-формат
Raw-адрес записывается как workchain_id:hex_hash:
0:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
Здесь 0 — workchain 0 (basechain), далее 64 hex-символа (256 бит).
User-friendly формат
Для удобства используется base64url кодировка с дополнительными флагами:
EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG
User-friendly адрес включает:
- 1 байт флагов: bounceable/non-bounceable, testnet/mainnet
- 1 байт workchain_id
- 32 байта account_id
- 2 байта CRC16 (контрольная сумма)
Один и тот же контракт имеет два user-friendly адреса: bounceable (начинается с EQ...) и non-bounceable (начинается с UQ...). Оба указывают на один аккаунт, но определяют поведение при ошибке.
Bounceable vs Non-bounceable
| Тип | Префикс | Поведение при ошибке | Когда использовать |
|---|---|---|---|
| Bounceable | EQ... | Сообщение “отскакивает” назад | Отправка контрактам |
| Non-bounceable | UQ... | Сообщение теряется | Первый перевод на новый кошелёк |
Почему это важно
Если вы отправите Toncoin на bounceable адрес неинициализированного контракта, средства вернутся отправителю (bounce). Если на non-bounceable — средства останутся на аккаунте, даже если контракт ещё не развёрнут.
При первом переводе на новый кошелёк всегда используйте non-bounceable адрес (UQ...). Иначе средства отскочат назад, так как контракт кошелька ещё не активирован.
Состояния аккаунта
Аккаунт в TON может находиться в одном из трёх состояний:
1. Uninit (неинициализированный)
- Аккаунт ещё не развёрнут в сети
- Может иметь баланс (если получил Toncoin)
- Не имеет кода и данных
- Не может обрабатывать сообщения
2. Active (активный)
- Контракт развёрнут и работает
- Имеет код, данные и баланс
- Обрабатывает входящие сообщения
- Может отправлять исходящие сообщения
3. Frozen (замороженный)
- Баланс опустился ниже минимального порога
- Код и данные удаляются из блокчейна
- Сохраняется только хеш состояния
- Может быть восстановлен при пополнении баланса
В отличие от Ethereum, где аккаунты существуют вечно, в TON аккаунты с нулевым балансом замораживаются и в конечном счёте удаляются. Это освобождает место в блокчейне.
TON vs Ethereum: Адреса
TON vs Ethereum: Модель адресов
Ethereum использует 20-байтовые адреса (160 бит), полученные из публичного ключа (keccak256). TON использует 36-байтовые адреса, включающие workchain_id + 256-битный хеш от StateInit. Это означает, что адрес TON определяется кодом контракта и начальными данными, а не только ключом.
Модель аккаунтов EthereumВычисление адреса
Адрес TON вычисляется до деплоя контракта:
address = SHA256(StateInit)
StateInit = {code, data, library, split_depth, special}
Это значит:
- Адрес предсказуем — его можно вычислить офлайн
- Один и тот же код + данные = один и тот же адрес
- Можно отправить Toncoin на адрес до деплоя контракта
Частые ошибки
- Путают bounceable и non-bounceable адреса: отправка на bounceable-адрес неинициализированного контракта приведёт к возврату средств, а на non-bounceable нет.
- Сравнивают адреса в raw-формате как строки, забывая что один и тот же аккаунт имеет разные строковые представления (user-friendly, raw, bounceable/non-bounceable).
- Не учитывают workchain ID в адресе: контракт в workchain 0 и контракт в workchain -1 (masterchain) имеют разные адреса даже при одинаковом хеше.
- Хардкодят адреса в user-friendly формате без учёта флага testnet, поскольку адрес для mainnet и testnet различаются.
Проверка знанийЧем адрес TON отличается от адреса Ethereum? Назовите два ключевых отличия.
Проверьте понимание
Закончили урок?
Отметьте его как пройденный, чтобы отслеживать свой прогресс
Войдите чтобы оценить урок