Часто задаваемы вопросы для разработчиков
Reading time: 7 min
Субграф - это пользовательский API, построенный на данных блокчейна. Субграфы запрашиваются с помощью языка запросов GraphQL и развертываются на ноде Graph с помощью Graph CLI. После развертывания и публикации в децентрализованной сети The Graph индексаторы обрабатывают субграфы и делают их доступными для запросов со стороны потребителей субграфов.
После создания субграфов их удаление невозможно.
Нет. После создания субграфа изменить его имя нельзя. Обязательно хорошо подумайте, прежде чем создавать свой субграф, чтобы его можно было легко найти и идентифицировать другими децентрализованными приложениями.
Нет. После создания субграфа связанная с ним учетная запись GitHub не может быть изменена. Обязательно как следует обдумайте этот вопрос перед созданием субграфа.
Настоятельно рекомендуется структурировать свои смарт-контракты так, чтобы события были связаны с данными, которые Вы хотите запросить. Обработчики событий в субрафе запускаются событиями контракта и являются самым быстрым способом получения полезных данных.
Если контракты, с которыми Вы работаете, не содержат событий, Ваш субграф может использовать обработчики вызовов и блоков для запуска индексации. Хотя это не рекомендуется, так как производительность будет значительно ниже.
Вам понадобятся отдельные имена для нескольких сетей. Хотя у Вас не может быть разных субграфов под одним и тем же именем, есть удобные способы иметь единую кодовую базу для нескольких сетей. Подробнее об этом читайте в нашей документации:
Шаблоны позволяют создавать источники данных на лету, пока Ваш субграф индексируется. Может случиться так, что Ваш контракт будет создавать новые контракты по мере того, как люди будут с ним взаимодействовать, и, поскольку Вы заранее знаете стуктуру этих контрактов (ABI, события и т. д.), Вы сможете определить, как Вы хотите индексировать их в шаблоне и, когда они сгенерируются, Ваш субграф создаст динамический источник данных, предоставив адрес контракта.
Ознакомьтесь с параграфом "Создание экземпляра шаблона источника данных" в разделе: .
Вы можете запустить следующую команду:
docker pull graphprotocol/graph-node:latest
ПРИМЕЧАНИЕ: docker / docker-compose всегда будет использовать ту версию graph-node, которая была получена при первом запуске, поэтому важно сделать это, чтобы убедиться, что Вы используете последнюю версию graph-node.
9. Как вызвать контрактную функцию или получить доступ к публичной переменной состояния из моих мэппингов субграфа?
Take a look at Access to smart contract
state inside the section .
10. Можно ли настроить субграф с помощью graph init
из graph-cli
с двумя контрактами? Или мне следует вручную добавить другой источник данных в subgraph.yaml
после запуска graph init
?
Yes. On graph init
command itself you can add multiple datasources by entering contracts one after the other. You can also use graph add
command to add new datasource.
11. Я хочу внести свой вклад или добавить issue на GitHub. Где я могу найти репозитории с открытым исходным кодом?
12. Каков рекомендуемый способ создания "автоматически сгенерированных" идентификаторов для объекта при обработке событий?
Если во время события создается только один объект и нет ничего лучшего, то индекс хэша транзакции и журнала будет уникальным. Вы можете замаскировать их, преобразовав в байты, а затем, пропустив через crypto.keccak256
, но это не сделает их более уникальными.
13. Можно ли при прослушивании нескольких контрактов выбрать порядок, в котором контракты прослушивают события?
Внутри субграфа события всегда обрабатываются в том порядке, в котором они появляются в блоках, независимо от того, относится ли это к нескольким контрактам или нет.
14. Is it possible to differentiate between networks (mainnet, Sepolia, local) from within event handlers?
Да. Вы можете это сделать, импортировав graph-ts
, как показано в примере ниже:
import { dataSource } from '@graphprotocol/graph-ts'dataSource.network()dataSource.address()
Yes. Sepolia supports block handlers, call handlers and event handlers. It should be noted that event handlers are far more performant than the other two handlers, and they are supported on every EVM-compatible network.
В настоящее время нет, так как сопоставления написаны на AssemblyScript. Одним из возможных альтернативных решений является хранение необработанных данных в объектах и выполнение логики, для которой требуются библиотеки JS на клиенте.
Yes. dataSources.source.startBlock
in the subgraph.yaml
file specifies the number of the block that the data source starts indexing from. In most cases, we suggest using the block in which the contract was created:
18. Есть ли какие-нибудь советы по увеличению производительности индексации? Мой субграф очень долго синхронизируется
Да, Вам следует обратить внимание на дополнительную функцию стартового блока, чтобы начать индексирование с блока, в котором был развернут контракт:
19. Есть ли способ непосредственно выполнить запрос к субграфу, чтобы определить последний номер блока, который он проиндексировал?
Да! Попробуйте выполнить следующую команду, заменив "organization/subgraphName" на название организации, под которой она опубликована, и имя Вашего субграфа:
curl -X POST -d '{ "query": "{indexingStatusForCurrentVersion(subgraphName: \"organization/subgraphName\") { chains { latestBlock { hash number }}}}"}' https://api.thegraph.com/index-node/graphql
Вы можете найти список поддерживаемых сетей .
21. Можно ли дублировать субграф на другую учетную запись или эндпоинт без повторного развертывания?
Вы должны повторно развернуть субграф, но если идентификатор субграфа (хэш IPFS) не изменится, его не нужно будет синхронизировать с самого начала.
Federation пока не поддерживается, хотя мы хотим сделать это в будущем. На данный момент Вы можете использовать объединение схем либо на клиенте, либо через прокси-сервис.
По умолчанию ответы на запросы ограничены 100 единицами на коллекцию. Если Вы хотите получать больше, Вы можете довести количество до 1000 единиц на коллекцию, а после этого можно переводить их в пагинацию:
someCollection(first: 1000, skip: <number>) { ... }
24. Если мой интерфейс децентрализованного приложения использует The Graph для запросов, нужно ли мне напрямую записывать ключ запроса во внешний интерфейс? Не станут ли очень высокими комиссии за запросы пользователей вследствие их злонамеренных действий?
В настоящее время рекомендуемым подходом для децентрализованного приложения является добавление ключа во внешний интерфейс и предоставление его конечным пользователям. Тем не менее, Вы можете ограничить этот ключ именем хоста, например yourdapp.io и субграфом. Шлюз в настоящее время управляется Edge & Node. Частью ответственности шлюза является отслеживание неправомерного поведения и блокировка трафика от вредоносных клиентов.
Перейдите в Hosted Service, чтобы найти субграфы, которые Вы или другие развернули в нём. Вы можете найти его .
The Graph никогда не будет взимать плату за Hosted Service. The Graph — это децентрализованный протокол, и взимание платы за централизованную услугу не соответствует ценностям The Graph. Hosted Service всегда был временным шагом, помогающим получить доступ к децентрализованной сети. У разработчиков будет достаточно времени, чтобы перейти на децентрализованную сеть, когда им будет удобно.
If you’re a subgraph developer, you can deploy a new version of your subgraph to Subgraph Studio using the CLI. It’ll be private at that point, but if you’re happy with it, you can publish to the decentralized Graph Explorer. This will create a new version of your subgraph that Curators can start signaling on.
Event and call handlers are first ordered by transaction index within the block. Event and call handlers within the same transaction are ordered using a convention: event handlers first then call handlers, each type respecting the order they are defined in the manifest. Block handlers are run after event and call handlers, in the order they are defined in the manifest. Also these ordering rules are subject to change.
When new dynamic data source are created, the handlers defined for dynamic data sources will only start processing after all existing data source handlers are processed, and will repeat in the same sequence whenever triggered.