Разработка системы биллинга Node-as-a-Service

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1305 услуг
Разработка системы биллинга Node-as-a-Service
Средний
~1-2 недели
Часто задаваемые вопросы

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

Этапы блокчейн-разработки

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

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

Запустить ноду несложно. Сложно правильно считать деньги — особенно когда unit of consumption это не запрос, а время работы ноды, тип сети, версия клиента и тариф, который выбрал пользователь три недели назад. NaaS биллинг провален в большинстве молодых провайдеров не потому что задача технически трудная, а потому что между "считать деньги примерно верно" и "считать деньги точно и прозрачно" — пропасть в несколько месяцев инженерной работы. Мы разрабатываем системы биллинга для NaaS уже много лет и знаем, как избежать типовых ошибок. За это время реализовали более 20 проектов, от простых MVP до полноценных crypto-native платформ. В этой статье разберем архитектуру, с которой не стыдно выходить в production, модели тарификации, которые выбирают зрелые провайдеры, и подводные камни, которые ломают биллинг в продакшене. Вы узнаете, как построить слой сбора метрик без потери данных, настроить rating engine на PostgreSQL и интегрировать crypto-платежи в USDC. Также расскажем, какие проблемы возникают с clock skew и duplicate events, и как их решить.

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

Pay-per-request — классика для RPC провайдеров (Alchemy, Infura, QuickNode). Считаем количество JSON-RPC вызовов, с весовыми коэффициентами по методам:

Метод Compute Units
eth_blockNumber 10
eth_getBalance 19
eth_call 26
eth_getLogs 75
trace_transaction 150
debug_traceTransaction 500

eth_getLogs с широким диапазоном блоков — это атака на ноду. Без весовых коэффициентов пользователь может сделать один запрос стоимостью тысячи "обычных". Alchemy называет это Compute Units, QuickNode — Credits. Названия разные, смысл один.

Time-based (subscription) — выделенная нода фиксированной мощности оплачивается помесячно. Понятнее для пользователя, предсказуемый revenue для провайдера. Минус: пользователь переплачивает при низкой нагрузке.

Hybrid — базовый план с месячным включённым объёмом, overage billing сверху. Используют большинство зрелых провайдеров.

Модель Преимущества Недостатки
Pay-per-request Точно платишь за использование, легко масштабируется Непредсказуемый счёт, сложность rate limiting
Time-based (subscription) Предсказуемый доход, простота для пользователя Переплата при низкой нагрузке
Hybrid Баланс гибкости и предсказуемости Сложность реализации overage billing

Как устроена архитектура биллинговой системы?

Как организовать слой сбора метрик? — разработка системы биллинга

Критический путь: каждый RPC запрос должен быть залогирован до ответа пользователю — иначе при краше теряем данные об использовании. Допустимый процент потерь (sampling loss) — менее 0.01%. Если теряем больше — backpressure или нода умирает под нагрузкой.

Архитектура:

Client Request
     ↓
API Gateway (Nginx / Envoy / Kong)
     ↓ [access log + request metadata]
Billing Proxy (sidecar) — async write to queue
     ↓
RPC Node Cluster
     ↓
Response → Client

Billing proxy пишет в Apache Kafka или NATS JetStream — оба дают at-least-once delivery. Синхронная запись в базу на каждый запрос убивает latency (мы добавляем 100–500мс к каждому RPC вызову, что недопустимо). Использование очереди позволяет обрабатывать события в 10 раз быстрее по сравнению с прямой записью в БД.

// Async metric emission — не блокирует запрос
func (b *BillingMiddleware) RecordUsage(ctx context.Context, event UsageEvent) {
    select {
    case b.eventChan <- event:
        // успешно поставлено в буфер
    default:
        // буфер полон — метрика потеряна, логируем как sampling loss
        b.metrics.IncSamplingLoss()
    }
}

Агрегация и rating engine

Raw события из Kafka → rating pipeline → billable records в PostgreSQL.

Rating — это применение тарифных правил к raw usage. Для NaaS:

class RatingEngine:
    def rate_event(self, event: UsageEvent, plan: Plan) -> Decimal:
        method_weight = self.compute_unit_table.get(
            event.method, DEFAULT_WEIGHT
        )
        
        # Применяем тарифный план
        if plan.type == "included_pool":
            remaining = plan.included_units - plan.used_units
            if remaining > 0:
                billable = max(0, method_weight - remaining)
                plan.used_units += method_weight
            else:
                billable = method_weight
        elif plan.type == "pay_per_use":
            billable = method_weight
            
        return Decimal(billable) * plan.unit_price

Агрегация происходит по временным окнам (5-минутные buckets), финальная запись — в конце расчётного периода. Это создаёт billing lag — пользователь потратил деньги, но видит обновление баланса через 5 минут. Это норма для NaaS.

Хранение данных

Для биллинга PostgreSQL — правильный выбор. Не ClickHouse, не MongoDB. Биллинг требует ACID при списании средств. Схема:

-- Immutable usage log
CREATE TABLE usage_events (
    id          BIGSERIAL PRIMARY KEY,
    account_id  UUID NOT NULL,
    node_id     UUID NOT NULL,
    method      VARCHAR(64),
    chain_id    INTEGER,
    weight      INTEGER,
    occurred_at TIMESTAMPTZ NOT NULL,
    billed_at   TIMESTAMPTZ
) PARTITION BY RANGE (occurred_at);

-- Billing periods
CREATE TABLE billing_records (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    account_id      UUID NOT NULL,
    period_start    TIMESTAMPTZ NOT NULL,
    period_end      TIMESTAMPTZ NOT NULL,
    total_units     BIGINT,
    total_amount    NUMERIC(20, 8),
    currency        VARCHAR(10),  -- 'USD', 'USDC', 'ETH'
    status          VARCHAR(20),  -- 'pending', 'invoiced', 'paid', 'overdue'
    created_at      TIMESTAMPTZ DEFAULT NOW()
);

usage_events партиционируется по дате — иначе через год таблица перестанет вмещаться в индексы оперативной памяти. Retention policy: raw events хранятся 90 дней, агрегаты — бессрочно.

Как реализовать crypto-native биллинг?

Prepaid баланс в стейблкоинах

Большинство NaaS для Web3 работают в prepaid модели: пользователь пополняет баланс в USDC/USDT, списание происходит с него. Это проще чем подписка через кредитную карту и нет chargeback рисков.

contract NaaSBilling {
    IERC20 public immutable usdc;
    mapping(address => uint256) public balances;
    address public billingOracle; // multisig or oracle service
    
    event Deposit(address indexed account, uint256 amount);
    event Deduction(address indexed account, uint256 amount, string invoiceId);
    
    function deposit(uint256 amount) external {
        usdc.transferFrom(msg.sender, address(this), amount);
        balances[msg.sender] += amount;
        emit Deposit(msg.sender, amount);
    }
    
    // Только billingOracle может списывать
    function deductBalance(
        address account,
        uint256 amount,
        string calldata invoiceId
    ) external onlyBillingOracle {
        require(balances[account] >= amount, "Insufficient balance");
        balances[account] -= amount;
        emit Deduction(account, amount, invoiceId);
    }
}

Важный паттерн: billingOracle — не EOA, а multisig или сервис с HSM. Ключ от оракула компрометируется → все балансы под угрозой.

Автоматическое пополнение

Low balance triggers — пользователь настраивает автопополнение при достижении порога: threshold, refillAmount, sourceWallet, maxMonthlySpend. maxMonthlySpend — обязательная защита от billing runaway. Без неё баглый клиент делает миллион запросов и съедает весь баланс пользователя за час.

Какие алерты и rate limiting нужны?

Rate limiting на уровне API Gateway (не биллинга): 1000 req/sec per API key — стандартный дефолт. Без rate limiting один пользователь с багом может положить ноду для всех.

Billing alerts — нотификации при:

  • Баланс упал ниже X% от обычного месячного расхода (например, 80%)
  • Резкий spike usage (>3x среднего за последний час)
  • Нода недоступна (клиент платит за downtime — это должно компенсироваться SLA кредитами)

SLA credits — автоматическое начисление кредитов при downtime. Считается через uptime probe (внешний сервис мониторинга, не ваш собственный). Self-reported uptime 99.99% не вызывает доверия у корпоративных клиентов.

Какие проблемы биллинга встречаются в production?

За время работы с NaaS биллингом встречали несколько нетривиальных проблем. Рассмотрим три наиболее критичных.

Clock skew между нодами — если billing proxy и нода имеют расхождение часов >1 сек, timestamps в usage events некорректны. NTP обязателен, предпочтительно chrony с Google NTP серверами.

Duplicate events при retry — Kafka at-least-once delivery означает дубликаты при retry. Каждое событие должно иметь idempotency key (request_id + node_id), rating engine де-дуплицирует перед записью.

Timezone bugs в billing cycles — расчётный период "1-е число месяца" в UTC. Пользователь из UTC-8 видит что цикл закрывается в 16:00 его времени. Нужна явная документация и по желанию — кастомные billing cycles.

Сроки разработки полноценной NaaS billing системы: 3–5 месяцев для команды из 2–3 backend инженеров. MVP с prepaid балансом и базовым rate limiting — 6–8 недель.

Что входит в разработку системы биллинга?

  • Документация архитектуры и API
  • Исходный код с комментариями
  • Инструкция по развертыванию (Docker, Kubernetes)
  • Обучение команды заказчика
  • Техническая поддержка 3 месяца
  • Гарантия устранения ошибок

Гарантия точности биллинга: мы гарантируем, что система проходит аудит на предмет утечки средств и корректности расчетов. В течение 3 месяцев после сдачи исправляем любые ошибки бесплатно. Ошибки биллинга могут стоить до 10% выручки провайдера — наша задача свести этот риск к нулю.

Свяжитесь с нами для консультации по архитектуре вашего NaaS биллинга. Закажите разработку системы под ключ и получите оценку проекта.

Развертывание блокчейн-инфраструктуры: ноды, RPC, индексация

Subgraph упал в 3:47 ночи. К утру пользователи видели устаревшие балансы, транзакции «висели» в UI, поддержка получила 47 тикетов за час. Причина: handler в subgraph упал на транзакции с нестандартным event log — и весь индекс встал. Мы сталкивались с такими ситуациями десятки раз. Наш опыт показывает: блокчейн-инфраструктура не прощает gaps в observability. Гарантировать uptime без многослойного мониторинга и fault‑tolerant архитектуры невозможно. За 8 лет работы с Ethereum, Polygon и Solana мы выработали подход, который позволяет предсказуемо развёртывать инфраструктуру любого масштаба — от одиночной ноды до мультичейн‑сетки с десятками субграфов.

Архитектура RPC-слоя

Каждое взаимодействие dApp с блокчейном идёт через RPC — JSON‑RPC API, которую предоставляет нода. Три варианта:

Managed providers — Alchemy, QuickNode, Infura, Ankr. Минимальные операционные расходы, SLA, встроенный мониторинг. Ограничения: rate limits (Alchemy Free: 300 RU/sec), vendor lock, потенциальные downtime при инцидентах провайдера. Для большинства проектов — правильный выбор на старте.

Собственные ноды — полный контроль, нет rate limits, нет зависимости от третьих сторон. Стоимость: архивная нода Ethereum занимает 2.5–3TB SSD, требует мощный сервер и DevOps‑поддержку. Sync с нуля на Ethereum через Geth/Nethermind — 3–7 дней. Оправдано при высокой нагрузке или требованиях к latency.

Гибрид — собственная нода как primary, managed provider как fallback. Стандарт для протоколов с TVL от $10M. Правильная балансировка может сократить расходы на 20–30% по сравнению с чисто managed‑схемой. При нагрузке 10 млн запросов в месяц гибрид экономит от $1500 до $3000.

Провайдер Сильная сторона Ограничение
Alchemy Supernode, Enhanced APIs, webhooks Дорогой на high-volume
QuickNode Низкая latency, multi-chain Дороже Alchemy на базовом плане
Infura Историческая надёжность Rate limits на бесплатном, один крупный инцидент остановил пол‑DeFi
Ankr Дешёвый, 40+ чейнов Менее стабильный

Как настроить RPC-слой без единой точки отказа?

Минимум два провайдера, DNS round‑robin с health check каждые 5 секунд, автоматическое переключение на fallback при latency >500 мс. На практике это даёт 99.99% доступности при любом сбое провайдера. Для протоколов с TVL от $10M мы рекомендуем собственный HA‑прокси (nginx или Envoy) перед двумя managed‑провайдерами.

Почему гибридная RPC-схема выгоднее чисто managed?

При 50 млн запросов в месяц Alchemy стоит $2000+, QuickNode — $2500+, собственная нода — $400–600 за хостинг + DevOps. Гибрид: primary — своя нода ($500), fallback — QuickNode ($500), итого ~$1000. Экономия 50–60% без потери SLA.

Клиенты нод Ethereum

Execution clients: Geth (наиболее используемый), Nethermind (C#, быстрая sync), Besu (Java, enterprise), Erigon (самый быстрый sync, архивный режим эффективен по диску — ~2TB вместо 3TB).

Consensus clients (post‑Merge): Lighthouse (Rust), Prysm (Go), Teku (Java), Nimbus (Nim). Каждая нода после The Merge требует пары execution + consensus client.

Для DevOps: eth‑docker — Docker Compose конфигурации для всех комбинаций клиентов. Настройка мониторинга через Grafana + Prometheus — обязательна, стандартный дашборд есть в репозитории каждого клиента.

The Graph: индексация событий

The Graph Protocol — decentralized indexing. Subgraph описывает какие события с каких контрактов индексировать и как трансформировать их в GraphQL схему.

Структура subgraph:

  • subgraph.yaml — манифест: адреса контрактов, startBlock, события которые обрабатываются
  • schema.graphql — GraphQL схема entities
  • src/mapping.ts — AssemblyScript обработчики событий
dataSources:
  - kind: ethereum
    name: UniswapV3Pool
    network: mainnet
    source:
      address: "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640"
      abi: UniswapV3Pool
      startBlock: 12370624
    mapping:
      eventHandlers:
        - event: Swap(indexed address,indexed address,int256,int256,uint160,uint128,int24)
          handler: handleSwap

AssemblyScript handlers — не TypeScript. Нет nullable types, нет closures, нет многих стандартных API. Ошибка в handler останавливает индексацию subgraph-а на той транзакции. Важно: добавлять try‑catch на операции которые могут падать (например store.get() для entity которая может не существовать).

Как избежать остановки индексации субграфа?

Лог файлы Graph Node мониторятся в реальном времени, при hasIndexingErrors = true срабатывает алерт и автоматический рестарт ноды (через systemd или Kubernetes). Типичный downtime при ошибке — 150–300 секунд до восстановления. Дополнительно: для production ставим watchdog, который перезапускает Graph Node если subgraph lag превышает 50 блоков.

Выбор между Hosted Service и Decentralized Network

Graph Hosted Service (бесплатный, централизованный) deprecated в пользу Subgraph Studio + Graph Network. Для продакшн: деплой на Graph Network с GRT curation signal — субграф получает indexers пропорционально curation.

Альтернативы The Graph: Ponder (TypeScript, self-hosted, проще дебагать), Envio (ultra‑fast indexer, поддерживает EVM + non‑EVM), Subsquid (TypeScript, своя сеть), Moralis Streams (managed, webhook‑based). Наш опыт показывает: для высоконагруженных проектов с уникальной логикой эффективнее Ponder или Envio — они дают полный контроль над процессом и не требуют токеномики GRT.

Webhooks и real-time нотификации

Alchemy Webhooks и QuickNode Streams позволяют получать события в реальном времени через HTTP webhook или WebSocket. Для мониторинга адресов, новых транзакций, минтов — это быстрее чем polling RPC.

Tenderly — платформа для мониторинга и алертов. Можно настроить alert на конкретный event из контракта, на изменение баланса, на вызов функции с определёнными параметрами. Симуляция транзакций через Tenderly API — бесценно для debugging.

Мониторинг и observability

Минимальный стек мониторинга для протокола:

On‑chain: OpenZeppelin Defender Sentinel — watches contract events, вызывает webhook или Autotask при срабатывании условий. Forta Network — community‑maintained боты детектируют аномалии (большие withdrawals, flash loans, governance attacks).

Infrastructure: Grafana + Prometheus для нод, Datadog или Grafana Cloud для managed метрик. Alert на: нода отстала на 10+ блоков, RPC latency > 500ms, subgraph lag > 100 блоков.

Uptime: Better Uptime или PagerDuty на RPC endpoint и subgraph health endpoint (The Graph предоставляет _meta { hasIndexingErrors, block { number } }).

Почему мониторинг без Tenderly недостаточен?

Tenderly даёт симуляцию транзакций и детальные трейсы — это критично для отладки ошибок в субграфах и смарт‑контрактах. Forta же фокусируется на аномалиях в сети, а не на вашей инфраструктуре. Комбинация Tenderly + собственный дашборд Grafana покрывает 90% сценариев инцидентов.

Мультичейн инфраструктура

Протокол на 5 чейнах = 5 отдельных RPC endpoints, 5 subgraphs, 5 мониторинг‑конфигов. Это управляемо, но нужна автоматизация деплоя.

Для subgraph multi‑network деплой: graph deploy --network mainnet, graph deploy --network arbitrum-one и т.д. с единой кодовой базой и network‑specific адресами в отдельных файлах конфигурации.

Chainlink CCIP и LayerZero для cross‑chain messaging требуют мониторинга состояния обоих чейнов и транзакций на intermediate relayers. Реорг на source chain при уже подтверждённом минте на target chain — классическая проблема мостов. Решение: ждать finality (на Ethereum ~15 минут после Merge для экономической finality) перед подтверждением на target chain.

Процесс настройки инфраструктуры

  1. Аудит текущего стека — определяем чейны, объём запросов, требования к latency и доступности.
  2. Проектирование архитектуры — выбор провайдеров, балансировка, redundancy.
  3. Разработка subgraph — манифест → схема → handlers → тестирование на локальной Graph Node → деплой на testnet → mainnet.
  4. Конфигурация мониторинга — Tenderly alerts, Grafana дашборд, PagerDuty интеграция.
  5. Документация и runbook — что делать при: subgraph fell behind, RPC downtime, нода desync.
  6. Передача в эксплуатацию — обучение команды, передача доступов, поддержка первый месяц.

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

  • Развёртывание managed или self‑hosted нод Ethereum, Polygon, BNB Chain
  • Настройка RPC‑слоя с primary/fallback и load balancing
  • Разработка и деплой subgraph под ваш протокол
  • Подключение мониторинга (Tenderly, Grafana, алерты)
  • Создание runbook и документации по эксплуатации
  • Обучение команды (до 4 часов онлайн)
  • Поддержка в течение 30 дней после сдачи

Сроки

Работа Срок
Настройка RPC и базового мониторинга 1–2 недели
Subgraph для одного протокола 2–4 недели
Self-hosted нода с мониторингом 2–3 недели
Полная инфраструктура (multi-chain, мониторинг, runbooks) 6–10 недель

Все проекты ведутся в репозитории на GitHub/GitLab с CI/CD, код конфигураций остаётся у вас. Закажите развертывание инфраструктуры — расскажем, как сократить расходы на 20–30% без потери надёжности. JSON‑RPC спецификация, документация The Graph. Получите консультацию — покажем, как мы развёртывали инфраструктуру для протокола с TVL $50M+ на Ethereum и Arbitrum.

Свяжитесь с нами.