Skip to main content

Какие протоколы подключения используются

В кошельке Tonhub подключение к веб-приложениям и dApp для сети TON выполняется через протокол TON Connect. Для Solana отдельного протокола “Solana Connect” нет: подписание транзакций Solana в тех же приложениях работает через дополнительные методы, которые добавляются в ту же сессию TON Connect. Ниже описано, как это устроено.

TON Connect

TON Connect — это протокол для подключения кошельков к приложениям, то есть dApp, в сети TON. Он позволяет:
  • подключаться к приложению: приложение запрашивает разрешение на подключение, пользователь подтверждает его в кошельке, после чего приложение получает адрес TON-кошелька и при необходимости proof владения;
  • отправлять транзакции: приложение создает транзакцию, кошелек показывает ее пользователю и подписывает после подтверждения;
  • подписывать данные через signData: любые сообщения для авторизации или верификации без отправки средств;
  • отключаться: завершать сессию с приложением.
В Tonhub приложение, то есть dApp, открывается во встроенном браузере WebView. В веб-страницу встраивается специальный bridge-объект: приложение вызывает его методы, Tonhub обрабатывает эти вызовы, показывает экраны подтверждения, подписывает транзакции и возвращает результат обратно в WebView. Именно так в рамках одной сессии работают и подключение через TON Connect, и запросы на подписание Solana-транзакций.

Интеграция с Holders

Holders — один из основных примеров использования TON Connect в Tonhub. Интеграция с Holders построена именно на этой технологии. Holders открывается как Connect App, то есть приложение, работающее через общий bridge в WebView. При первом входе пользователь проходит процедуру подключения, то есть enroll: с сервера Holders загружается конфигурационный файл TON Connect /jsons/tonconnect-manifest.json, пользователь подтверждает подключение в кошельке, после чего сохраняются сессия и, при необходимости, токен от Holders.
Для TON Holders использует стандартный TON Connect: в ответ на запрос подключения кошелек передает TON-адрес и при необходимости proof, после чего Holders может запрашивать подписание TON-транзакций и данных через те же bridge-методы sendTransaction и signData.

Как работает коннектор Solana

Для Solana в экосистеме TON отдельного протокола “Solana Connect” нет. В Tonhub это решено следующим образом:
  • при подключении к Holders ответ включает не только TON-данные, то есть адрес и proof, но и Solana proof, благодаря чему Holders получает доступ к вашему Solana-адресу, который генерируется из того же кошелька;
  • для получения пользовательского токена сервер Holders принимает запрос, передающий авторизационные данные и для TON, и для Solana, то есть TonSolanaAuthRequest; таким образом, “подключение” Solana к Holders — это не отдельный протокол, а расширение одной сессии TON Connect данными Solana при первом подключении;
  • когда Holders нужно подписать транзакцию в сети Solana, приложение вызывает уже не TON Connect, а специальные bridge-методы sendSolanaTransaction или sendSolanaVersionedTransaction. Tonhub показывает экран подтверждения Solana-перевода, пользователь подписывает транзакцию, а подпись возвращается в Holders.

Разрешения и управление сессиями

Несколько приложений одновременно

Пользователь может быть одновременно подключен к нескольким приложениям, то есть Connect App. Список подключенных приложений сохраняется отдельно для каждого адреса кошелька, и у каждого приложения есть собственная сессия, встроенная или remote. Ограничений по количеству активных подключений нет.

Список активных подключений и отзыв доступа

Список подключенных Connect App, то есть приложений, к которым вы подключались через TON Connect, можно посмотреть в разделе приложений и браузера в Tonhub, то есть на экране с расширениями и подключенными приложениями. Там же отображаются и remote-сессии, если подключение происходило по QR-коду из внешнего браузера.

Как завершить сессию

Для каждого приложения в списке доступно действие “Revoke Access”. После подтверждения приложение удаляется из списка подключенных, сессия завершается, и при следующем входе приложение должно будет снова запросить подключение. Для remote-сессий отзыв также отправляется на сервер Tonhub по маршруту /connect/revoke, чтобы на другой стороне сессия тоже считалась недействительной.

Удаление Tonhub и смена устройства

Информация о подключенных приложениях и сессиях хранится локально на устройстве, то есть в памяти приложения. При удалении Tonhub эти данные удаляются. Все сессии с вашим кошельком со стороны dApp перестают работать при следующем запросе, потому что кошелек больше не отвечает. Переустановка Tonhub и восстановление кошелька по seed-фразе не восстанавливают старые подключения: каждое dApp нужно подключать заново.
Перенос кошелька на новое устройство через импорт seed-фразы также не переносит список подключенных приложений и сессий: они остаются привязаны к старому устройству. На новом устройстве список подключений будет пустым, и все dApp придется подключать снова.

Ограничения и поддерживаемые сценарии

Gasless, то есть оплата комиссии токеном: функция gasless-отправки в Tonhub в первую очередь работает для переводов внутри самого приложения. При запросе транзакции из внешнего dApp через TON Connect возможность оплачивать комиссии токенами, то есть gasless, может быть недоступна или ограничена, например в зависимости от типа актива и сценария использования. Полноценный gasless-сценарий через произвольный внешний dApp по TON Connect не работает; лучше всего эта функция подходит для переводов из самого приложения Tonhub.

Версионирование и совместимость

Версия TON Connect в Tonhub

Tonhub поддерживает протокол TON Connect версии 2, то есть CURRENT_PROTOCOL_VERSION = 2. Более старые версии не поддерживаются, то есть MIN_PROTOCOL_VERSION = 2. При подключении кошелек сообщает приложению максимальную поддерживаемую версию протокола.

Что следует учитывать разработчикам dApp

  • Методы: поддерживаются методы SendTransaction, то есть отправка одной или нескольких TON-транзакций; для wallet v5 — до 255 сообщений в одной транзакции, extraCurrencySupported: true, а также SignData для типов text, binary и cell. Остальные методы должны соответствовать спецификации TON Connect v2.
  • Manifest: приложение должно предоставлять конфигурационный файл, то есть manifest, по URL, указанному в запросе на подключение, то есть manifestUrl. Обязательные поля: name, url, iconUrl. Необязательные: termsOfUseUrl и privacyPolicyUrl. Если manifest отсутствует или некорректен, подключение будет отклонено.
  • Запрос на подключение: запрос должен содержать manifestUrl и непустой список items, то есть запрашиваемых данных, например ton_addr, ton_proof. Иначе запрос считается некорректным.
  • Дополнительные поля: приложение может запрашивать опциональные элементы, например proof; кошелек вернет только то, что поддерживает и что разрешил пользователь. Для интеграций вроде Holders поддерживается расширенный набор, включая solana_proof, но это не часть стандартного TON Connect, а дополнение Tonhub и Holders.

Безопасность

Во всех операциях при подключении к dApp, а также при подписании транзакций или данных, приватный ключ и seed-фраза никогда не передаются в приложение. Приложение получает только то, что кошелек явно отправляет в ответ на запрос, например адрес, proof, подпись транзакции и так далее. Подписание выполняется локально в Tonhub: dApp запрашивает подпись через bridge, пользователь подтверждает операцию в интерфейсе кошелька, после чего подписанные данные возвращаются приложению. Приватные ключи хранятся в защищенном хранилище устройства, то есть Keychain или Keystore, и никогда не покидают приложение. Подробнее об этом см. в общем разделе документации “Security”, где описано хранение ключей, PIN, биометрия и резервное копирование.