Перейти к содержанию
Learning Platform
Средний
40 минут
The Graph Deploy SubQuery Tool Comparison Decision Matrix Module Recap

Требуемые знания:

  • 07-the-graph-subgraphs

Deploy и сравнение инструментов

Финальный урок модуля

Пришло время задеплоить subgraph на локальный Graph Node и увидеть данные через GraphQL. Затем — сравним все три инструмента (Subsquid, The Graph, SubQuery) и определим, когда какой использовать.

Деплой subgraph на локальный Graph Node

Шаг 1: Запуск Graph Node стека

# Перейти в LAB-07
cd labs/LAB-07

# Запустить Graph Node профиль
docker compose --profile graph up -d

# Проверить: 4 сервиса (anvil, graph-db, ipfs, graph-node)
docker compose --profile graph ps

Шаг 2: Деплой SimpleToken контракта

# Если контракт ещё не задеплоен:
chmod +x contracts/deploy.sh
./contracts/deploy.sh

Скрипт создаёт 4 Transfer события (mint + 3 transfers), которые subgraph должен проиндексировать.

Шаг 3: Build и deploy subgraph

# Перейти в subgraph директорию
cd subgraph

# Установить зависимости
npm install

# Генерация AssemblyScript типов из ABI и schema
npx graph codegen

# Компиляция AssemblyScript в WebAssembly
npx graph build

# Создание subgraph в Graph Node (регистрация имени)
npx graph create --node http://localhost:8020 simple-token

# Деплой subgraph (загрузка WASM в IPFS + регистрация в Graph Node)
npx graph deploy --node http://localhost:8020 \
  --ipfs http://localhost:5001 \
  simple-token
# При запросе version label: ввести "v0.0.1"

Ожидаемый вывод:

  Build completed: ...
  Deployed to http://localhost:8000/subgraphs/name/simple-token

Subgraph endpoints:
  Queries (HTTP):     http://localhost:8000/subgraphs/name/simple-token
  Subscriptions (WS): ws://localhost:8001/subgraphs/name/simple-token

Шаг 4: Проверка статуса индексации

# Проверить логи Graph Node
docker logs graph-node --tail 30

# Искать строки:
# "Scanning blocks [0, ...]"
# "Applying ... entity operation(s)"
# Это значит -- subgraph индексирует блоки

Запрос данных через Graph Node GraphQL

Откройте в браузере: http://localhost:8000/subgraphs/name/simple-token

Все Transfer события

{
  transfers(first: 10, orderBy: blockNumber, orderDirection: desc) {
    from
    to
    value
    blockNumber
    transactionHash
  }
}

Фильтрация

{
  transfers(
    where: { from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" }
    orderBy: blockNumber
    orderDirection: asc
  ) {
    to
    value
    blockNumber
  }
}

Различия в синтаксисе запросов

Синтаксис The Graph ОТЛИЧАЕТСЯ от Subsquid:

АспектSubsquidThe Graph
Лимитlimit: 10first: 10
Пропускoffset: 20skip: 20
СортировкаorderBy: blockNumber_DESCorderBy: blockNumber, orderDirection: desc
Фильтр equalwhere: { from_eq: "0x..." }where: { from: "0x..." }
Фильтр greaterwhere: { value_gt: "1000" }where: { value_gt: "1000" }
ID по значениюtransferById(id: "...")transfer(id: "...")

Но суть одна: фильтрация, сортировка, пагинация через GraphQL. Данные те же — синтаксис разный.

SubQuery: третий инструмент

SubQuery — третий крупный инструмент индексации. Для курса — концептуальное сравнение с одним code snippet.

Ключевые характеристики SubQuery

  • TypeScript маппинги (как Subsquid, НЕ AssemblyScript)
  • project.ts manifest (TypeScript, не YAML)
  • @subql/node-ethereum для EVM chains
  • SubQuery Network (SQT token) для децентрализованного хостинга
  • Multi-chain поддержка из коробки (один manifest, несколько сетей)

Side-by-side: три инструмента, один Transfer event

// ═══════════════════════════════════════════════════
// SUBSQUID -- TypeScript, batch processing
// ═══════════════════════════════════════════════════

// processor.ts
processor.addLog({ topic0: [TRANSFER_TOPIC] })

// main.ts
processor.run(db, async (ctx) => {
  for (const block of ctx.blocks)
    for (const log of block.logs)
      transfers.push(new Transfer({ ...decode(log) }))
  await ctx.store.insert(transfers) // Batch INSERT!
})
// ═══════════════════════════════════════════════════
// THE GRAPH -- AssemblyScript, sequential processing
// ═══════════════════════════════════════════════════

// mapping.ts (AssemblyScript, НЕ TypeScript!)
export function handleTransfer(event: TransferEvent): void {
  let entity = new Transfer(
    event.transaction.hash.concatI32(event.logIndex.toI32())
  )
  entity.from = event.params.from
  entity.to = event.params.to
  entity.value = event.params.value
  entity.save() // Один за раз, синхронно
}
// ═══════════════════════════════════════════════════
// SUBQUERY -- TypeScript, sequential processing
// ═══════════════════════════════════════════════════

// mappingHandlers.ts (TypeScript!)
export async function handleTransfer(log: TransferLog): Promise<void> {
  const transfer = Transfer.create({
    id: log.transactionHash + '-' + log.logIndex.toString(),
    from: log.args.from,
    to: log.args.to,
    value: log.args.value.toBigInt(),
    blockNumber: BigInt(log.blockNumber),
  })
  await transfer.save() // async, но один за раз
}

Subsquid: batch processing + TypeScript. The Graph: sequential + AssemblyScript. SubQuery: sequential + TypeScript.

Все три начинаются с schema.graphql — единый source of truth для data model.

Полное сравнение инструментов

Subsquid vs The Graph vs SubQuery: полное сравнение
Аспект
Subsquid
The Graph
SubQuery
Язык маппинговTypeScriptAssemblyScriptTypeScript
Скорость1K-50K бл/сек100-150 бл/сек~300 бл/сек
GraphQL серверВстроенный + подпискиВстроенный в Graph NodeВстроенный
ХранениеPostgreSQLPostgreSQL (внутренний)PostgreSQL
Hot blocksДаНетДа
Multi-chainНесколько процессоровОтдельные subgraphsMulti-chain manifest
ТокенSQD (опционально)GRT (staking)SQT
Локальная разработкаRPC onlyGraph Node + IPFS + PGNode + PG
РезюмеSubsquid -- быстрый и удобный (TypeScript). The Graph -- децентрализованный и зрелый (крупнейшая экосистема). SubQuery -- мультисетевой и TypeScript. Выбор зависит от приоритетов: скорость разработки, децентрализация, или мультисетевая поддержка.

Ключевые различия

Язык маппингов:

  • Subsquid и SubQuery: TypeScript (полный язык, все фичи)
  • The Graph: AssemblyScript (подмножество, компилируется в WASM)

Скорость:

  • Subsquid: 50-300x быстрее The Graph (batch vs sequential processing)
  • SubQuery: примерно 2-3x быстрее The Graph

Децентрализация:

  • The Graph: зрелая сеть (GRT token, 500+ indexers, production dApps)
  • SubQuery: растущая сеть (SQT token, запуск 2024)
  • Subsquid: новая сеть (SQD token, 2024-2025)

Multi-chain:

  • SubQuery: нативная поддержка (один manifest, несколько сетей)
  • Subsquid: несколько processors + shared schema
  • The Graph: отдельные subgraphs per chain

Скорость индексации

Скорость индексации: количественное сравнение
Скорость индексации (блоков/сек, log шкала):
Subsquid1,000-50,000 бл/сек
Батч-обработка + SQD Network
SubQuery250-350 бл/сек
Последовательная обработка
The Graph100-150 бл/сек
WASM sandbox overhead
Latency до свежих данных:
Subsquid
~1-2 сек
SubQuery
~1-2 сек
The Graph
~10-30 сек
Почему такая разница?Subsquid до 50x быстрее The Graph благодаря батч-обработке и прямому доступу к данным через SQD Network. Для локальной разработки с Anvil разница менее заметна (десятки блоков), но на mainnet/testnet -- принципиальна.

Subsquid: 1,000-50,000 блоков/сек благодаря batch processing и SQD Network. The Graph: 100-150 блоков/сек из-за sequential WASM execution. SubQuery: ~300 блоков/сек (TypeScript, но sequential).

Для локальной разработки (десятки блоков) разница почти незаметна. Для mainnet с миллионами блоков — принципиальна.

Пример: Индексация 10 миллионов блоков Ethereum. Subsquid: ~3-170 минут. The Graph: ~18-28 часов. SubQuery: ~9 часов. Batch processing — не оптимизация, а фундаментальное архитектурное преимущество.

Когда какой инструмент?

Дерево решений: какой индексатор использовать?
Какой индексатор выбрать?
Какой индексатор выбрать?
Для этого курсаSubsquid как primary tool (TypeScript, быстрый, удобный). The Graph как secondary (зрелая экосистема, важен для индустрии). SubQuery -- концептуальное сравнение.

Матрица решений

КритерийРекомендация
Нужна максимальная скорость индексации?Subsquid
Нужна децентрализованная инфраструктура (GRT staking, 500+ indexers)?The Graph
Нужен TypeScript + мульти-сеть из коробки?SubQuery или Subsquid
Простой проект, быстрый старт?Subsquid (npx sqd init)
Зрелая экосистема, много примеров и документации?The Graph
Production dApp с GRT токен-экономикой?The Graph
Аналитика (большие объёмы данных, агрегации)?Subsquid
Off-chain данные (IPFS metadata, API calls)?Subsquid

Реальные сценарии

Startup, строящий DEX dashboard: Subsquid. Нужна скорость индексации для миллионов swap событий. TypeScript удобнее для команды. Можно захостить самостоятельно.

Крупный DeFi протокол: The Graph. Нужна децентрализованная инфраструктура, чтобы subgraph работал, даже если команда уходит. GRT стимулирует indexers.

Multi-chain мост: SubQuery или Subsquid. Нужна индексация с нескольких сетей одновременно. SubQuery имеет нативную multi-chain поддержку.

Переключение frontend между Subsquid и Graph Node

LAB-07 dashboard можно переключить с Subsquid на Graph Node, изменив endpoint:

// urql-client.ts -- переключение endpoint

// Subsquid (по умолчанию):
const GRAPHQL_HTTP = 'http://localhost:4350/graphql'
const GRAPHQL_WS   = 'ws://localhost:4350/graphql'

// The Graph (раскомментировать для Graph Node):
// const GRAPHQL_HTTP = 'http://localhost:8000/subgraphs/name/simple-token'
// const GRAPHQL_WS   = 'ws://localhost:8001/subgraphs/name/simple-token'

Внимание: Синтаксис запросов Subsquid и The Graph различается (limit vs first, orderBy_DESC vs orderDirection: desc). Готовый dashboard настроен для Subsquid. Для полного переключения на The Graph нужно адаптировать GraphQL queries.

Остановка всего

# Остановить Subsquid стек
docker compose --profile subsquid down

# Остановить Graph Node стек
docker compose --profile graph down

# Остановить ОБА стека
docker compose --profile subsquid --profile graph down

# Полная очистка (удалить volumes с данными):
docker compose --profile subsquid --profile graph down -v

Итоги модуля

Таблица уроков

УрокТемаКлючевые концепции
INDEX-01Зачем индексироватьRPC limitations, indexing pipeline, EVM events, hardware requirements
INDEX-02GraphQLSchema design, queries, filtering, subscriptions, urql vs Apollo
INDEX-03Subsquid архитектураEvmBatchProcessor, TypeORM, codegen pipeline, batch processing
INDEX-04ERC-20 индексаторПервый hands-on: Transfer events, Docker, GraphQL queries, frontend
INDEX-05Мульти-событияUniswap V2 Swap + Sync, multiple entities, aggregations, topic0 routing
INDEX-06Продвинутые паттерныGovernance indexing, stateful entities, multi-chain, WebSocket subscriptions
INDEX-07The GraphSubgraph manifest, AssemblyScript vs TypeScript, Graph Node, IPFS
INDEX-08Deploy и сравнениеSubgraph deploy, SubQuery code snippet, 3-way comparison, decision matrix

Что мы освоили

  1. Зачем нужна индексация — RPC ограничения, event-driven data pipeline
  2. GraphQL — единый query language для всех трёх инструментов
  3. Subsquid — batch processing, TypeScript, production-паттерны, governance и multi-event
  4. The Graph — subgraphs, AssemblyScript, Graph Node, deployment
  5. SubQuery — концептуальное понимание третьего инструмента
  6. Выбор инструмента — decision matrix для реальных проектов

Что дальше

Мы освоили индексацию блокчейн-данных — от теории до production-паттернов. С Subsquid и The Graph вы можете построить GraphQL API для ЛЮБОГО EVM-контракта: DEX, lending, NFT, governance. Данные — это фундамент любого dApp.

В LAB-07 у вас есть полная инфраструктура для экспериментов:

  • Subsquid processor с ERC-20 индексатором
  • Graph Node с SimpleToken subgraph
  • React + urql dashboard с live-данными

Попробуйте добавить индексацию новых событий, создать кастомные агрегации, или подключить subgraph к контрактам из предыдущих модулей (DeFi, Governance, NFT).

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс