Как я интегрировал блокчейн TON в Trust Wallet
У меня была криптовалюта TON. У меня был криптокошелек Trust Wallet. Но использовать их вместе я не мог — TON просто не поддерживался.
Можно было подождать. Но я решил сделать всё сам.
Через месяц TON заработал в кошельке со 130 миллионами пользователей.
Грант, который чуть не провалился
Я заметил, что TON Foundation выдаёт гранты на разработку. Подал заявку. Почти сразу со мной связались — созвонились, обсудили детали.
Параллельно написал другу, который работал в Trust Wallet. Вместе мы создали групповой чат: разработчики Wallet Core, команда TON, мой друг-инженер и я.
А дальше всё усложнилось.
У Trust Wallet две части. Wallet Core — открытый исходный код, отвечает за подписание транзакций. После обсуждения в чате стало понятно, что сюда мы можем контрибьютить. Но есть вторая часть — взаимодействие с приложением (получение балансов, отправка транзакций). Она закрытая. Это может делать только внутренняя команда Trust Wallet.
А это значит: одобрение менеджмента, выделенное время инженеров, ответственность. Trust Wallet не может просто сказать «окей, выкатим через месяц».
У TON Foundation возникли сомнения:
А что если Trust Wallet так и не добавит это в приложение? Зачем тогда финансировать грант?
В итоге обе стороны нашли компромисс. TON одобрил грант; Trust Wallet пообещал приоритизировать интеграцию. Все в выигрыше: новый блокчейн и пользователи для Trust Wallet, новый кошелёк и пользователи для TON.
Мы начали писать код. Основную разработку вёл мой друг — я ревьюил и дорабатывал. PR смёржили примерно за месяц.
Как устроен Trust Wallet изнутри
Trust Wallet работает на трёх платформах: Android, iOS и браузерное расширение.
В основе лежит Wallet Core — опенсорсная библиотека с поддержкой более 130 блокчейнов. Написана на C++ и Rust. Её использует не только Trust Wallet — другие крупные кошельки, например Crypto.com, тоже на ней работают. Библиотека отвечает за:
- Генерацию приватных ключей
- Создание и валидацию адресов
- Подписание транзакций
- Взаимодействие со смарт-контрактами
Именно сюда мы добавили TON
Неожиданный бонус: код от Everscale
Мало кто знает всю историю.
Изначально TON запустил Дуров, а часть разработки вела TON Labs. После американских санкций Дуров отошёл от проекта — но TON Labs не остановились. Они продолжили развивать форк под названием Free TON, который позже стал Everscale.
Потом появился новый TON Foundation, одобренный Дуровым. Теперь он интегрирован в Telegram, активно развивается и является лидирующей сетью TON.
Вот в чём суть: TON Labs проделали впечатляющую техническую работу. Everscale уже был в Wallet Core. Мы вынесли общий код в модуль CommonTON.
Теперь этот код работает и для Everscale, и для TON.
Что делает TON уникальным
Кошелёк — это смарт-контракт
В TON кошелёк — это не просто адрес, а полноценный смарт-контракт. Everscale использует V3, для TON мы реализовали V4R2.
Структура транзакции
Чтобы создать транзакцию из кошелька, нужно отправить сообщение в смарт-контракт кошелька:
Углубляться не буду. Подробнее о V4-кошельке можно почитать в документации — там же есть исходный код.
Cells и BOC — уникальная модель данных
Все данные в TON представлены как дерево ячеек (Bag of Cells). Каждая ячейка содержит до 1023 бит данных и до 4 ссылок на другие ячейки.
Вот как мы создаём ячейку с данными V4R2-кошелька:
Чтобы собрать транзакцию, нужно правильно скомпоновать эти ячейки: адрес получателя, сумма, комментарий — всё упаковывается в BOC. К счастью, сериализатор BOC уже был реализован.
Форматы адресов
Everscale поддерживает только raw-адреса:
В TON есть ещё и user-friendly формат:
Это base64-строка с информацией о типе адреса и контрольной суммой. Контрольная сумма помогает отловить опечатки в сид-фразах.
Почему Tonkeeper и Trust Wallet несовместимы
Проблема с мнемоникой
В мире блокчейнов правят стандарты. Многое из того, что появилось в Bitcoin, используется до сих пор. BIP39 описывает, как из сид-фразы получить приватный ключ. Формула:
По стандарту:
В TON:
Результат: одна и та же сид-фраза даёт разные ключи в Tonkeeper и Trust Wallet. Перенести кошелёк между ними нельзя.
Это не уникальная проблема TON — то же самое с Waves, Qtum и Polkadot (sr25519).
Валидация контрольной суммы
Контрольные суммы в seed-фразах защищают пользователей от опечаток — введёшь неправильное слово, и кошелёк отклонит фразу вместо того, чтобы сгенерировать неверный адрес (и потерять средства навсегда). В BIP-39 4-битная контрольная сумма встроена в последнее слово. В TON требуется, чтобы хеш фразы начинался с нулевого байта. Эти несовместимые подходы — ещё одна причина, почему Tonkeeper и Trust Wallet нельзя использовать взаимозаменяемо.
За пределами Wallet Core
Помимо реализации в Wallet Core, я передал команде Trust Wallet примеры кода: как получать данные о транзакциях, запрашивать состояние кошелька и так далее. Также консультировал по вопросам интеграции TON в приложение. Ещё добавил информацию о блокчейне и логотип в репозиторий assets.
Результат
Я наладил контакт с командами TON и Trust Wallet. Вместе с другом мы сделали интеграцию. Теперь этот код работает в Trust Wallet на всех платформах.
Январь 2023 — PR смёржен в Wallet Core.
Цифры:
Код:
- TON в Wallet Core — основная интеграция
- Jettons (токены TON) — добавлены позже
Через несколько месяцев я добавил Jettons, а потом перешёл к другим проектам для TON и NEAR. Но это уже история для другого раза.
Хочу поблагодарить всех, кто участвовал:
Tao Xu, Sztergbaum Roman, optout, Sergei, Viacheslav из команды Trust Wallet — за организацию и код-ревью
Вячеслав — за реализацию основной интеграции
Vladimir из Trust Wallet — за то, что сделал это возможным, и за код-ревью
И всех, кто внёс вклад в этот проект
Оригинал здесь