Data Source Templates: rastrea sin problemas los datos de contratos recién implementados en tus subgrafos

Lorena Fabris
8 min read2 days ago

Traducción del artículo: ¨Data Source Templates: Seamlessly Track Newly Deployed Contract Data in Your Subgraphs¨ de Hudson Headley

¿Cansado de actualizar tus subgrafos cada vez que se actualiza o se hace deploy de un contrato? El aprovechamiento de Data Source Templates o Plantillas de Fuentes de Datos elimina esta molestia y lleva los subgrafos al siguiente nivel. Estas plantillas permiten que los subgrafos construidos en The Graph rastreen e indexen dinámicamente los contratos recién deployados o implementados, asegurando que no se pierdan datos.

Ya sea que los desarrolladores estén utilizando factory deployment patterns o lidiando con interacciones complejas, Data Source Templates proporciona la flexibilidad necesaria para mantener una vista integral de los datos de blockchain sin constantes actualizaciones de subgrafos.

Data Source Templates funciona permitiendo que los subgrafos agreguen dinámicamente fuentes de datos durante el runtime. En lugar de codificar todos los contratos potenciales en un manifiesto subgraph.yaml , los desarrolladores pueden definir un template o plantilla que sirve como modelo. Cuando se hace deploy de nuevos contratos que coinciden con ciertos criterios, el subgrafo de The Graph puede instanciar una nueva fuente de datos a partir de este template, rastreando automáticamente los eventos y cambios de estado de los contratos.

Esta capacidad dinámica es particularmente útil para protocolos y dapps que crean múltiples contratos a lo largo del tiempo, como un deployment de tokens, creación de NFTs, o en el caso del Perpetual Organization Architect (Poa), haciendo deploy de nuevas DAOs. También permite una fácil integración con patterns comunes de actualización de proxy. Los subgrafos que aprovechan Data Source Templates requieren un mantenimiento mínimo, reduciendo el tiempo de inactividad y permitiendo a los desarrolladores concentrarse en agregar nuevas características a su protocolo o dapp en lugar de administrar la infraestructura.

Data Source Templates se puede usar para trackear DAOs recién implementadas desde factory contracts. El ejemplo a continuación es de Poa, el Perpetual Organization Architect. Consulta el repositorio aquí para seguir y ver una implementación compleja de Data Source Template.

Data Source Template con Factory Pattern

El Factory Pattern es un patrón común de diseño de smart contract donde un contrato central (factory) se utiliza para hacer deploy de nuevos contratos basados en parámetros pasados al factory. Con un setup o configuración tradicional de subgrafo, los desarrolladores necesitarían actualizar manualmente el subgrafo para incluir cada nuevo contrato, lo cual no es escalable para protocolos que hacen deploy de contratos dinámicamente. Al utilizar Data Source Templates, se define un template que describe cómo trackear estos nuevos contratos e indexarlos automáticamente.

En el caso de Poa, el master deploy factory (masterDeployFactory.sol) hace deploy de múltiples contratos responsables de la operación de la DAO y aprovecha Data Source Templates para rastrearlos. Este enfoque asegura que los usuarios puedan consultar datos fácilmente y construir sus propios frontends sobre el subgrafo si lo desean, mejorando la personalización y accesibilidad.

Implementación de Data Source Templates

Analicemos cómo implementar Data Source Templates en un subgrafo, usando la implementación de la DAO de Poa como ejemplo.

Aquí hay un ejemplo paso a paso de cómo Poa usa Data Source Templates:

1.- Define y vincula entidades en schema.graphql

2.- Implementa Data Source Templates en subgraph.yaml

3.- Activa Data Source Templates en mappings.ts

1.- Definir y Vincular Entidades en schema.graphql

El primer paso es definir las entidades personalizadas que queremos rastrear. En este ejemplo, hay una entidad PerpetualOrganization simplificada, una entidad DirectDemocracyToken y una entidad para rastrear el minteo de tokens de democracia directa en el nuevo contrato. Podemos modelar una implementación personalizada a partir de esto:

type PerpetualOrganization @entity {
id: ID!
name: String!
directDemocracyToken: DDToken
}

type DDToken @entity {
id: ID!
tokenAddress: Bytes!
name: String!
symbol: String!
pOName: String!
mintEvents: [DDTokenMintEvent!]! @derivedFrom(field: "token")
}

type DDTokenMintEvent @entity {
id: ID!
token: DDToken!
to: Bytes!
amount: BigInt!
}


SCHEMA.GRAPHQL

Este esquema está configurado para que PerpetualOrganization no requiera que exista DirectDemocracyToken cuando se crea (nota la ausencia del ! que lo marca como anulable). Esto nos permite manejar la creación de la entidad PerpetualOrganization antes de que se cree la entidad DDToken correspondiente.

También es importante notar que las relaciones entre entidades se definen asociando directamente entidades como PerpetualOrganization y DDToken a través de sus campos, permitiendo un acceso sin problemas entre ellos. Mientras tanto, @derivedFrom se usa para búsquedas inversas, permitiendo la recuperación eficiente de datos relacionados como mintEvents para un DDToken específico. Esto es particularmente útil porque mientras cada organización tiene solo un DDToken, ese token puede tener múltiples eventos de minteo.

2. Implementar definiciones de Fuentes de Datos en subgraph.yaml

Al definir fuentes de datos, el primer paso es definir todas las fuentes estáticas del subgrafo como de costumbre y asegurarse de incluir tu factory contract similar al siguiente. La única entidad que será creada por el factory en este caso es un nuevo DDToken.

- kind: ethereum/contract
name: DirectDemocracyTokenFactory
network: polygon-amoy
source:
address: "0x2F0f89dc567A9147e43008141496e0703870C057"
abi: DirectDemocracyTokenFactory
startBlock: 9480000
mapping:
kind: ethereum/events
apiVersion: 0.0.7
language: wasm/assemblyscript
entities:
- DDToken
abis:
- name: DirectDemocracyTokenFactory
file: ../abi/DirectDemocracyTokenFactory.json
eventHandlers:
- event: TokenCreated(address,string,string,string[],string)
handler: handleTokenCreated
file: ./mappings/ddToken/ddTokenFactoryMapping.ts


SUBGRAPH.YAML

A continuación, define tus templates para el DirectDemocracyToken mismo. La principal diferencia aquí es que en lugar de ser definido bajo dataSources como normal, lo definimos bajo la categoría templates, y el source solo incluye el abi porque address y startBlock son desconocidos. Todavía necesitamos definir qué entities y eventHandlers serán necesarios como normal.

templates:
- kind: ethereum/contract
name: DirectDemocracyToken
network: polygon-amoy
source:
abi: DirectDemocracyToken
mapping:
kind: ethereum/events
apiVersion: 0.0.7
language: wasm/assemblyscript
entities:
- DDToken
- DDTokenMintEvent
abis:
- name: DirectDemocracyToken
file: ../abi/DirectDemocracyToken.json
eventHandlers:
- event: Mint(indexed address,uint256)
handler: handleTokenMint
file: ./mappings/ddToken/ddTokenMapping.ts


SUBGRAPH.YAML

Hemos implementado exitosamente la definición del template de fuente de datos en subgraph.yaml, así que es hora de pasar a cómo funcionan los handles de eventos con los templates.

3. Activar Data Source Templates en mapping.ts

La sección de mappings es la mayor diferencia entre implementar una fuente de datos estática y dinámica en nuestro subgrafo. Primero revisaremos el archivo de mapping estático para el factory token de democracia directa. Es importante notar nuevamente que en este ejemplo la entidad PerpetualOrganization ya ha sido creada. Esta función de mapping crea nuevas entidades y puebla entidades existentes con nueva información de la misma manera que un subgrafo clásico.

Sin embargo, también importamos el tokenTemplate de nuestros templates generados y llamamos a la función create pasando en el nuevo token address. Esto señala que estamos inicializando una nueva fuente de datos basada en el template que definimos anteriormente. Un problema común con el Data Source Templates son los errores con nombres duplicados. Para contrarrestar esto, importé mi template DirectDemocracyToken como tokenTemplate. Este paso no es requerido, pero puede arreglar errores desconocidos.

import { TokenCreated } from "../generated/DirectDemocracyTokenFactory/DirectDemocracyTokenFactory";
import { DDToken, PerpetualOrganization } from "../generated/schema";
import { tokenTemplate } from "../generated/templates";
import { log } from "@graphprotocol/graph-ts";

export function handleTokenCreated(event: TokenCreated): void {
log.info("Triggered handleTokenCreated", []);

// Create and save the new DDToken entity
let newToken = new DDToken(event.params.tokenAddress.toHex());
newToken.tokenAddress = event.params.tokenAddress;
newToken.name = event.params.name;
newToken.symbol = event.params.symbol;
newToken.POname = event.params.POname;
newToken.save();

// Update the associated PerpetualOrganization entity if it exists
let po = PerpetualOrganization.load(event.params.POname);
if (po != null) {
po.DirectDemocracyToken = event.params.tokenAddress.toHex();
po.save();
}

// Create a new instance of the token template
tokenTemplate.create(event.params.tokenAddress);
}


DDTOKENFACTORYMAPPING.TS

Ahora, implementamos el handler para el nuevo DirectDemocracyToken así podemos crear las nuevas entidades basadas en eventos desde el nuevo contrato creado. No se requiere nada extra en el mapping file para que la entidad sea creada y actualizada apropiadamente, ya que el template está definido correctamente en el subgraph.yaml.

import { log } from “@graphprotocol/graph-ts”;
import { Mint as MintEvent } from “../../generated/templates/DirectDemocracyToken/DirectDemocracyToken”;
import { DDTokenMintEvent, DDToken } from “../../generated/schema”;

export function handleTokenMint(event: MintEvent): void {
log.info("Triggered handleTokenMint", []);

// Load the corresponding DDToken entity
let token = DDToken.load(event.address.toHex());

if (token == null) {
// Return if token not found
log.error("DDToken not found: {}", [event.address.toHex()]);
return;
}

// Create and save a new DDTokenMintEvent entity
let entity = new DDTokenMintEvent(
event.transaction.hash.toHex() + "-" + event.logIndex.toString()
);
entity.to = event.params.to;
entity.token = event.address.toHex();
entity.amount = event.params.amount;
entity.save();
}


DDTOKENMINT.TS

¡Después de implementar nuestras funciones de mapping de templates, hemos creado exitosamente nuestro primer subgrafo aprovechando Data Source Templates!

Conclusión

Hemos visto cómo Data Source Templates puede mejorar significativamente el proceso de rastrear contratos recién implementados en nuestro subgrafo, usando el deployment de la DAO de Poa como un ejemplo práctico. Hemos explorado cómo estos templates optimizan la gestión de entornos de contratos dinámicos, ofreciendo una solución escalable para mantener datos precisos y cohesivos de nuevos contratos.

Esto demuestra el potencial de Data Source Templates como una herramienta clave para desarrolladores y especialmente para ingenieros de protocolo que trabajan con The Graph, permitiendo una integración sin problemas y una reducción en la sobrecarga de mantenimiento.

Para ver Data Source Templates en acción y aprender más sobre cómo Poa las utiliza para impulsar su plataforma, consulta el repositorio de Poa y nuestro sitio web para explorar cómo este enfoque innovador puede beneficiar a nuestros propios proyectos.

Sobre Poa

Poa, el Perpetual Organization Architect, es un constructor de DAOs sin código diseñado para empoderar comunidades poniendo el control en manos de los contribuyentes, no del capital. Con Poa, las organizaciones pueden distribuir el poder de voto a través de la participación activa, usando un administrador de tareas onchain combinado con métodos de votación personalizados en lugar de ventas tradicionales de tokens. Esto asegura que la gobernanza sea impulsada por aquellos que están verdaderamente invertidos en el éxito de la comunidad. Ya sea que estés formando una organización estudiantil, un grupo de defensa de base, o una cooperativa manejada por trabajadores, Poa proporciona las herramientas para construir y administrar estructuras de gobernanza innovadoras y centradas en las personas que priorizan la propiedad comunitaria y la colaboración.

Acerca de The Graph

The Graph es la fuente de datos e información para la internet descentralizada. Como el marketplace de datos descentralizado original que introdujo y estandarizó los subgrafos, The Graph se ha convertido en el método de web3 para indexar y acceder a datos de la blockchain. Desde su lanzamiento en 2018, decenas de miles de desarrolladores han construido subgrafos para dapps a través de más de 80 blockchains — incluyendo Ethereum, Solana, Arbitrum, Optimism, Base, Polygon, Celo, Fantom, Gnosis y Avalanche.

A medida que la demanda de datos en web3 continúa creciendo, The Graph entra en una New Era con una visión más amplia que incluye nuevos servicios de datos y lenguajes de consulta, asegurando que el protocolo descentralizado pueda servir cualquier caso de uso — ahora y en el futuro.

Descubre más sobre cómo The Graph está dando forma al futuro de las redes de infraestructura física descentralizada (DePIN) y mantente conectado con la comunidad. Sigue a The Graph en X, LinkedIn, Instagram, Facebook, Reddit, Farcaster y Medium. Únete a la comunidad en el Telegram de The Graph, únete a discusiones técnicas en el Discord de The Graph.

The Graph Foundation supervisa The Graph Network. The Graph Foundation es supervisada por el Technical Council. Edge & Node, StreamingFast, Semiotic Labs, Messari, GraphOps, Pinax y Geo son siete de las muchas organizaciones dentro del ecosistema The Graph.

--

--

Lorena Fabris
Lorena Fabris

Written by Lorena Fabris

Lawyer, Political Scientist, Blockchain Enthusiast

No responses yet