7 minutos
Perguntas frequentes do programador
Esta página resume algumas das perguntas mais comuns para programadores que trabalham no The Graph.
Perguntas sobre Subgraphs
1. What is a Subgraph?
A Subgraph is a custom API built on blockchain data. Subgraphs are queried using the GraphQL query language and are deployed to a Graph Node using The Graph CLI. Once deployed and published to The Graph’s decentralized network, Indexers process Subgraphs and make them available for Subgraph consumers to query.
2. What is the first step to create a Subgraph?
To successfully create a Subgraph, you will need to install The Graph CLI. Review the Quick Start to get started. For detailed information, see Creating a Subgraph.
3. Can I still create a Subgraph if my smart contracts don’t have events?
It is highly recommended that you structure your smart contracts to have events associated with data you are interested in querying. Event handlers in the Subgraph are triggered by contract events and are the fastest way to retrieve useful data.
If the contracts you work with do not contain events, your Subgraph can use call and block handlers to trigger indexing. However, this is not recommended, as performance will be significantly slower.
4. Can I change the GitHub account associated with my Subgraph?
No. Once a Subgraph is created, the associated GitHub account cannot be changed. Please make sure to carefully consider this before creating your Subgraph.
5. How do I update a Subgraph on mainnet?
You can deploy a new version of your Subgraph to Subgraph Studio using the CLI. This action maintains your Subgraph private, but once you’re happy with it, you can publish to Graph Explorer. This will create a new version of your Subgraph that Curators can start signaling on.
6. Is it possible to duplicate a Subgraph to another account or endpoint without redeploying?
You have to redeploy the Subgraph, but if the Subgraph ID (IPFS hash) doesn’t change, it won’t have to sync from the beginning.
7. How do I call a contract function or access a public state variable from my Subgraph mappings?
Veja o estado de Acesso ao contrato inteligente
dentro da secção API AssemblyScript.
8. Can I import ethers.js
or other JS libraries into my Subgraph mappings?
Não atualmente, afinal, os mapeamentos são escritos em AssemblyScript.
Uma solução alternativa possível é armazenar dados brutos em entidades e executar uma lógica que exige bibliotecas de JS no cliente.
9. Ao escutar vários contratos, é possível selecionar a ordem do contrato para escutar eventos?
Within a Subgraph, the events are always processed in the order they appear in the blocks, regardless of whether that is across multiple contracts or not.
10. Quais são as diferenças entre modelos e fontes de dados?
Templates allow you to create data sources quickly, while your Subgraph is indexing. Your contract might spawn new contracts as people interact with it. Since you know the shape of those contracts (ABI, events, etc.) upfront, you can define how you want to index them in a template. When they are spawned, your Subgraph will create a dynamic data source by supplying the contract address.
Confira a secção “Como instanciar um modelo de fonte de dados” em: Modelos de Fonte de Dados.
11. Is it possible to set up a Subgraph using graph init
from graph-cli
with two contracts? Or should I manually add another dataSource in subgraph.yaml
after running graph init
?
Sim. No comando graph init
, pode-se adicionar várias dataSources ao inserir um contrato após o outro.
O comando graph add
também pode adicionar uma nova dataSource.
12. Em qual ordem os handlers de evento, bloco, e chamada são ativados para uma fonte de dados?
Primeiro, handlers de eventos e chamadas são organizados pelo índice de transações dentro do bloco. Handlers de evento e chamada dentro da mesma transação são organizados com uma convenção: handlers de eventos primeiro e depois handlers de chamadas, com cada tipo a respeitar a ordem em que são definidos no manifest. Handlers de blocos são executados após handlers de eventos e chamadas, na ordem em que são definidos no manifest. Estas regras de organizações estão sujeitas a mudanças.
Com a criação de novas fontes de dados dinâmicas, os handlers definidos para fontes de dados dinâmicas só começarão a processar após o processamento dos handlers das fontes, e se repetirão na mesma sequência sempre que acionados.
13. Como garantir que estou a usar a versão mais recente do graph-node para as minhas implantações locais?
Podes executar o seguinte comando:
1docker pull graphprotocol/graph-node:latest
Observação: O docker / docker-compose sempre usará a versão do graph-node que foi puxada na primeira vez que o executou, então é importante fazer isto para garantir que está em dia com a versão mais recente do graph-node.
14. Qual é a forma recomendada de construir ids “autogeradas” para uma entidade ao lidar com eventos?
Se só uma entidade for criada durante o evento e não houver nada melhor disponível, então o hash da transação + o index do registo seria único. Esses podem ser ofuscados ao converter em Bytes e então passar pelo crypto.keccak256
, mas isto não deixará os dados mais singulares.
15. Can I delete my Subgraph?
Yes, you can delete and transfer your Subgraph.
Perguntas sobre Rede
16. Quais redes são apoiadas pelo The Graph?
Veja a lista das redes apoiadas aqui.
17. É possível diferenciar entre redes (mainnet, Sepolia, local) dentro de handlers de eventos?
Sim. Isto é possível ao importar o graph-ts
como no exemplo abaixo:
1import { dataSource } from '@graphprotocol/graph-ts'23dataSource.network()4dataSource.address()
18. Vocês apoiam handlers de bloco e de chamadas no Sepolia?
Sim. O Sepolia apoia handlers de blocos, chamadas e eventos. Vale notar que handlers de eventos têm desempenho muito melhor do que os outros dois e têm apoio em todas as redes compatíveis com EVMs.
Perguntas sobre Indexação e Queries
19. É possível especificar o bloco de onde a indexação deve começar?
Sim. O dataSources.source.startBlock
no arquivo subgraph.yaml
especifica o número do bloco de onde a fonte de dados começa a indexar. Geralmente, sugerimos usar o bloco em que o contrato foi criado: Blocos de início
20. What are some tips to increase the performance of indexing? My Subgraph is taking a very long time to sync
Sim. Confira o recurso opcional de bloco inicial (start block) para começar a indexar do bloco em que o contrato foi lançado: Blocos iniciais
21. Is there a way to query the Subgraph directly to determine the latest block number it has indexed?
Sim! Execute o seguinte comando, com “organization/subgraphName” substituído com a organização sob a qual ele foi publicado e o nome do seu subgraph:
1curl -X POST -d '{ "query": "{indexingStatusForCurrentVersion(subgraphName: \"organization/subgraphName\") { chains { latestBlock { hash number }}}}"}' https://api.thegraph.com/index-node/graphql
22. Há um limite de quantos objetos o Graph pode retornar por query?
Normalmente, respostas a queries são limitadas a 100 itens por coleção. Se quiser receber mais, pode subir para até 1000 itens por coleção; além disto, pode paginar com:
1someCollection(first: 1000, skip: <number>) { ... }
23. Se a frontend do meu dApp usa o The Graph para queries, eu preciso escrever a minha chave de API diretamente na frontend? E se pagarmos taxas de query para utilizadores — algum utilizador malicioso pode aumentar demais estas taxas?
Currently, the recommended approach for a dapp is to add the key to the frontend and expose it to end users. That said, you can limit that key to a hostname, like yourdapp.io and Subgraph. The gateway is currently being run by Edge & Node. Part of the responsibility of a gateway is to monitor for abusive behavior and block traffic from malicious clients.
Outras Perguntas
24. É possível usar a Apollo Federation juntamente ao graph-node?
Ainda não há apoio ao Federation. No momento, é possível costurar schemas, seja no cliente ou via um serviço de proxy.