Техническая документация · 15 сентября 2026
Exton — некастодиальный кошелёк для сети TON
Документ описывает функциональность мобильных приложений для Android и iOS, смарт-контракты, серверную часть и модель безопасности. Составлен по исходному коду: каждое значение проверено по месту его объявления.
- Android1.0.24
- iOS1.0.0
- СетьTON
- Строк кода~78 000
Exton — некастодиальный криптовалютный кошелёк для блокчейна TON
Некастодиальный означает, что распоряжение средствами остаётся у владельца: секреты кошелька хранятся под защитой устройства и на серверы проекта не передаются ни при каких операциях.
Приложение работает только с сетью TON. Поддержки других блокчейнов нет — её удалили из кода. Нативная валюта сети в интерфейсе называется GRAM; это переименование на стороне приложения, сам протокол и сеть остаются TON.
Отличие от типового TON-кошелька — собственные смарт-контракты вместо стандартных. Пользователь может выбрать, каким контрактом управляется его адрес, и перенести кошелёк из другого приложения, не теряя доступа к средствам.
Как части связаны
Ключ доступа к блокчейн-API не входит в состав приложений. Оба клиента обращаются к блокчейну исключительно через собственный прокси, где этот ключ и хранится. Из установочного файла его извлечь нельзя.
-
Android / iOS
-
api.exton.app
tonapi.io
блокчейн TON
прокси прячет ключ доступа к блокчейн-API,
кэширует ответы, ограничивает частоту -
multisig.exton.app
подбор адресов (Rust)
принимает ТОЛЬКО публичные ключи
-
bridge.tonapi.io
связь с внешними сайтами (TON Connect)
принимает ТОЛЬКО публичные ключи
-
Keystone 3 Pro
вторая подпись, обмен QR-кодами; устройство не подключается к сети
Ключи и мнемоническая фраза
Кошелёк создаётся из мнемонической фразы — последовательности слов, по которой восстанавливается приватный ключ. Поддерживаются два стандарта.
BIP-39 — общепринятый стандарт
Приложение генерирует 32 байта случайности источником SecureRandom и превращает их в 24 слова. Последние восемь бит — контрольная сумма от SHA-256, поэтому опечатка в слове обнаруживается при вводе.
TON Native — стандарт экосистемы TON
Совместим с другими кошельками сети. Контрольной суммы в фразе нет: вместо неё проверяется свойство самого ключа — подходит примерно одна случайная фраза из 256, поэтому генерация перебирает варианты, пока условие не выполнится.
Дополнительное слово
К фразе BIP-39 можно добавить произвольное слово-пароль. Оно даёт другой кошелёк с другим адресом, а не защищает существующий. Само слово нигде не сохраняется в открытом виде: без него восстановить такой кошелёк невозможно.
Один и тот же ключ даёт три разных адреса — по одному на каждый тип контракта
Это свойство сети TON, а не особенность Exton: адрес вычисляется из кода контракта вместе с ключом. Средства, лежащие на адресе одного типа, не видны на адресе другого.
Практическое следствие: пользователь, пришедший из другого приложения, выбирает в настройках тот тип контракта, которым его кошелёк был создан, и сразу видит свои средства.
Корректность подписи для контракта V5 закреплена тестами против эталонной библиотеки экосистемы TON: подписанные сообщения совпадают с эталоном побайтово, включая проверку на реальном кошельке, существующем в основной сети.
Переводы, токены и NFT
Кошелёк отправляет нативную валюту сети, токены-джеттоны и NFT — поштучно и пакетом, с комментарием к переводу.
Что можно отправлять
- GRAM — нативная валюта сети, в том числе «отправить весь остаток»
- Token-jetton — по стандарту TEP-74, с выбором токена в списке
- NFT — поштучно и пакетом
- Комментарий к переводу — произвольный текст
Получатель
Адрес вводится вручную, сканируется с QR-кода или выбирается из адресной книги. Поддерживаются домены .ton и .t.me: приложение само находит адрес, которому домен принадлежит. Для неизвестного получателя предлагается сохранить его в адресную книгу, для известного — показывается сохранённое имя.
Обработка ошибок сети
Ошибки разбираются по типам и показываются человеческим текстом вместо внутреннего сообщения библиотеки. При перегрузке блокчейн-API запрос повторяется автоматически с нарастающей паузой.
Смарт-контракты
В сети TON развёрнуты два кошельковых контракта проекта. Их скомпилированный код — единственный источник истины для приложений: обе платформы используют один и тот же байт-код.
Мультиподпись
К одному счёту привязываются несколько ключей, а правило контракта задаёт, сколько подтверждений нужно для исполнения операции. В развёрнутой версии участников двое: первую подпись ставит приложение, вторую — аппаратный кошелёк через обмен QR-кодами, и транзакция исполняется только при обеих. Утрата ключа участника вместе с его резервной копией делает средства недоступными — это осознанное свойство схемы, а не дефект. Ключ приложения восстанавливается кодом Recovery Code, ключ аппаратного кошелька — его собственной резервной фразой.
Плагины
Механизм позволяет подключить к кошельку дополнительный контракт, который вправе действовать от его имени в оговорённых рамках. Написано двенадцать плагинов, работоспособны два.
Красивые адреса и Recovery Code
Адрес контракта вычисляется из ключей владельца, поэтому «выбрать» адрес нельзя — его можно только подобрать перебором. Пользователь задаёт желаемое окончание адреса, сервер перебирает варианты сдвига ключа, пока не найдёт совпадение.
Что уходит на сервер
Только два публичных ключа. Приватный ключ, мнемоника и секрет приложения на сервер не передаются. Сервер возвращает найденный сдвиг и адрес; восстановить по ним приватный ключ невозможно.
Recovery Code
Результат подбора нельзя восстановить из одной мнемоники — нужен ещё найденный сдвиг. Поэтому пользователь получает отдельный код восстановления.
SeedForge — работа с мнемоническими фразами
Отдельный инструмент внутри приложения. Работает автономно: не обращается к сети и не связан с кошельками пользователя.
Досбор — основной сценарий инструмента. Он помогает, когда часть слов известна: пользователь фиксирует то, что помнит, а недостающие позиции перебираются до получения фразы с верной контрольной суммой. Случайность берётся из криптографического источника операционной системы.
TON Connect и встроенный браузер
TON Connect — стандартный протокол, по которому сайты запрашивают у кошелька подключение и подпись транзакций. Exton поддерживает его в двух режимах.
зашифровано отдельным ключом сессииСайт открыт в обычном браузере
или на компьютере
без посредникаСайт открыт во вкладке самого
кошелька
Что видит пользователь
Перед подключением показывается имя и адрес сайта. Перед подписью — получатель и сумма. Подключение и каждая транзакция подтверждаются отдельно; список активных подключений доступен в настройках, любое можно разорвать.
Подтверждение владения адресом
По запросу сайта кошелёк подписывает доказательство того, что владеет адресом. Подпись привязана к домену сайта и моменту времени, поэтому не переиспользуется на другом ресурсе.
Аппаратный кошелёк
Поддерживается Keystone 3 Pro. Устройство не подключается ни к сети, ни к телефону: обмен идёт анимированными QR-кодами — приложение показывает транзакцию, устройство сканирует её с экрана, подписывает и показывает подпись обратно.
Ключ аппаратного кошелька хранится в самом устройстве, и подпись формируется внутри него. В мультиподписи он даёт подпись второго участника; в обычном кошельке — единственную.
Аппаратный кошелёк работает с контрактом V4R2. Это ограничение прошивки устройства, а не приложения.
Хранение и защита
Секреты кошелька хранятся под защитой устройства. Ниже — где именно они лежат на каждой платформе, как устроен код доступа и что защищает от подбора.
Где лежат секреты
аппаратного модуляAES-256; отдельный ярус требует
биометрии на каждое чтение
Код доступа
Шестизначный, хранится не сам, а в виде необратимого преобразования PBKDF2 с 600 000 повторений и случайной солью. Сверка выполняется за постоянное время, чтобы по её длительности нельзя было судить о правильности.
Защита от подбора
Прочие меры
- Затирание ключей в памяти после использования — на уровне нативного кода
- Запрет снимков экрана на страницах с фразой, ключом и кодом восстановления
- Экран-заслонка при сворачивании приложения
- Автоблокировка по бездействию
- Запрет незашифрованных сетевых соединений
- Запрет резервного копирования данных приложения в облако
- Буфер обмена очищается сам: фраза через минуту, адрес и ключ через две
Инфраструктура и обновления
Серверная часть решает три задачи и никогда не имеет доступа к средствам пользователей: приватных ключей на ней нет.
Кэширование
Ответы блокчейн-API кэшируются с разным сроком: неизменяемые данные NFT — сутки, курсы — минуту, баланс — шесть секунд. Никогда не кэшируются счётчик транзакций и сама отправка: устаревший счётчик сделал бы подпись недействительной, а отправка не является повторяемой операцией.
Выпуск версий
Android обновляется внутри приложения. Каждый выпуск проходит единый порядок: метка версии, публикация, архив, обновление каталога, выкладка с резервной копией и обязательная сверка. Файл на сервере сверяется с локальным архивом побайтово, проверяется версия внутри установочного файла и подпись разработчика.
iOS в магазин приложений не публиковался.
Статус функций
Разделение введено, чтобы отличать работающее от заготовок в исходном коде.
Открытые вопросы
Раздел включён намеренно: документ описывает состояние как оно есть, включая известные расхождения. Все пункты установлены разбором исходного кода; исправленные в коде войдут в следующие выпуски. Технические подробности уязвимостей раскрываются после их исправления.
TON Native между платформамиВывод ключа на iOS и в SeedForge отличался от Android; из одной фразы получались разные кошелькиИсправлено в коде
их не затрагивалоИсправлено в коде
кода доступаДействовала только на экране блокировкиИсправлено в коде
во встроенном браузереУсиливается проверка того, какой сайт запрашивает подключениеВ работе
