Бэкенд dApp на Node.js: разработка с нуля

Мы разрабатываем серверную часть dApp на Node.js для проектов, где on-chain логики недостаточно. Если вам требуется приватный RPC прокси, SIWE-аутентификация, event indexer или газлесс релайер — мы создадим инфраструктуру с нуля под ключ. Без бэкенда не обойтись, когда нужны: агрегация данных с неск

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1003

Мы разрабатываем серверную часть dApp на Node.js для проектов, где on-chain логики недостаточно. Если вам требуется приватный RPC прокси, SIWE-аутентификация, event indexer или газлесс релайер — мы создадим инфраструктуру с нуля под ключ. Без бэкенда не обойтись, когда нужны: агрегация данных с нескольких источников, кэширование дорогих on-chain запросов (экономия до 40% затрат на RPC), gasless транзакции (relayer), верификация подписей. Мы используем современный стек: Fastify, ethers.js/viem, Redis, Prisma. Наш опыт — более 10 лет в блокчейн-разработке и 50+ завершённых dApp проектов. Если вам нужен надёжный бэкенд dApp, закажите консультацию — рассчитаем состав работ и сроки.

Разработка бэкенда dApp на Node.js: ключевые компоненты

RPC abstraction layer — бэкенд dapp на

Прямое обращение из фронтенда к Infura/Alchemy раскрывает API ключ. Бэкенд проксирует RPC вызовы, добавляет кэширование и rate limiting:

import { JsonRpcProvider, Contract } from 'ethers'; import Fastify from 'fastify'; const provider = new JsonRpcProvider(process.env.RPC_URL); const app = Fastify(); // Кэшированный endpoint для данных контракта app.get('/contract/:address/balance/:account', { config: { rateLimit: { max: 100, timeWindow: '1 minute' } } }, async (req, reply) => { const { address, account } = req.params as { address: string; account: string }; const cacheKey = `balance:${address}:${account}`; const cached = await redis.get(cacheKey); if (cached) return { balance: cached, cached: true }; const contract = new Contract(address, ERC20_ABI, provider); const balance = await contract.balanceOf(account); await redis.setex(cacheKey, 12, balance.toString()); // кэш на ~1 блок (12 сек) return { balance: balance.toString(), cached: false }; }); 

Как реализовать безопасную аутентификацию без пароля?

Sign-In With Ethereum (EIP-4361) — стандарт аутентификации без пароля, описанный в EIP-4361. Пользователь подписывает SIWE-сообщение, бэкенд верифицирует подпись и выдаёт JWT:

import { SiweMessage } from 'siwe'; import jwt from 'jsonwebtoken'; app.post('/auth/verify', async (req, reply) => { const { message, signature } = req.body; const siweMessage = new SiweMessage(message); const result = await siweMessage.verify({ signature }); if (!result.success) { return reply.code(401).send({ error: 'Invalid signature' }); } const token = jwt.sign( { address: result.data.address, chainId: result.data.chainId }, process.env.JWT_SECRET!, { expiresIn: '7d' } ); return { token }; }); 

Nonce для защиты от replay атак: генерируем случайный nonce, сохраняем в Redis с TTL 5 минут, верифицируем что nonce в SIWE сообщении совпадает с выданным. После использования — удаляем.

Настройка RPC прокси: пошаговая инструкция

  1. Установите Fastify и ethers.js: npm install fastify ethers
  2. Создайте файл server.ts и настройте rate limiter (например, @fastify/rate-limit)
  3. Подключите Redis для кэширования: используйте библиотеку ioredis
  4. Реализуйте fallback provider: при ошибке переключайтесь на резервный RPC URL
  5. Добавьте эндпоинты для чтения данных (balance, symbol, decimals) с кэшированием
  6. Настройте health check и логирование (pino)

Как обрабатывать on-chain события без задержек?

On-chain события нужны для отображения истории операций, уведомлений, аналитики. Два подхода:

Подход Задержка Нагрузка на RPC Надёжность
Polling ~12-15 сек Высокая CUPS Ниже (пропуск блоков)
WebSocket subscription <1 сек Низкая Требует reconnect логику

WebSocket subscription (правильный) — используем на практике:

const wsProvider = new WebSocketProvider(process.env.WSS_RPC_URL); const contract = new Contract(CONTRACT_ADDRESS, ABI, wsProvider); contract.on('Transfer', async (from, to, value, event) => { await db.transfers.insert({ from, to, value: value.toString(), blockNumber: event.log.blockNumber, txHash: event.log.transactionHash, timestamp: new Date(), }); // Уведомить подписчиков через WebSocket/SSE eventBus.emit('transfer', { from, to, value: value.toString() }); }); // Обработка разрыва соединения wsProvider.on('error', async () => { console.error('WS disconnected, reconnecting...'); setTimeout(setupSubscriptions, 5000); }); 

WebSocket соединения нестабильны — reconnect логика обязательна. Альтернатива для production: Alchemy webhooks, Quicknode Streams — провайдер сам доставляет события на ваш HTTP endpoint.

Gasless транзакции (meta-transactions)

EIP-2771 + ERC-2612 позволяют пользователю подписывать транзакцию офф-чейн, а relayer оплачивает газ. Бэкенд работает как relayer, что позволяет снизить затраты на газ для пользователя на 30-50%:

app.post('/relay/transfer', authenticateJWT, async (req, reply) => { const { permit, signature } = req.body; // ERC-2612 permit // Верифицируем permit signature const tokenContract = new Contract(TOKEN_ADDRESS, ERC20_ABI, wallet); // Проверяем что permit валиден и не истёк const nonce = await tokenContract.nonces(permit.owner); if (BigInt(permit.nonce) !== nonce) { return reply.code(400).send({ error: 'Invalid nonce' }); } // Выполняем permit + transferFrom за пользователя const tx = await tokenContract.permit( permit.owner, permit.spender, permit.value, permit.deadline, permit.v, permit.r, permit.s ); await tx.wait(); return { txHash: tx.hash }; }); 

Для production gasless транзакций: OpenZeppelin Defender Relayer или Biconomy — они управляют nonce, retry logic и мониторингом застрявших транзакций.

Как обеспечить отказоустойчивость RPC прокси?

Используем резервные RPC-провайдеры с circuit breaker. Если основной провайдер возвращает ошибки (например, 429 Too Many Requests), автоматически переключаемся на резервный. Паттерн circuit breaker через библиотеку opossum: после 5 ошибок подряд — break на 30 секунд.

Мониторинг и надёжность

Типовые проблемы и их решения
  • Stuck transactions: транзакция с низким gasPrice зависает в mempool. Мониторим через polling getTransactionReceipt(). После N минут — bump gas (resend с тем же nonce, gasPrice * 1.1).
  • Nonce management: при параллельных транзакциях с одного кошелька нужен атомарный nonce counter. Используем Redis INCR + pending nonce tracking.
  • Circuit breaker для RPC: если провайдер возвращает ошибки — переключаемся на резервный.

Структура проекта

src/ api/ # HTTP routes (Fastify/Express) blockchain/ # Provider, contracts, event listeners services/ # Бизнес-логика workers/ # BullMQ workers для фоновых задач db/ # Prisma schema, migrations cache/ # Redis client middleware/ # Auth, rate limiting, validation 

Fastify быстрее Express на ~15-20% throughput и имеет встроенную JSON schema валидацию. Для dApp бэкенда разница редко критична, но fastify-plugin экосистема удобна.

Сравнение подходов к деплою

Стратегия Время развёртывания Отказоустойчивость Стоимость
Single server 1-2 часа Низкая Низкая
Docker + compose 3-4 часа Средняя Средняя
Kubernetes 1-2 дня Высокая Высокая

Что входит в работу

Мы передаём полный пакет документации: описание API (OpenAPI/Swagger), архитектурную схему, инструкцию по деплою. Исходный код размещаем в приватном репозитории с настроенным CI/CD (GitHub Actions). Доступы к RPC-провайдерам, Redis и базе данных передаются через менеджер паролей. Проводим обучение команды заказчика (1-2 часа). Поддержка в течение 1 месяца после сдачи — включена. Закажите разработку бэкенда dApp — получите готовое решение с мониторингом и поддержкой.

Ориентиры по срокам

Базовый бэкенд (RPC proxy + SIWE auth + кэширование) — 2-3 дня. Event indexer + WebSocket push + gasless relay — ещё 3-4 дня. Production-ready с мониторингом, retry logic и fallback RPC — 1.5-2 недели.

Свяжитесь с нами для оценки вашего проекта — рассчитаем сроки и состав работ. Получите консультацию инженера.