Транзакция отправлена — и пользователь смотрит на статус Pending следующие 10 минут. Это нормально для блокчейна, но ненормально — не получить уведомление, когда транзакция подтвердилась или зафейлилась. Отслеживание статуса транзакции — это real-time задача с несколькими уровнями: polling блокчейна, WebSocket-подключение, push-уведомление при финальном статусе. Без своевременных обновлений пользователи теряют доверие, а в криптокошельках с большим трафиком (например, 8000 транзакций в день) задержка даже в 5 секунд создаёт негативный опыт.
Наши инженеры с 5+ летним опытом в блокчейн-проектах реализовали отслеживание для 15+ криптокошельков. Сертифицированы Apple и Google, работали с Ethereum, Bitcoin, Solana и другими сетями, интегрировали WebSocket через Alchemy WebSocket API и Infura, настраивали push-уведомления через APNs и FCM. Гарантируем стабильную работу и своевременные обновления статуса.
Как выглядит жизненный цикл транзакции?
Ethereum-транзакция проходит через состояния: submitted → pending (mempool) → confirmed (1 confirmation) → finalized (12+ confirmations) → failed (reverted / dropped). Bitcoin: mempool → 1 confirmation → 6 confirmations (finalized). Solana — значительно быстрее: слоты по ~400ms, processed → confirmed → finalized за секунды. На клиенте нужно показывать текущее состояние и количество подтверждений.
| Блокчейн | Время блока | Подтверждений для финализации | Среднее время финализации |
|---|---|---|---|
| Ethereum | 12-15 сек | 12 (как 0x) или 64 (как 1) | ~3 мин (12 блоков) |
| Bitcoin | ~10 мин | 6 | ~60 мин |
| Solana | ~400 мс | 32 | ~13 сек |
Какие стратегии получения статуса существуют?
| Стратегия | Задержка | Нагрузка на клиент | Нагрузка на сервер |
|---|---|---|---|
| Polling (3–5 сек) | 3–5 сек | Высокая (частые запросы) | Высокая (RPC вызовы) |
| WebSocket | <1 сек | Низкая (постоянное соединение) | Средняя (подписки) |
| Webhook (Alchemy/Infura) | <1 сек | Нулевая (только push) | Низкая (сервер получает событие) |
Polling каждые 3–5 секунд при открытом экране — нормально. В фоне — только через silent push или WebSocket API. Экономия на инфраструктуре до 40% при использовании WebSocket вместо частого polling.
Polling через node RPC
// iOS — polling статуса ETH транзакции через JSON-RPC func pollTransactionStatus(txHash: String) async throws -> TransactionStatus { let params: [AnyEncodable] = [txHash, false] let receipt = try await ethClient.call(method: "eth_getTransactionReceipt", params: params) if receipt == nil { return .pending // Ещё в mempool } let confirmations = try await getConfirmationsCount(txHash: txHash) return confirmations >= requiredConfirmations ? .confirmed : .confirmingWith(count: confirmations) } Почему WebSocket быстрее polling?
WebSocket обеспечивает мгновенную передачу данных при появлении нового блока, в то время как polling имеет задержку до 5 секунд. Для критичных транзакций WebSocket — предпочтительный выбор. Мы помогаем выбрать оптимальный вариант под ваш бюджет и требования.
WebSocket подписка через Alchemy / Infura / QuickNode
// Бэкенд — подписка на событие через Alchemy WebSocket const { createAlchemyWeb3 } = require("@alch/alchemy-web3"); const web3 = createAlchemyWeb3(process.env.ALCHEMY_WS_URL); async function watchTransaction(txHash, userId) { const subscription = web3.eth.subscribe('newBlockHeaders'); subscription.on('data', async (blockHeader) => { const receipt = await web3.eth.getTransactionReceipt(txHash); if (receipt) { subscription.unsubscribe(); await updateTransactionStatus(txHash, receipt.status ? 'confirmed' : 'failed'); await sendPushNotification(userId, txHash, receipt.status); } }); } Как настроить отслеживание статуса транзакции через WebSocket?
- На сервере поднимаем WebSocket эндпоинт, авторизованный по токену пользователя.
- На клиенте устанавливаем соединение при переходе на экран списка транзакций.
- Подписываемся на события по
tx_hash— сервер отправляет обновления статуса. - При получении финального статуса закрываем соединение.
- Повторно подключаемся при переоткрытии экрана или после ошибки.
// Android — подписка на статус транзакции через WebSocket class TransactionStatusSocket( private val token: String, private val okHttpClient: OkHttpClient ) { fun subscribe(txHash: String): Flow<TransactionStatus> = callbackFlow { val ws = okHttpClient.newWebSocket( Request.Builder() .url("wss://api.yourwallet.app/ws/tx/$txHash") .header("Authorization", "Bearer $token") .build(), object : WebSocketListener() { override fun onMessage(webSocket: WebSocket, text: String) { val status = json.decodeFromString<TransactionStatusUpdate>(text) trySend(status.status) if (status.isFinal) close() } override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) { close(t) } } ) awaitClose { ws.close(1000, "Subscription ended") } } } Progress индикатор подтверждений
Для ETH отображаем прогресс к 12 подтверждениям. Используем ProgressView с градиентом от оранжевого к зеленому по мере увеличения count. Дизайн транзакции в разных статусах:
- pending — анимированный spinner, жёлтый акцент
- confirming — progress bar с количеством подтверждений
- confirmed — зелёная галочка, анимация
- failed — красный, причина ошибки если доступна (revert reason из receipt)
Push-уведомления при изменении статуса
При финальном статусе отправляем push пользователю:
{ "title": "Транзакция подтверждена", "body": "0.05 ETH отправлено на 0x742d...3B8C", "data": { "screen": "transaction_detail", "tx_hash": "0xabc123...", "status": "confirmed" } } Для failed транзакции — отдельный шаблон с описанием причины (revert reason или dropped from mempool).
Как устроена обработка dropped транзакций?
Транзакция может исчезнуть из mempool если gas price был слишком низким. Через 15–30 минут без подтверждения — транзакция считается dropped. Нужно detectить это:
suspend fun checkDroppedTransactions() { val pendingTxs = transactionDao.getPendingOlderThan(minutes = 20) pendingTxs.forEach { tx -> val receipt = ethClient.getTransactionReceipt(tx.hash) if (receipt == null) { transactionDao.updateStatus(tx.hash, TransactionStatus.DROPPED) pushService.notifyUser(tx.userId, "Транзакция не попала в блок", tx.hash) } } } Что входит в работу
Анализ текущей архитектуры кошелька и выбор стратегии (polling/WebSocket/webhook). Интеграция с блокчейн-нодами (Infura, Alchemy, QuickNode) или собственным узлом. Реализация клиентской логики: polling/WebSocket клиент для iOS и Android. Разработка progress bar для отображения количества подтверждений. Настройка push-уведомлений (APNs, FCM) при финальном статусе. Обработка dropped транзакций и ошибок (revert reason, timeout). Тестирование на тестовых сетях (Goerli, Sepolia) и mainnet. Документация и передача исходного кода.
Сроки и стоимость
Базовая реализация отслеживания с polling и push-уведомлениями занимает 6–10 рабочих дней. Полный цикл с WebSocket, progress bar, обработкой dropped транзакций и кастомными push — от 2 недель. Стоимость рассчитывается индивидуально после анализа проекта. Свяжитесь с нами для консультации и точной оценки.
Мы гарантируем качество, предоставляем поддержку после запуска. Опыт наших разработчиков подтвержден сертификатами Apple и Google. Получите бесплатную консультацию по архитектуре отслеживания для вашего криптокошелька.







