Три способи записати одну адресу
Під капотом кожна TON-адреса — це два числа: воркчейн (0 для basechain, -1 для masterchain) і 256-бітний хеш початкового стану контракту. Raw-форма записує саме це: 0:83dfd552…0f31a8. Вона однозначна, її очікують get-методи та низькорівневі інструменти, але в неї немає контрольної суми: одна помилкова літера — і це вже інша, на вигляд цілком коректна адреса.
User-friendly форма пакує ті самі два числа у 36 байтів — байт прапорців, воркчейн, хеш і 2-байтову контрольну суму CRC16 — і записує їх 48 символами base64. Завдяки контрольній сумі одруківка не проходить перевірку, а не відправляє монети в порожнечу, а через байт прапорців рядок починається з EQ, UQ, kQ або 0Q:
| Префікс | Прапорець | Значення |
|---|---|---|
EQ |
0x11 |
bounceable, mainnet |
UQ |
0x51 |
non-bounceable, mainnet |
kQ |
0x91 |
bounceable, testnet |
0Q |
0xd1 |
non-bounceable, testnet |
Ті самі 36 байтів можна записати двома алфавітами base64: стандартним (+ і /) та URL-безпечним (- і _). Гаманці та оглядачі використовують URL-безпечний. Інструмент приймає обидва й виводить обидва.
Bounceable чи ні: що робить прапорець
EQ і UQ — не дві адреси. Вони вказують на один контракт і один баланс; прапорець лише підказує гаманцю відправника, що поставити в біт bounce вихідного повідомлення.
Bounceable переказ каже: якщо отримувач не може обробити це повідомлення — контракт не задеплоєно, він кидає виняток, бракує газу, — поверніть монети мені за вирахуванням комісій. Це правильне значення за замовчуванням для відправлення на смарт-контракти, тому оглядачі та інтерфейси DEX показують адреси EQ.
Non-bounceable переказ залишається на акаунті отримувача, навіть якщо там немає коду, який би його обробив. Це правильна форма для гаманців і єдино правильна для першого депозиту на новий гаманець: контракт нового гаманця деплоїться його власною першою вихідною транзакцією, тож до того за адресою немає нічого, що прийняло б bounceable повідомлення, і монети одразу повертаються. У статті про формати адрес всю історію розібрано на прикладах.
Що перевіряє валідатор
Для user-friendly адреси: довжину (48 символів), алфавіт, контрольну суму CRC16 за першими 34 байтами та байт прапорців. Для raw-адреси: діапазон воркчейну і рівно 64 hex-символи. У кожної перевірки своє повідомлення, тому обрізана вставка й одруківка виглядають по-різному.
Чого він перевірити не може — стану мережі: чи задеплоєно акаунт за цією адресою, чи є на ньому баланс, чи той це контракт, про який ви думаєте. Для цього потрібна нода — виклик getAccountState через liteserver — або оглядач.
Пакетний режим
Перемкніться в режим списку, вставте по одній адресі в рядку — і кожен рядок буде сконвертовано й перевірено незалежно. Некоректні рядки залишаються на місці зі своєю помилкою, тому список із тисячі депозитних адрес можна перевірити однією вставкою і знайти погані за номером рядка. Усе відбувається у браузері; список нікуди не завантажується.
