Construyendo subgrafos en Cosmos
Reading time: 7 min
This guide is an introduction on building subgraphs indexing based blockchains.
The Graph permite a los developers procesar eventos de blockchain y hacer que los datos resultantes estén fácilmente disponibles a través de una API GraphQL abierta, conocida como subgrafo. ahora puede procesar eventos de Cosmos, lo que significa que los developers de Cosmos ahora pueden crear subgrafos para indexar fácilmente eventos on-chain.
Hay cuatro tipos de handlers admitidos en los subgrafos de Cosmos:
- Block handlers se ejecutan cada vez que se agrega un nuevo bloque a la cadena.
- Event handlers se ejecutan cuando se emite un evento específico.
- Los handlers de transacciones se ejecutan cuando se produce una transacción.
- Message handlers se ejecutan cuando ocurre un mensaje específico.
are objects that contain information about the execution of the application. They are mainly used by service providers like block explorers and wallets to track the execution of various messages and index transactions.
are module-specific objects that trigger state transitions within the scope of the module they belong to.
Aunque se puede acceder a todos los datos con un handler de bloques, otros handlers permiten a los developers de subgrafos procesar datos de una manera mucho más granular.
is a CLI tool to build and deploy subgraphs, version >=0.30.0
is required in order to work with Cosmos subgraphs.
is a library of subgraph-specific types, version >=0.27.0
is required in order to work with Cosmos subgraphs.
Hay tres partes clave cuando se trata de definir un subgrafo:
subgraph.yaml: un archivo YAML que contiene el manifiesto del subgrafo, que identifica qué eventos rastrear y cómo procesarlos.
schema.graphql: un esquema de GraphQL que define qué datos se almacenan para su subgrafo y cómo consultarlos a través de GraphQL.
Asignaciones AssemblyScript: código que traduce los datos de la blockchain a las entidades definidas en tu esquema.
El manifiesto del subgrafo (subgraph.yaml
) identifica las fuentes de datos para el subgrafo, los disparadores de interés y las funciones (handlers
) que deben ejecutarse en respuesta a esos disparadores. Consulte a continuación un manifiesto de subgrafo de ejemplo para un subgrafo de Cosmos:
specVersion: 0.0.5description: Cosmos Subgraph Exampleschema:file: ./schema.graphql # link to the schema filedataSources:- kind: cosmosname: CosmosHubnetwork: cosmoshub-4 # This will change for each cosmos-based blockchain. In this case, the example uses the Cosmos Hub mainnet.source:startBlock: 0 # Required for Cosmos, set this to 0 to start indexing from chain genesismapping:apiVersion: 0.0.7language: wasm/assemblyscriptblockHandlers:- handler: handleNewBlock # the function name in the mapping fileeventHandlers:- event: rewards # the type of the event that will be handledhandler: handleReward # the function name in the mapping filetransactionHandlers:- handler: handleTransaction # the function name in the mapping filemessageHandlers:- message: /cosmos.staking.v1beta1.MsgDelegate # the type of a messagehandler: handleMsgDelegate # the function name in the mapping filefile: ./src/mapping.ts # link to the file with the Assemblyscript mappings
- Los subgrafos de Cosmos introducen un nuevo
tipo
de origen de datos (cosmos
). - El
network
debe corresponder a una cadena en el ecosistema Cosmos. En el ejemplo, se usa la mainnet de Cosmos Hub.
Schema definition describes the structure of the resulting subgraph database and the relationships between entities. This is agnostic of the original data source. There are more details on subgraph schema definition .
Los controladores para procesar eventos están escritos en .
Cosmos indexing introduces Cosmos-specific data types to the .
class Block {header: Headerevidence: EvidenceListresultBeginBlock: ResponseBeginBlockresultEndBlock: ResponseEndBlocktransactions: Array<TxResult>validatorUpdates: Array<Validator>}class EventData {event: Eventblock: HeaderOnlyBlocktx: TransactionContext}class TransactionData {tx: TxResultblock: HeaderOnlyBlock}class MessageData {message: Anyblock: HeaderOnlyBlocktx: TransactionContext}class TransactionContext {hash: Bytesindex: u32code: u32gasWanted: i64gasUsed: i64}class HeaderOnlyBlock {header: Header}class Header {version: ConsensuschainId: stringheight: u64time: TimestamplastBlockId: BlockIDlastCommitHash: BytesdataHash: BytesvalidatorsHash: BytesnextValidatorsHash: BytesconsensusHash: BytesappHash: ByteslastResultsHash: BytesevidenceHash: BytesproposerAddress: Byteshash: Bytes}class TxResult {height: u64index: u32tx: Txresult: ResponseDeliverTxhash: Bytes}class Event {eventType: stringattributes: Array<EventAttribute>}class Any {typeUrl: stringvalue: Bytes}
Cada tipo de handler viene con su propia estructura de datos que se pasa como argumento a una función de mapping.
- Los handlers de bloques reciben el tipo
Block
. - Los handlers de eventos reciben el tipo
EventData
. - Los handlers de transacciones reciben el tipo
TransactionData
. - Los handlers de mensajes reciben el tipo
MessageData
.
Como parte de MessageData
, el message handler recibe un contexto de transacción, que contiene la información más importante sobre una transacción que abarca un mensaje. El contexto de transacción también está disponible en el tipo EventData
, pero solo cuando el evento correspondiente está asociado con una transacción. Además, todos los controladores reciben una referencia a un bloque (HeaderOnlyBlock
).
Puedes encontrar una lista completa de los tipos para la integración Cosmos aquí .
It's important to note that Cosmos messages are chain-specific and they are passed to a subgraph in the form of a serialized payload. As a result, the message data needs to be decoded in a mapping function before it can be processed.
Un ejemplo de cómo decodificar los datos de un mensaje en un subgrafo se puede encontrar .
El primer paso antes de comenzar a escribir las asignaciones de subgrafos es generar los enlaces de tipos en función de las entidades que se han definido en el archivo de esquema de subgrafos (schema.graphql
). Esto permitirá que las funciones de mapeo creen nuevos objetos de esos tipos y los guarden en la tienda. Esto se hace usando el comando CLI codegen
:
$ graph codegen
Una vez que las esquematizaciones están listas, se debe construir el subgrafo. Este paso resaltará cualquier error que puedan tener el manifiesto o las esquematizaciones. Un subgrafo debe construirse correctamente para deployarse en The Graph Node. Se puede hacer usando el comando CLI build
:
$ graph build
Una vez que se haya creado su subgrafo, puede implementar su subgrafo usando el comando CLI graph deployment
:
Subgraph Studio
Visit the Subgraph Studio to create a new subgraph.
graph deploy subgraph-name
Local Graph Node (based on default configuration):
graph create subgraph-name --node http://localhost:8020
graph deploy subgraph-name --node http://localhost:8020/ --ipfs http://localhost:5001
The GraphQL endpoint for Cosmos subgraphs is determined by the schema definition, with the existing API interface. Please visit the for more information.
The is the first blockchain in the ecosystem. You can visit the for more information.
Cosmos Hub mainnet is cosmoshub-4
. Cosmos Hub current testnet is theta-testnet-001
.
Other Cosmos Hub networks, i.e. cosmoshub-3
, are halted, therefore no data is provided for them.
Osmosis support in Graph Node and on Subgraph Studio is in beta: please contact the graph team with any questions about building Osmosis subgraphs!
is a decentralized, cross-chain automated market maker (AMM) protocol built on top of the Cosmos SDK. It allows users to create custom liquidity pools and trade IBC-enabled tokens. You can visit the for more information.
Osmosis mainnet is osmosis-1
. Osmosis current testnet is osmo-test-4
.
Here are some example subgraphs for reference: