Docs
Buscar⌘ K
  • Início
  • Sobre o The Graph
  • Redes Apoiadas
  • Contratos de Protocolo
  • Subgraphs
    • Substreams
      • Token API
        • Hypergraph
          • AI Suite
            • Indexação
              • Recursos
                Subgraphs > How-to Guides

                4 minutos

                Debugging de Subgraphs Rápido e Fácil Com Forks

                Assim como vários sistemas que processam uma abundância de dados, os Indexadores do Graph (Graph Nodes) podem demorar um pouco para sincronizar o seu subgraph com a blockchain de destino. A discrepância entre mudanças rápidas para fins de solução de problemas e os longos tempos de espera necessários para o indexing é extremamente contraprodutiva, e nós sabemos muito bem disso. É por isso que introduzimos o forking de subgraphs, programado pela LimeChain⁠; neste artigo. Veja como dá para acelerar bastante o processo de debug de subgraphs!

                Ok, o que é isso?

                O forking de subgraphs é o processo de retirar entidades tranquilamente do armazenamento de outro subgraph (normalmente, remoto).

                No contexto do debug, o forking de subgraphs permite debugar o seu subgraph falho no bloco X sem precisar esperar que ele sincronize até o bloco X.

                O quê?! Como?!

                Quando um subgraph é implementado em um Graph Node remoto para indexação, e ele falha no bloco X, a boa notícia é que o Graph Node ainda servirá queries GraphQL com o seu armazenamento, que é sincronizado até o bloco X. Ótimo! Podemos aproveitar este armazenamento “atualizado” para consertar os bugs que surgem ao indexar o bloco X.

                Resumindo, faremos um fork do subgraph falho de um Graph Node remoto para garantir que o subgraph seja indexado até o bloco X, para fornecer ao subgraph implantado localmente uma visão atualizada do estado da indexação; sendo este debugado no bloco X.

                Por favor, quero ver códigos!

                Para manter o foco no debug de subgraphs, vamos começar com coisas simples: siga o example-subgraph⁠ a indexar o contrato inteligente Ethereum Gravity.

                Aqui estão os handlers definidos para a indexação dos Gravatars, sem qualquer bug:

                1export function handleNewGravatar(event: NewGravatar): void {2  let gravatar = new Gravatar(event.params.id.toHex().toString())3  gravatar.owner = event.params.owner4  gravatar.displayName = event.params.displayName5  gravatar.imageUrl = event.params.imageUrl6  gravatar.save()7}89export function handleUpdatedGravatar(event: UpdatedGravatar): void {10  let gravatar = Gravatar.load(event.params.id.toI32().toString())11  if (gravatar == null) {12    log.critical('Gravatar not found!', [])13    return14  }15  gravatar.owner = event.params.owner16  gravatar.displayName = event.params.displayName17  gravatar.imageUrl = event.params.imageUrl18  gravatar.save()19}

                Que pena! Quando eu implanto o meu lindo subgraph no Subgraph Studio, ele apresenta o erro “Gravatar not found” (Gravatar não encontrado).

                A maneira mais comum de tentar consertar este erro é:

                1. Fazer uma mudança na fonte dos mapeamentos, que talvez possa resolver o problema (mas é claro que não vai).
                2. Implante o subgraph novamente no Subgraph Studio (ou outro Graph Node remoto).
                3. Esperar que ele se sincronize.
                4. Se quebrar novamente, volte ao passo 1. Se não: Eba!

                É um típico processo ordinário de debug, mas há um passo que atrasa muito o processo: 3. Esperar que ele se sincronize.

                Com o forking de subgraphs, essencialmente, podemos eliminar este passo. É mais ou menos assim:

                1. Crie um Graph Node local com o conjunto de fork-base apropriado.
                2. Faça uma mudança na fonte dos mapeamentos, que talvez possa resolver o problema.
                3. Implante-o no Graph Node local, faça um fork do subgraph falho, e comece do bloco problemático_.
                4. Se quebrar novamente, volte ao passo 1. Se não: Eba!

                Agora, você deve ter duas perguntas:

                1. Que fork-base???
                2. Forkar quem?!

                E eu respondo:

                1. fork-base é o URL “base”, tal que quando a id de subgraph é atrelada, o URL resultante (<fork-base>/<subgraph-id>) se torna um endpoint válido da GraphQL para o armazenamento do subgraph.
                2. Forking é fácil, não precisa se preocupar:
                1$ graph deploy <subgraph-name> --debug-fork <subgraph-id> --ipfs http://localhost:5001 --node http://localhost:8020

                Aliás, não esqueça de preencher o campo dataSources.source.startBlock no manifest do subgraph com o número do bloco problemático, para pular a indexação de blocos desnecessários e tomar vantagem do fork!

                Aqui está o que eu faço:

                1. Eu monto um Graph Node local (veja como⁠) com a opção fork-base de https://api.thegraph.com/subgraphs/id/, já que eu vou forkar um subgraph, o bugado que eu lancei anteriormente, do Subgraph Studio.
                1$ cargo run -p graph-node --release -- \2    --postgres-url postgresql://USERNAME[:PASSWORD]@localhost:5432/graph-node \3    --ethereum-rpc NETWORK_NAME:[CAPABILITIES]:URL \4    --ipfs 127.0.0.1:50015    --fork-base https://api.thegraph.com/subgraphs/id/
                1. Após vistoriar com cuidado, percebo uma discrepância nas representações de id usadas ao indexar Gravatars nos meus dois handlers. Enquanto handleNewGravatar o converte a um hex (event.params.id.toHex()), o handleUpdatedGravatar usa um int32 (event.params.id.toI32()). Assim, o handleUpdatedGravatar entra em pânico com o “Gravatar não encontrado!”. Eu faço os dois converterem o id em um hex.
                2. Após ter feito as mudanças, implanto o meu subgraph no Graph Node local, fazendo um fork do subgraph falho e programando o dataSources.source.startBlock em 6190343 no subgraph.yaml:
                1$ graph deploy gravity --debug-fork QmNp169tKvomnH3cPXTfGg4ZEhAHA6kEq5oy1XDqAxqHmW --ipfs http://localhost:5001 --node http://localhost:8020
                1. Eu verifico os logs produzidos pelo Graph Node local e… eba! Parece que deu tudo certo.
                2. Agora que o meu subgraph está livre de bugs, o implantarei num Graph Node remoto e viverei feliz para sempre! (mas sem batatas)
                ⁠Editar no GitHub⁠

                Construa um Subgraph Compostável com Múltiplos SubgraphsConstrução de Subgraphs na NEAR
                Nesta página
                • Ok, o que é isso?
                • O quê?! Como?!
                • Por favor, quero ver códigos!
                The GraphStatusRede de TestesAtivos de MarcaFórumSegurançaPolítica de PrivacidadeAcordo de Serviço