Адреса и Аккаунты
Адреса в 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? Назовите два ключевых отличия.
Check Your Understanding
Finished the lesson?
Mark it as complete to track your progress
Войдите чтобы оценить урок