Как я интегрировал блокчейн TON в Trust Wallet

У меня была криптовалюта TON. У меня был криптокошелек Trust Wallet. Но использовать их вместе я не мог — TON просто не поддерживался.

Можно было подождать. Но я решил сделать всё сам.

Через месяц TON заработал в кошельке со 130 миллионами пользователей.

Как я интегрировал блокчейн TON в Trust Wallet

Грант, который чуть не провалился

Я заметил, что 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.

Структура транзакции

Чтобы создать транзакцию из кошелька, нужно отправить сообщение в смарт-контракт кошелька:

External Message (от пользователя к его контракту) ├── header: адрес контракта отправителя ├── stateInit: код и данные (только для первой транзакции) └── body: ├── signature: подпись Ed25519 └── signing_message: ├── wallet_id, expire_at, seqno └── Internal Message (получателю) ├── header: "отправить Y нанотонов на адрес Z" └── body: комментарий к переводу

Углубляться не буду. Подробнее о V4-кошельке можно почитать в документации — там же есть исходный код.

Cells и BOC — уникальная модель данных

Все данные в TON представлены как дерево ячеек (Bag of Cells). Каждая ячейка содержит до 1023 бит данных и до 4 ссылок на другие ячейки.

Вот как мы создаём ячейку с данными V4R2-кошелька:

Cell::Ref WalletV4R2::createDataCell() const { CellBuilder builder; builder.appendU32(0); // sequence_number builder.appendU32(walletId); // wallet_id builder.appendRaw(publicKey.bytes, 256); // public key builder.appendBitZero(); // флаг "нет плагинов" return builder.intoCell(); // Всего: 321 бит }

Чтобы собрать транзакцию, нужно правильно скомпоновать эти ячейки: адрес получателя, сумма, комментарий — всё упаковывается в BOC. К счастью, сериализатор BOC уже был реализован.

Форматы адресов

Everscale поддерживает только raw-адреса:

0:4f6bbb5de550f01a5b73792ceca77d8c933ab396a1e300eb0ab5a5f49a430986

В TON есть ещё и user-friendly формат:

EQBPa7td5VDwGltzeSzsp32MkzqzlqHjAOsKtaX0mkMJhq_B

Это base64-строка с информацией о типе адреса и контрольной суммой. Контрольная сумма помогает отловить опечатки в сид-фразах.

Почему Tonkeeper и Trust Wallet несовместимы

Проблема с мнемоникой

В мире блокчейнов правят стандарты. Многое из того, что появилось в Bitcoin, используется до сих пор. BIP39 описывает, как из сид-фразы получить приватный ключ. Формула:

seed = hash(mnemonic + salt)

По стандарту:

salt = "mnemonic" + password.

В TON:

salt = "TON Default seed".

Результат: одна и та же сид-фраза даёт разные ключи в 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.

Цифры:

  • 130 миллионов пользователей Trust Wallet получили доступ к TON
  • Грант за интеграцию блокчейна: $4,250
  • Грант за добавление Jettons: $4,000

Код:

Через несколько месяцев я добавил Jettons, а потом перешёл к другим проектам для TON и NEAR. Но это уже история для другого раза.

Хочу поблагодарить всех, кто участвовал:

Tao Xu, Sztergbaum Roman, optout, Sergei, Viacheslav из команды Trust Wallet — за организацию и код-ревью

Кирилл из команды TON — за управление всем, Нарек — за техническую поддержку от TON, Steve Yun - за организацию и за грант

Вячеслав — за реализацию основной интеграции

Vladimir из Trust Wallet — за то, что сделал это возможным, и за код-ревью

И всех, кто внёс вклад в этот проект

Оригинал здесь

Начать дискуссию