Preguntas Frecuentes de los Desarrolladores
Reading time: 8 min
Un subgrafo es una API personalizada construida sobre datos de blockchain. Los subgrafos se consultan mediante el lenguaje de consulta GraphQL y son deployados en un Graph Node usando Graph CLI. Una vez deployados y publicados en la red descentralizada de The Graph, los indexadores procesan los subgrafos y los ponen a disposición de los consumidores de subgrafos para que los consulten.
No es posible eliminar los subgrafos una vez creados.
No. Una vez que se crea un subgrafo, no se puede cambiar el nombre. Asegúrate de pensar en esto cuidadosamente antes de crear tu subgrafo para que sea fácil de buscar e identificar por otras dApps.
No. Una vez que se crea un subgrafo, la cuenta de GitHub asociada no puede ser modificada. Asegúrate de pensarlo bien antes de crear tu subgrafo.
Es muy recomendable que estructures tus contratos inteligentes para tener eventos asociados a los datos que te interesa consultar. Los handlers de eventos en el subgrafo son activados por los eventos del contrato y son, con mucho, la forma más rápida de recuperar datos útiles.
Si los contratos con los que estás trabajando no contienen eventos, tu subgrafo puede utilizar handlers de llamadas y bloques para activar la indexación. Aunque esto no se recomienda, ya que el rendimiento será significativamente más lento.
Necesitarás nombres separados para varias redes. Si bien no puedes tener diferentes subgrafos con el mismo nombre, existen formas convenientes de tener una base de código única para varias redes. Encuentra más sobre esto en nuestra documentación:
Las plantillas te permiten crear fuentes de datos sobre la marcha, mientras tu subgrafo está indexando. Puede darse el caso de que tu contrato genere nuevos contratos a medida que la gente interactúe con él, y dado que conoces la forma de esos contratos (ABI, eventos, etc.) por adelantado puedes definir cómo quieres indexarlos en una plantilla y cuando se generen tu subgrafo creará una fuente de datos dinámica proporcionando la dirección del contrato.
Consulta la sección "Instantiating a data source template" en: .
8. ¿Cómo puedo asegurarme de que estoy utilizando la última versión de graph-node para mis deploys locales?
Puedes ejecutar el siguiente comando:
docker pull graphprotocol/graph-node:latest
NOTA: docker/docker-compose siempre utilizará la versión de graph-node que se sacó la primera vez que se ejecutó, por lo que es importante hacer esto para asegurarse de que estás al día con la última versión de graph-node.
9. ¿Cómo llamo a una función de contrato o accedo a una variable de estado pública desde mis mapeos de subgrafos?
Take a look at Access to smart contract
state inside the section .
10. ¿Es posible configurar un subgrafo usando graph init
de graph-cli
con dos contratos? ¿O debo agregar manualmente otra fuente de datos en subgraph.yaml
después de ejecutar 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. Quiero contribuir o agregar un problema de GitHub. ¿Dónde puedo encontrar los repositorios de código abierto?
12. ¿Cuál es la forma recomendada para crear ids "autogeneradas" para una entidad al manejar eventos?
Si sólo se crea una entidad durante el evento y si no hay nada mejor disponible, entonces el hash de la transacción + el índice del registro serían únicos. Puedes ofuscar esto convirtiendo eso en Bytes y luego pasándolo por crypto.keccak256
pero esto no lo hará más único.
Cuando se escuchan varios contratos, ¿es posible seleccionar el orden de los contratos para escuchar los eventos?
Dentro de un subgrafo, los eventos se procesan siempre en el orden en que aparecen en los bloques, independientemente de que sea a través de múltiples contratos o no.
14. Is it possible to differentiate between networks (mainnet, Sepolia, local) from within event handlers?
Sí. Puedes hacerlo importando graph-ts
como en el ejemplo siguiente:
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.
Actualmente no, ya que los mapeos se escriben en AssemblyScript. Una posible solución alternativa a esto es almacenar los datos en bruto en entidades y realizar la lógica que requiere las bibliotecas JS en el cliente.
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. ¿Hay algunos consejos para aumentar el rendimiento de la indexación? Mi subgrafo está tardando mucho en sincronizarse
Sí, debes echar un vistazo a la función de bloque de inicio opcional para comenzar a indexar desde el bloque en el que se implementó el contrato:
19. ¿Hay alguna forma de consultar el subgrafo directamente para determinar el último número de bloque que ha indexado?
¡Sí es posible! Prueba el siguiente comando, sustituyendo "organization/subgraphName" por la organización bajo la que se publica y el nombre de tu subgrafo:
curl -X POST -d '{ "query": "{indexingStatusForCurrentVersion(subgraphName: \"organization/subgraphName\") { chains { latestBlock { hash number }}}}"}' https://api.thegraph.com/index-node/graphql
Puedes encontrar la lista de redes admitidas .
Tienes que volver a realizar el deploy del subgrafo, pero si el ID del subgrafo (hash IPFS) no cambia, no tendrá que sincronizarse desde el principio.
Federation aún no es compatible, aunque queremos apoyarla en el futuro. Por el momento, algo que se puede hacer es utilizar el stitching de esquemas, ya sea en el cliente o a través de un servicio proxy.
Por defecto, las respuestas a las consultas están limitadas a 100 elementos por colección. Si quieres recibir más, puedes llegar hasta 1000 elementos por colección y más allá, puedes paginar con:
someCollection(first: 1000, skip: <number>) { ... }
24. Si mi interfaz de dapp usa The Graph para realizar consultas, ¿debo escribir mi clave de consulta directamente en la interfaz? ¿Qué pasa si pagamos tarifas de consulta para los usuarios? ¿Los usuarios malintencionados harán que nuestras tarifas de consulta sean muy altas?
Actualmente, el enfoque recomendado para una dapp es añadir la clave al frontend y exponerla a los usuarios finales. Dicho esto, puedes limitar esa clave a un nombre de host, como yourdapp.io y subgrafo. La gateway se ejecuta actualmente por Edge & Node. Parte de la responsabilidad de un gateway es monitorear el comportamiento abusivo y bloquear el tráfico de clientes maliciosos.
Head over to the hosted service in order to find subgraphs that you or others deployed to the hosted service. You can find it .
The Graph will never charge for the hosted service. The Graph is a decentralized protocol, and charging for a centralized service is not aligned with The Graph’s values. The hosted service was always a temporary step to help get to the decentralized network. Developers will have a sufficient amount of time to upgrade to the decentralized network as they are comfortable.
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.