Отметим: когда клиент приходит к нам с идеей P2P-биржи криптовалют, первое, что мы обсуждаем — эскроу-механизм. Без него сделки между трейдерами превращаются в «доверься или проиграй». Мы закладываем escrow в архитектуру с самого старта: либо смарт-контракт на EVM-совместимой цепи, либо кастодиальный сервис с мультисигом. Выбор зависит от требований к скорости, комиссиям и децентрализации. При правильной реализации средняя газовая комиссия на Ethereum составляет около $5 за одну сделку, а время подтверждения блока — от 12 секунд до нескольких минут в часы пик. На Polygon эти же операции обходятся в $0.02, что при 10 000 сделок даёт экономию в $49 800. Разберём детали.
Как построить архитектуру P2P-обмена криптовалют
Смарт-контракт escrow — разработка мобильного приложения
Продавец депонирует крипту в контракт через approve() + deposit(). Покупатель переводит фиат любым способом → нажимает «подтвердить получение» → контракт вызывает release() и отправляет крипту покупателю. Если спор — арбитражный адрес может вызвать resolveDispute(winner).
// Упрощённая логика escrow на EVM-совместимой цепи contract P2PEscrow { enum Status { ACTIVE, RELEASED, REFUNDED, DISPUTED } struct Trade { address seller; address buyer; address token; uint256 amount; Status status; } mapping(uint256 => Trade) public trades; address public arbiter; function deposit(uint256 tradeId, address buyer, address token, uint256 amount) external { IERC20(token).transferFrom(msg.sender, address(this), amount); trades[tradeId] = Trade(msg.sender, buyer, token, amount, Status.ACTIVE); } function release(uint256 tradeId) external { Trade storage t = trades[tradeId]; require(msg.sender == t.seller, "Only seller"); require(t.status == Status.ACTIVE); t.status = Status.RELEASED; IERC20(t.token).transfer(t.buyer, t.amount); } function dispute(uint256 tradeId) external { Trade storage t = trades[tradeId]; require(msg.sender == t.buyer || msg.sender == t.seller); t.status = Status.DISPUTED; } function resolveDispute(uint256 tradeId, address winner) external { require(msg.sender == arbiter); Trade storage t = trades[tradeId]; require(t.status == Status.DISPUTED); IERC20(t.token).transfer(winner, t.amount); } } | Параметр | Смарт-контракт | Кастодиальный сервис |
|---|---|---|
| Децентрализация | Да, пользователи контролируют ключи | Нет, оператор управляет кошельком |
| Газовые сборы | До $5 на ETH, до $0.02 на Polygon | Нет |
| Скорость транзакции | 12 с – несколько минут | Мгновенно |
| Безопасность | Аудит контракта обязателен | HSM, мультисиг, cold wallet |
Кастодиальный escrow
Сервер хранит крипту на hot wallet. Быстрее, без газа, проще UX. Требует высоких стандартов безопасности: HSM для приватных ключей, мультисигнатурные кошельки (Gnosis Safe), cold/hot wallet разделение.
Мобильный клиент: архитектура и Web3
На iOS используется web3.swift или кастомная интеграция через URLSession к JSON-RPC. На Android — web3j. Для кошелька пользователя — WalletConnect v2 (Sign SDK): позволяет подключить MetaMask, Trust Wallet, Rainbow и отправлять транзакции через deep link без хранения ключей в приложении. По данным официальной документации WalletConnect, подключение занимает менее 2 секунд.
// Подключение через WalletConnect v2 на iOS import WalletConnectSign class WalletService { func connect() async throws { let methods: Set<String> = ["eth_sendTransaction", "personal_sign"] let chains = [Blockchain("eip155:1")!] // Ethereum mainnet let namespaces: [String: ProposalNamespace] = [ "eip155": ProposalNamespace( chains: chains, methods: methods, events: ["chainChanged", "accountsChanged"] ) ] let uri = try await Sign.instance.connect(requiredNamespaces: namespaces) // Открываем Deep Link к кошельку или показываем QR await UIApplication.shared.open(uri.deepLink) } } Как интегрировать WalletConnect: пошаговая инструкция
- Установите SDK:
pod 'WalletConnectSwiftV2'для iOS илиimplementation 'com.walletconnect:sign:2.0'для Android. - Настройте проект в облачном дашборде WalletConnect получите
projectId. - Инициализируйте клиент через
Sign.instance.configure(projectId: ...). - Вызовите метод
connect(requiredNamespaces:)для создания пары. - Отобразите URI в виде QR-кода или deep link.
- Обработайте события
sessionSettlementиsessionProposal.
Лента ордеров и real-time обновления
Список ордеров на покупку/продажу должен обновляться в реальном времени — WebSocket от сервера. Новый ордер, изменение цены, закрытие сделки — всё через push по ws://. На клиенте URLSessionWebSocketTask (iOS) или OkHttp WebSocket (Android).
Фильтрация ордеров: валюта, способ оплаты (Tinkoff, Sberbank, СБП, наличные), диапазон суммы, рейтинг продавца. Рейтинговая система — обязательный элемент P2P. Без неё площадка не набирает доверие. Храним историю сделок и отзывы, рейтинг считаем на сервере.
Почему KYC и чат — обязательные элементы?
Верификация пользователей (KYC)
Регуляторные требования для P2P-площадок: хотя бы базовый KYC (фото паспорта + selfie). На iOS — VisionKit документ-сканер, на Android — ML Kit Document Scanner. Проверку документов отдаём на SumSub, Veriff или Jumio через их мобильный SDK — самостоятельно реализовывать liveness detection нет смысла.
Лимиты по умолчанию для неверифицированных пользователей — до 1000 USD, повышение после KYC.
Чат между трейдерами
Встроенный чат между покупателем и продавцом в рамках сделки — критичная функция. Без неё не решить спорные ситуации. Реализуем через Firebase Realtime Database или Stream Chat SDK — последний даёт готовый UI для iOS/Android, экономит 2–3 дня разработки. Сообщения шифруем end-to-end через libsignal если нужна дополнительная приватность.
Подтверждение оплаты фиата — скриншот из банка, загружаемый в чат. Хранится в Firebase Storage или S3 с presigned URL.
Что входит в разработку
Состав работ по проекту
- Проектирование escrow-механизма и архитектуры приложения
- Разработка и аудит смарт-контракта (опционально). Стоимость аудита у сторонних фирм составляет от $2 000 до $5 000.
- Серверная часть: API, ордербук, escrow-логика
- Мобильные клиенты iOS + Android (Swift, Kotlin)
- Интеграция KYC (SumSub/Veriff) и чата (Stream)
- Подключение WalletConnect для работы с внешними кошельками
- Настройка уведомлений (APNs, FCM)
- Документация, доступ к репозиторию, тестирование на testnet/mainnet
- Обучение команды заказчика и поддержка 1 месяц
Безопасность
Rate limiting на эндпоинтах публикации ордеров — без него конкуренты зальют рынок мусорными ордерами. Anti-scam проверки: новый аккаунт не может сразу публиковать большие ордера. 2FA через TOTP (Google Authenticator) — обязательно для вывода средств. Биометрическая аутентификация через LocalAuthentication (iOS) / BiometricPrompt (Android) для подтверждения сделок.
Этапы работы
| Этап | Срок |
|---|---|
| Проектирование: escrow-механизм, архитектура | 1 неделя |
| Смарт-контракт + аудит (опционально) | 1–2 недели |
| Серверная часть (API, ордербук, escrow) | 2–3 недели |
| Мобильный клиент iOS + Android | 3–4 недели |
| KYC-интеграция, чат | 1 неделя |
| Тестирование, testnet/mainnet деплой | 1 неделя |
Итого: 8–12 недель в зависимости от типа escrow и набора функций. Стоимость рассчитывается индивидуально после анализа требований.
Свяжитесь с нами для оценки проекта и получите консультацию бесплатно. Наш опыт — более 50 успешных кейсов в сфере криптофинансовых приложений. Гарантируем соблюдение сроков и прозрачный код без скрытых сюрпризов. Получите детальный расчёт стоимости и сроков в ответ на ваш запрос. Также закажите предварительную оценку — мы подготовим предложение в течение 24 часов.







