Перейти к основному содержанию

Avalanche быстрый старт

SubQuery TeamОколо 5 мин

Avalanche быстрый старт

В этом кратком руководстве мы начнем с простого начального проекта Avalanche, а затем закончим индексированием актуальных реальных данных. Это отличная основа для начала разработки собственного проекта SubQuery.

Если вам нужны руководства для Substrate/Polkadot, вы можете прочитать краткое руководство по использованию Substrate/Polkadot.

В конце этого руководства у вас будет рабочий проект SubQuery, запущенный на узле SubQuery с конечной точкой GraphQL, из которой вы можете запрашивать данные.

Если вы еще этого не сделали, мы предлагаем вам ознакомиться с терминологией , используемой в SubQuery.

Цель этого краткого руководства - проиндексировать все журналы токена Pangolin Approve, это займет всего 10-15 минут.

Подготовка

Локальная среда разработки

Установите SubQuery CLI

Установите SubQuery CLI глобально на свой терминал с помощью NPM:

# NPM
npm install -g @subql/cli

Обратите внимание, что мы НЕ рекомендуем использовать yarn global для установки @subql/cli из-за плохого управления зависимостями, что может привести к ошибке в дальнейшем.

Затем вы можете запустить справку, чтобы увидеть доступные команды и варианты применения, предоставляемые CLI

помощь subql

Инициализируем Начальный Проект SubQuery

Внутри каталога, в котором вы хотите создать проект SubQuery, для начала просто выполните следующую команду:

subql init

По мере инициализации проекта SubQuery вам будут заданы определенные вопросы:

  • Project Name: A name for your SubQuery project
  • Семейство сетей: Семейство блокчейн-сетей первого уровня, для индексации которого будет разработан этот проект SubQuery. Используйте клавиши со стрелками на клавиатуре, чтобы выбрать один из вариантов, в данном руководстве мы будем использовать _ "Avalanche"_.
  • Сеть: Конкретная сеть, для индексации которой будет разработан этот проект SubQuery, используйте клавиши со стрелками на клавиатуре, чтобы выбрать один из вариантов, для данного руководства мы будем использовать _ "Avalanche"_.
  • Шаблон: Выберите шаблон проекта SubQuery, который станет отправной точкой для начала разработки, мы предлагаем выбрать _ "Starter project"_.
  • Git repository (Опционально): Укажите URL-адрес Git для репозитория, в котором будет размещен этот проект SubQuery (при размещении в SubQuery Explorer)
  • RPC endpoint (Обязательно): Укажите URL-адрес HTTPS для работающей конечной точки RPC, которая будет использоваться по умолчанию для этого проекта. Этот узел RPC должен быть архивным узлом (иметь состояние полной цепочки). В данном руководстве мы будем использовать значение по умолчанию _ "avalanche.api.onfinality.io"_.
  • Authors (Обязательно): Введите здесь владельца этого проекта SubQuery (например, ваше имя!)
  • Description (Опционально): Вы можете предоставить короткий абзац о своем проекте, описывающий, какие данные он содержит и что пользователи могут с ним делать
  • Version (Обязательно): Введите собственный номер версии или используйте версию по умолчанию (1.0.0)
  • License (Обязательно): Предоставьте лицензию на программное обеспечение для этого проекта или примите лицензию по умолчанию (Apache-2.0)

После завершения процесса инициализации вы должны увидеть, что внутри каталога создана папка с названием вашего проекта. Содержимое этого каталога должно совпадать с тем, что указано в Структуре каталогов.

Наконец, в каталоге проекта выполните следующую команду, чтобы установить зависимости нового проекта.

::: code-tabs @tab:active yarn shell cd PROJECT_NAME yarn install ``` @tab npm shell cd PROJECT_NAME npm install ``` :::

Внесение изменений в ваш проект

В стартовом пакете, который вы только что инициализировали, мы предоставили стандартную конфигурацию для вашего нового проекта. В основном вы будете работать со следующими файлами:

  1. Схема GraphQL в schema.graphql
  2. Манифест проекта в project.yaml
  3. Функции сопоставления в каталоге src / mappings /

Цель этого краткого руководства - адаптировать стандартный стартовый проект для индексирования всех журналов транзакций Pangolin Approve.

Обновление файла схемы GraphQL

Файл schema.graphql определяет различные схемы GraphQL. Из-за того, как работает язык запросов GraphQL, файл схемы по существу диктует форму ваших данных из SubQuery. Это отличное место для начала, потому что оно позволяет заранее определить конечную цель.

Мы собираемся обновить файл schema.graphql, чтобы удалить все существующие объекты и увидеть следующее

type PangolinApproval @entity {
  id: ID!
  transactionHash: String!
  blockNumber: String!
  blockHash: String!
  addressFrom: String
  addressTo: String
  amount: String
}

Важно: когда вы вносите какие-либо изменения в файл schema, убедитесь, что вы заново создали каталог типов. Сделайте это сейчас.

::: code-tabs @tab:active yarn shell yarn codegen ``` @tab npm shell npm run-script codegen ``` :::

Вы найдете сгенерированные модели в каталоге /src/types/models. Для получения дополнительной информации о файле schema.graphql ознакомьтесь с нашей документацией в разделе Build/GraphQL Schema

Обновление файла Манифеста Проекта

Файл манифеста проекта (project.yaml) можно рассматривать как точку входа в ваш проект, и он определяет большинство деталей того, как SubQuery будет индексировать и преобразовывать данные цепочки.

Мы не будем вносить много изменений в файл манифеста, поскольку он уже настроен правильно, но нам нужно изменить наши обработчики. Помните, что мы планируем индексировать все журналы утверждения Pangolin, поэтому нам нужно обновить раздел datasources следующим образом.

dataSources:
  - kind: avalanche/Runtime
    startBlock: 57360 # Блок, когда был создан контракт Pangolin
    options:
      # Должен быть ключ активов
      abi: erc20
      ## токен Pangolin https://snowtrace.io/token/0x60781c2586d68229fde47564546784ab3faca982
      address: "0x60781C2586D68229fde47564546784ab3fACA982"
    assets:
      erc20:
        file: "./node_modules/@pangolindex/exchange-contracts/artifacts/contracts/pangolin-core/interfaces/IPangolinERC20.sol/IPangolinERC20.json"
    mapping:
      file: "./dist/index.js"
      handlers:
        - handler: handleLog
          kind: avalanche/LogHandler
          filter:
            ## Следуют стандартным фильтрам журнала https://docs.ethers.io/v5/concepts/events/
            function: Approve(address spender, uint256 rawAmount)
            # address: "0x60781C2586D68229fde47564546784ab3fACA982"

Это означает, что мы будем запускать функцию отображения handleLog каждый раз, когда будет approve log для любой транзакции из Pangolin contractopen in new window.

Дополнительные сведения о файле манифеста проекта (project.yaml) см. в нашей документации в разделе Build/Manifest File

Добавление функции сопоставления

Функции сопоставления определяют, как данные цепочки преобразуются в оптимизированные сущности GraphQL, которые мы ранее определили в файле schema.graphql.

Перейдите к функции сопоставления по умолчанию в каталоге src/mappings. Вы увидите три экспортируемые функции, handleBlock, handleLog и handleTransaction. Вы можете удалить обе функции handleBlock и handleTransaction, мы имеем дело только с функцией handleLog.

Функция handleLog получала данные о событии всякий раз, когда событие соответствовало фильтрам, которые мы указали ранее в нашем project.yaml. Мы собираемся обновить его, чтобы обработать все журналы транзакций одобрения и сохранить их в сущностях GraphQL, которые мы создали ранее.

Вы можете обновить функцию handleLog до следующей (обратите внимание на дополнительные импорты):

import { PangolinApproval } from "../types";
import { AvalancheLog } from "@subql/types-avalanche";

export async function handleLog(event: AvalancheLog): Promise<void> {
  const pangolinApprovalRecord = new PangolinApproval(
    `${event.blockHash}-${event.logIndex}`
  );

  pangolinApprovalRecord.transactionHash = event.transactionHash;
  pangolinApprovalRecord.blockHash = event.blockHash;
  pangolinApprovalRecord.blockNumber = event.blockNumber;
  # topics store data as an array
  pangolinApprovalRecord.addressFrom = event.topics[0];
  pangolinApprovalRecord.addressTo = event.topics[1];
  pangolinApprovalRecord.amount = event.topics[2];

  await pangolinApprovalRecord.save();
}

Это позволяет получить журнал Avalanche, который включает данные журнала транса на полезной нагрузке. Мы извлекаем эти данные, а затем создаем экземпляр нового объекта PangolinApproval, который мы определили ранее в файле schema.graphql. Мы добавляем дополнительную информацию, а затем используем функцию .save() для сохранения нового объекта (SubQuery автоматически сохранит его в базе данных).

Для получения дополнительной информации о функциях сопоставления ознакомьтесь с нашей документацией в разделе Build/Mappings

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

Чтобы запустить ваш новый проект SubQuery, нам сначала нужно собрать нашу работу. Запустите команду сборки из корневого каталога проекта.

::: code-tabs @tab:active yarn shell yarn build ``` @tab npm shell npm run-script build ``` :::

Важно: Каждый раз, когда вы вносите изменения в функции отображения, вам нужно будет пересобрать проект.

Запуск проекта и составление запросов

Запуск проекта с помощью Docker

Когда вы создаете новый проект SubQuery, вы всегда должны запускать его локально на своем компьютере, чтобы сначала протестировать его. Самый простой способ сделать это - использовать Docker.

Вся конфигурация, управляющая запуском узла SubQuery, определяется в этом файле docker-compose.yml. Для нового проекта, который был только что инициализирован, вам не нужно ничего здесь менять, но вы можете прочитать больше о файле и настройках в нашем разделе Запуск проекта

В каталоге проекта выполните следующую команду:

::: code-tabs @tab:active yarn shell yarn start:docker ``` @tab npm shell npm run-script start:docker ``` :::

Для первой загрузки необходимых пакетов (@subql/nodeopen in new window, @subql/queryopen in new window и Postgres) может потребоваться некоторое время, но вскоре вы увидите работающий узел SubQuery. Проявите терпение.

Отправьте запрос своему проекту

Откройте браузер и перейдите по адресу http://localhost:3000open in new window.

Вы должны увидеть, что в проводнике отображается игровая площадка GraphQL и схемы, которые готовы к запросу. В правом верхнем углу игровой площадки вы найдете кнопку _ Документы _, которая откроет розыгрыш документации. Эта документация создается автоматически и помогает вам найти, какие сущности и методы вы можете запрашивать.

Для нового начального проекта SubQuery вы можете попробовать следующий запрос, чтобы понять, как он работает, или узнать больше о языке запросов GraphQL.

query {
  pangolinApprovals(first: 5) {
    nodes {
      id
      blockNumber
      blockHash
      transactionHash
      addressFrom
      addressTo
      amount
    }
  }
}

Опубликуйте свой проект SubQuery

SubQuery предоставляет бесплатный управляемый сервис, на котором вы можете развернуть свой новый проект. Вы можете развернуть его в SubQuery Managed Serviceopen in new window и запросить его с помощью нашего Проводникаopen in new window.

Прочитайте руководство по публикации вашего нового проекта в SubQuery Projects. Обратите внимание, что развертывание необходимо выполнять через IPFS.

Следующие шаги

Поздравляем, теперь у вас есть локально работающий проект SubQuery, который принимает запросы API GraphQL для передачи данных от bLuna.

Теперь, когда вы поняли, как создать базовый проект SubQuery, возникает вопрос: что дальше? Если вы чувствуете себя уверенно, вы можете перейти к более подробному изучению трех ключевых файлов. Файл манифеста, схема GraphQL и файл сопоставлений в разделе "Сборка" этой документации.

В противном случае перейдите в раздел Академия, где вы найдете более подробные семинары, учебные пособия и примеры проектов. Там мы рассмотрим более продвинутые модификации и более глубоко погрузимся в выполнение проектов SubQuery, запуская легкодоступные проекты и проекты с открытым исходным кодом.

Наконец, если вы ищете другие способы запуска и публикации своего проекта, наш Run & Publish Раздел содержит подробную информацию обо всех способах запуска вашего проекта SubQuery и других расширенных функциях агрегации и подписки GraphQL.