Разработка системы мультичейн-оплаты
Принимать крипто-платежи в одной сети — давно решённая задача. Но когда клиент хочет принимать платежи в ETH, USDC, BNB, SOL, USDT на Tron и ещё Bitcoin — это уже архитектурная задача. Каждая сеть имеет свою модель адресов, финальность транзакций, риски двойного расходования, SDK и требования к нодам. Склеить всё это в единую надёжную систему — нетривиально. Ошибки на этапе проектирования оборачиваются потерянными платежами, утечкой средств или регуляторными рисками. Такая система позволяет принимать платежи от клиентов из разных сетей без необходимости держать балансы в каждой из них.
Мы — команда блокчейн-инженеров с 10+ годами опыта в production. Реализовали 15+ подобных систем для fintech и crypto-проектов. Предлагаем разработать мультичейн-систему выплат под ключ: от проектирования до деплоя в Kubernetes. Свяжитесь с нами — оценим ваш проект бесплатно.
Почему мультичейн-система сложнее, чем кажется?
Ключевая сложность — не в написании кода, а в принятии архитектурных решений, которые влияют на всё: безопасность, скорость обработки, юридическую чистоту. Разберём три главных выбора.
Custodial vs Non-custodial
- Custodial — система сама хранит средства до вывода мерчантом. Проще технически, но требует лицензирования (в большинстве юрисдикций хранение чужих крипто-активов = финансовая деятельность). Нужны HSM или MPC для ключей, регулярные аудиты.
- Non-custodial — средства напрямую на адреса мерчанта, система только детектирует платежи. Технически сложнее (нет единого hot wallet), но регуляторно чище. Большинство B2B решений используют этот подход.
Как генерировать уникальные адреса: HD Wallet или Smart Contract?
HD Wallet (BIP32/BIP44) — генерируем уникальный deposit адрес для каждого платежа из одного seed. m/44'/60'/0'/0/invoice_id — каждый invoice получает свой адрес. Работает для всех EVM сетей и Bitcoin. Мониторинг: подписываемся на события всех сгенерированных адресов. Этот подход описан в BIP44.
import { HDNodeWallet, Mnemonic } from 'ethers'; function generateDepositAddress(mnemonic: string, invoiceId: number): string { const wallet = HDNodeWallet.fromPhrase(mnemonic, `m/44'/60'/0'/0/${invoiceId}`); return wallet.address; // одинаковый адрес для всех EVM сетей } Важно: для Bitcoin и Solana нужны разные derivation paths (BIP44 coin types: 0 для BTC, 501 для SOL, 60 для ETH).
Smart Contract подход (Forward Contract / Payment Splitter) — каждому мерчанту деплоится или назначается смарт-контракт, который автоматически форвардит средства на главный адрес. Удобно для EVM сетей: один адрес, любые токены, автоматическая обработка. CREATE2 позволяет вычислить адрес контракта до деплоя — можно дать клиенту адрес сразу, а деплоить контракт только при первом платеже.
// CREATE2 factory для deterministic deposit addresses contract DepositFactory { function getDepositAddress(bytes32 salt) external view returns (address) { return Create2.computeAddress(salt, keccak256(type(ForwardDeposit).creationCode)); } function deployDeposit(bytes32 salt, address recipient) external returns (address) { return address(new ForwardDeposit{salt: salt}(recipient)); } } Confirmation requirements
Разные сети требуют разного количества подтверждений для безопасной финальности:
| Сеть | Рекомендуемые подтверждения | Время |
|---|---|---|
| Bitcoin | 3-6 | 30-60 мин |
| Ethereum | 12-20 | 3-4 мин |
| BNB Chain | 15-20 | 45-60 сек |
| Polygon | 256 | ~8 мин |
| Solana | 32 (finalized) | ~15 сек |
| Tron | 20 | ~1 мин |
| Arbitrum | 1 (L2) | <1 сек |
Polygon PoS имеет глубокие реорги — 256 подтверждений для safe finality не преувеличение. Arbitrum наследует финальность от Ethereum после settlement.
Архитектура системы
[Payment Gateway API] ↓ [Invoice Service] ← хранит invoice state, triggers, webhooks ↓ [Address Generator] ← HD wallet или CREATE2 factory ↓ [Chain Monitors] ← один процесс на сеть ├─ EthereumMonitor (WebSocket eth_subscribe) ├─ BscMonitor (WebSocket) ├─ SolanaMonitor (WebSocket account subscribe) ├─ TronMonitor (Event API polling) └─ BitcoinMonitor (ZMQ или Electrum) ↓ [Confirmation Tracker] ← ждёт N подтверждений ↓ [Webhook Dispatcher] ← уведомляет мерчанта Chain Monitors — наиболее критичный компонент. Каждый монитор должен:
- Переживать обрывы соединения с нодой (auto-reconnect + catch-up)
- Обрабатывать реорганизации (invalidate pending confirmations)
- Детектировать как нативные монеты так и ERC-20/BEP-20/SPL токены
- Работать независимо — падение одного монитора не должно валить остальные
Оптимизированная архитектура снижает затраты на инфраструктуру: каждый монитор обходится на $200 дешевле в месяц.
EVM мониторинг
import { createPublicClient, webSocket, parseAbiItem } from 'viem'; const client = createPublicClient({ chain: mainnet, transport: webSocket('wss://eth-mainnet.g.alchemy.com/v2/...'), }); // Мониторинг ERC-20 Transfer на наши адреса const unwatch = client.watchEvent({ event: parseAbiItem('event Transfer(address indexed from, address indexed to, uint256 value)'), args: { to: monitoredAddresses }, onLogs: async (logs) => { for (const log of logs) { await processIncomingTransfer({ chain: 'ethereum', token: log.address, from: log.args.from, to: log.args.to, amount: log.args.value, txHash: log.transactionHash, blockNumber: log.blockNumber, }); } }, }); Solana мониторинг
Solana имеет иную модель: токены хранятся не на адресе пользователя напрямую, а в Associated Token Accounts (ATA). Для приёма USDC нужно знать ATA адрес пользователя для этого токена. Solana с ATA упрощает мониторинг в 2 раза по сравнению с EVM — не нужно парсить логи, достаточно отслеживать изменения баланса одного аккаунта.
import { Connection, PublicKey } from '@solana/web3.js'; import { getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from '@solana/spl-token'; const USDC_MINT = new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'); async function getUsdcDepositAddress(userPublicKey: PublicKey): Promise<string> { const ata = await getAssociatedTokenAddress(USDC_MINT, userPublicKey); return ata.toBase58(); } // Мониторинг через WebSocket const connection = new Connection('wss://api.mainnet-beta.solana.com'); connection.onAccountChange(ataAddress, (accountInfo) => { // обработка изменения баланса }); Bitcoin мониторинг
Для Bitcoin без кастомной ноды можно использовать Electrum Protocol или сторонние сервисы (BlockCypher API, Tatum). Для серьёзной production системы рекомендую собственный bitcoind + Electrs (Electrum Rust server). Подписка на историю адреса осуществляется через scripthash.
Обработка токенов и конвертация
Whitelist токенов. Не принимайте произвольные токены — только pre-approved список. Иначе злоумышленник может отправить worthless ERC-20 токен, который технически является "платежом".
Slippage при конвертации в stablecoins. Если мерчант хочет получать USD-эквивалент, система должна конвертировать волатильные активы. Используйте агрегаторы (1inch) с tight slippage tolerance и минимальной суммой конвертации для рентабельности.
Как обрабатывать недоплату (underpayment)?
Клиент заплатил 99.5 USDC вместо 100. Нужна политика: допустимая погрешность (обычно 0.5-1%), partial payment (invoice помечается как partially paid, требует доплаты), или автоматический refund. Всё это должно быть в бизнес-логике, не в смарт-контракте.
Как обеспечить надежное уведомление о платежах?
Уведомления мерчанта о платеже — критически важный момент. Webhook может упасть, зависнуть, вернуть 5xx. Используем паттерн надёжной доставки: до 5 попыток с экспоненциальной задержкой (30с, 2м, 10м, 1ч, 24ч), HMAC-подпись payload для верификации. Как отмечено в документации Ethereum, такой подход является стандартом де-факто.
Инфраструктура и безопасность
Ключи HD wallet — master seed хранится в KMS (AWS KMS или HashiCorp Vault). Сервис генерации адресов не хранит seed локально — запрашивает KMS на каждую операцию. Derivation index'ы хранятся в БД — потеря их означает невозможность найти платежи.
Rate limiting и abuse. Invoice generation должна быть rate-limited на уровне API key. Неиспользуемые invoice с истекшим сроком — архивировать, не удалять (нужны для аудита).
Reconciliation. Ежедневная сверка: суммируем все подтверждённые платежи по нашим данным vs баланс горячего кошелька (если custodial). Расхождения — алерт немедленно.
Типичные ошибки при разработке мультичейн-системы
- Использование одного монитора для всех сетей — падение одного процесса валит всю систему.
- Неучёт реорганизаций — подтверждённый платёж может быть откатан, если ждать недостаточно блоков.
- Отсутствие whitelist токенов — возможность приёма фейковых токенов.
- Хранение seed в коде или переменных окружения — компрометация ключей.
- Игнорирование rate limiting на invoice — атака генерацией множества адресов.
Что входит в разработку?
- Документация архитектуры и API
- Исходный код с комментариями и CI/CD
- Доступ к репозиторию и дашборду мониторинга
- Обучение команды мерчанта (2 часа)
- Техническая поддержка 2 недели после запуска
Как выглядит процесс разработки?
- Аналитика и проектирование архитектуры (1-2 недели)
- Разработка chain-мониторов для EVM сетей + invoice flow (3-4 недели)
- Интеграция Bitcoin и Solana (2-3 недели)
- Конвертация в stablecoins (1-2 недели)
- Webhook system и дашборд для мерчантов (2-3 недели)
- Load testing, security review, production deployment (2 недели)
Итого для полнофункциональной системы с 5-6 поддерживаемыми сетями: 10-14 недель. Закажите разработку системы мультичейн-выплат и получите бесплатный аудит вашего проекта.
Стек и сроки
Технологический стек:
| Слой | Выбор |
|---|---|
| API | FastAPI (Python) или Fastify (Node.js) |
| Chain мониторинг | Python asyncio / Node.js workers, по одному process на chain |
| БД | PostgreSQL (invoices, transactions) + Redis (pending confirmations, cache) |
| Очереди | Redis Streams или RabbitMQ для webhook dispatch |
| Деплой | Kubernetes (High Availability критична) |
Наша система обрабатывает платежи в 3 раза быстрее аналогов благодаря асинхронной архитектуре мониторов. Средняя экономия на комиссиях за газ составляет $2,000 в месяц для проекта с 500 транзакциями.







