Разработка мобильного мультичейн-кошелька (Ethereum, BSC, Polygon, Solana, TON)
Мультичейн-кошелёк — это не «несколько независимых кошельков в одном приложении». Это единая мнемоническая фраза, из которой деривируются ключи для всех поддерживаемых блокчейнов. Пользователь видит одну seed-фразу из 12 слов, за которой стоят адреса в пяти (или пятидесяти) разных сетях.
Деривация ключей для разных блокчейнов
Все поддерживаемые сети используют один BIP39 seed, но разные пути деривации BIP44:
| Блокчейн | Coin Type | Путь деривации | Алгоритм подписи |
|---|---|---|---|
| Ethereum | 60 | m/44'/60'/0'/0/0 |
secp256k1 (ECDSA) |
| BSC | 60 | m/44'/60'/0'/0/0 |
secp256k1 (ECDSA) |
| Polygon | 60 | m/44'/60'/0'/0/0 |
secp256k1 (ECDSA) |
| Solana | 501 | m/44'/501'/0'/0' |
ed25519 |
| TON | 607 | m/44'/607'/0' |
ed25519 |
Ethereum, BSC и Polygon используют один и тот же адрес (одинаковый coin type 60 и путь) — разница только в chainId при подписании транзакций и в RPC endpoint. Это удобно для пользователя, но важно корректно управлять: при отправке нужно явно указывать сеть, иначе транзакция уйдёт не туда (и это невозвратимо).
Solana и TON используют ed25519 — другой эллиптический алгоритм, несовместимый с secp256k1. WalletCore от Trust Wallet поддерживает оба алгоритма и все перечисленные сети через единый интерфейс.
EVM-сети: Ethereum, BSC, Polygon
Один и тот же Ethereum-совместимый адрес, один и тот же приватный ключ — но разные сети, разные chainId:
- Ethereum Mainnet:
chainId = 1 - BSC:
chainId = 56 - Polygon:
chainId = 137
ChainId обязательно включается в подпись транзакции (EIP-155) — защита от replay-атак между сетями. Транзакция, подписанная для BSC, не пройдёт на Ethereum.
Для работы с EVM сетями: Web3j (Android), web3.swift (iOS), или ethers.js через JavaScriptCore/WebView если нужна максимальная кросс-платформенность JavaScript экосистемы. Для каждой сети — свой RPC провайдер:
val ethWeb3 = Web3j.build(HttpService("https://mainnet.infura.io/v3/YOUR_KEY"))
val bscWeb3 = Web3j.build(HttpService("https://bsc-dataseed.binance.org/"))
val polygonWeb3 = Web3j.build(HttpService("https://polygon-rpc.com"))
ERC-20 токены, NFT (ERC-721/1155) — работают одинаково на всех трёх сетях, разница только в RPC endpoint и адресах контрактов.
Solana: другая парадигма
Solana принципиально отличается от EVM-сетей архитектурно. Нет стандарта ERC-20 — есть SPL Token Program. Адреса — base58-encoded публичные ключи ed25519.
Подключение через Solana Mobile Adapter на Android или напрямую через JSON-RPC к ноде (mainnet-beta.solana.com). Для работы с токенами нужно понимать концепцию Associated Token Accounts (ATA) — у каждого токена на кошельке есть отдельный аккаунт, который нужно создать перед первым получением токена (rent-exempt lamports).
// Solana4J или сторонний Kotlin SDK
val connection = RpcClient("https://api.mainnet-beta.solana.com")
val balance = connection.getBalance(publicKey)
// Для SPL-токенов — находим ATA и читаем balance через getTokenAccountBalance
val tokenAccounts = connection.getTokenAccountsByOwner(
owner = publicKey,
filter = TokenAccountsFilter.byProgramId(TOKEN_PROGRAM_ID)
)
Комиссии в Solana фиксированные и крошечные (0.000005 SOL за базовую транзакцию) — не нужно выбирать gas price, что упрощает UX.
TON: JetBrains Kotlin + специфика блокчейна
TON (The Open Network) — блокчейн с уникальной архитектурой: умные контракты в виде акторов с собственным стеком, адреса в формате 0:... (raw) или user-friendly (EQ..., UQ...). Jetton — стандарт для токенов (аналог ERC-20).
TON SDK для Kotlin: ton-kotlin от tonapps, или официальный ton-blockchain/ton-kotlin. Для iOS — swift-ton или работа через JavaScriptCore с ton.js.
Особенность: для совместимости с Telegram Mini Apps и TonConnect 2.0 нужна интеграция TonConnect протокола — стандарт подключения dApps к TON кошелькам, аналог WalletConnect для EVM.
// TonConnect Swift SDK
let connector = TonConnect(manifestUrl: URL(string: "https://your-app.com/tonconnect-manifest.json")!)
connector.connect { result in
// пользователь подключился через TonConnect
}
Мультисеть UI/UX: критические решения
Переключение сетей. Чёткий визуальный индикатор текущей сети на главном экране — обязательно. Ошибка «отправил USDT на BSC-адрес вместо Ethereum» стоит пользователям реальных денег. Confirmation dialog при отправке: «Вы отправляете X USDT в сети BSC на адрес 0x...».
EVM-сети — один адрес. Пользователю не нужно знать, что его ETH и BNB-адрес одинаков. Но нужно понимать, что балансы разные: ETH на Ethereum-сети ≠ ETH (если его там нет) на BSC.
Bridging. Перевод активов между сетями через мосты (Stargate, Across, официальный Polygon Bridge) — частый запрос. Интеграция через SDK или iframe WebView с разрешёнными URL. Это сложная и рискованная область (мосты регулярно взламывают) — предупреждение пользователю обязательно.
Цены и обменные курсы
Балансы в нативных токенах малоинформативны без USD-конвертации. CoinGecko API — бесплатный до определённого лимита, покрывает все основные токены. DeFiLlama — альтернатива. CoinMarketCap — платный, но более надёжный для production.
Кэшировать цены на сервере с TTL 60 секунд — не гонять запросы с каждого клиента напрямую к внешнему API.
Безопасность на уровне мультичейн
Основные угрозы, специфичные для мультичейн:
Address poisoning. Атака: злоумышленник отправляет 0 токенов с адреса, похожего на часто используемый контакт (совпадают первые и последние 4 символа). Пользователь копирует адрес из истории — и отправляет на мошеннический адрес. Защита: предупреждение при выборе адреса из истории, полное отображение адреса без сокращения в финальном экране подтверждения.
Contract interaction. При взаимодействии с dApps через WalletConnect приложение должно декодировать и отображать calldata понятно: не 0xa9059cbb000000000..., а «Перевод 100 USDC на адрес 0x1234...». Для стандартных ABI это решаемо через ABI декодирование.
Нулевые апрувы ERC-20. После взаимодействия с DeFi протоколами у многих токенов остаются approve с максимальной суммой (uint256.max). Функция «Управление апрувами» в кошельке — хорошая практика.
Стек и инструменты
- Кросс-платформа: Trust WalletCore (C++ библиотека, bindings для iOS/Android) — единая реализация криптографии
- EVM RPC: Web3j (Android), web3.swift (iOS), ethers.js через JSC
- Solana: sol4k (Kotlin), solana-swift (iOS)
- TON: ton-kotlin, swift-ton
- WalletConnect: официальные iOS/Android SDK v2
- TonConnect: @tonconnect/sdk
Если проект на Flutter — wallet_core flutter bindings + web3dart + solana_dart + ton_dart. Экосистема менее зрелая, чем нативная, но покрывает основные кейсы.
Сроки
Базовый мультичейн кошелёк с EVM (ETH/BSC/Polygon) + Solana + TON, балансами, отправкой/получением, историей транзакций, WalletConnect и TonConnect — 2–4 месяца для нативного iOS+Android. Добавление swap через агрегаторы (1inch для EVM, Jupiter для Solana) — ещё 3–4 недели. Стоимость рассчитывается после детальных требований: какие сети, какие DeFi интеграции, нужен ли фиат on/off-ramp.







