Construção de Subgraphs na NEAR
Reading time: 9 min
Este guia é uma introdução à construção de subgraphs a indexar contratos inteligentes na .
O é uma plataforma de contratos inteligentes para a construção de aplicativos descentralizados. Visite a para mais informações.
Os programadores do The Graph recebem ferramentas para processar eventos em blockchain e disponibilizar facilmente os dados resultantes através de uma API GraphQL, conhecida individualmente como um subgraph. O agora é capaz de processar eventos no NEAR, significando que programadores na NEAR agora podem construir subgraphs para indexar seus contratos inteligentes.
Subgraphs são baseados em eventos; quer dizer, eles esperam e então processam eventos on-chain. Atualmente há dois tipos de handlers que funcionam para subgraphs no NEAR:
- Handlers de blocos: executados em todos os blocos novos
- Handlers de recibos: Executados sempre que uma mensagem é executada numa conta especificada
Um Recibo é o único objeto acionável no sistema. Quando falamos de "processar uma transação" na plataforma NEAR, em algum ponto isto eventualmente significa "aplicar recibos".
@graphprotocol/graph-cli
é uma ferramenta de linha de comando para a construção e lançamento de subgraphs.
@graphprotocol/graph-ts
é uma biblioteca de tipos específicos a subgraphs.
O desenvolvimento de subgraphs no NEAR exige o graph-cli
acima da versão 0.23.0
, e o graph-ts
acima da versão 0.23.0
.
Construir um subgraph NEAR é um processo muito parecido com a construção de um subgraph que indexa o Ethereum.
Há três aspectos de definição de subgraph:
subgraph.yaml: o manifest do subgraph, que define as fontes de dados de interesse e como elas devem ser processadas. A NEAR é uma nova espécie (kind
) de fonte de dados.
schema.graphql: um arquivo schema que define quais dados são armazenados para o seu subgraph, e como consultá-los via GraphQL. Os requerimentos para subgraphs no NEAR são cobertos pela .
Mapeamentos do AssemblyScript: que traduz dos dados do evento às entidades definidas no seu schema. O apoio à NEAR introduz tipos de dados específicos ao NEAR e uma nova funcionalidade de análise de JSON.
Existem dois comandos importantes durante o desenvolvimento de um subgraph:
$ graph codegen # gera tipos do arquivo de schema identificado no manifest$ graph build # gera Web Assembly dos arquivos AssemblyScript, e prepara todos os arquivos do subgraph em uma pasta /build
O manifest do subgraph (subgraph.yaml
) identifica as fontes de dados ao subgraph, os gatilhos de interesse, e as funções que devem ser executadas em resposta a tais gatilhos. Veja abaixo um exemplo de manifest de subgraph para um subgraph na NEAR:
specVersion: 0.0.2schema:file: ./src/schema.graphql # link para o arquivo de schemadataSources:- kind: nearnetwork: near-mainnetsource:account: app.good-morning.near # Esta fonte de dados monitorará esta contastartBlock: 10662188 # Necessário para a NEARmapping:apiVersion: 0.0.5language: wasm/assemblyscriptblockHandlers:- handler: handleNewBlock # nome da função no arq. de mapeamentoreceiptHandlers:- handler: handleReceipt # nome da função no arq. de mapeamentofile: ./src/mapping.ts # link ao arq. com os mapeamentos de Assemblyscript
- Subgraphs na NEAR introduzem um novo tipo (
kind
) de fonte de dados (near
) - A rede (
network
) deve corresponder a uma rede no Graph Node hospedeiro. No Subgraph Studio, a mainnet do NEAR énear-mainnet
, e a testnet énear-testnet
- Fontes de dados no NEAR introduzem um campo
source.account
opcional: um ID legível a humanos que corresponde a uma . Isto pode ser uma conta ou subconta. - Fontes de dados na NEAR introduzem um campo
source.accounts
opcional, que contém sufixos e prefixos opcionais. No mínimo, deve ser especificado o prefixo ou o sufixo, já que eles procurarão qualquer conta que comece ou termine com a lista respectiva de valores. Combinaria o exemplo abaixo:[app|good].*[morning.near|morning.testnet]
. Se só for necessária uma lista de prefixos ou sufixos, o outro campo pode ser omitido.
accounts:prefixes:- app- goodsuffixes:- morning.near- morning.testnet
As fontes de dados na NEAR apoiam duas categorias de handlers:
blockHandlers
: executado em cada novo bloco na NEAR. Não é necessário nenhumsource.account
.receiptHandlers
: executados em todo recibo onde osource.account
da fonte de dados é o recipiente. Note que só são processadas combinações exatas ( devem ser adicionadas como fontes de dados independentes).
A definição do schema descreve a estrutura do banco de dados do subgraph resultante e os relacionamentos entre entidades. Isto é agnóstico da fonte de dados original. Mais detalhes na definição do schema de subgraph .
Os handlers para o processamento de eventos são escritos em .
A indexação da NEAR introduz categorias de dados específicas à plataforma ao .
class ExecutionOutcome {gasBurnt: u64,blockHash: Bytes,id: Bytes,logs: Array<string>,receiptIds: Array<Bytes>,tokensBurnt: BigInt,executorId: string,}class ActionReceipt {predecessorId: string,receiverId: string,id: CryptoHash,signerId: string,gasPrice: BigInt,outputDataReceivers: Array<DataReceiver>,inputDataIds: Array<CryptoHash>,actions: Array<ActionValue>,}class BlockHeader {height: u64,prevHeight: u64,// Always zero when version < V3epochId: Bytes,nextEpochId: Bytes,chunksIncluded: u64,hash: Bytes,prevHash: Bytes,timestampNanosec: u64,randomValue: Bytes,gasPrice: BigInt,totalSupply: BigInt,latestProtocolVersion: u32,}class ChunkHeader {gasUsed: u64,gasLimit: u64,shardId: u64,chunkHash: Bytes,prevBlockHash: Bytes,balanceBurnt: BigInt,}class Block {author: string,header: BlockHeader,chunks: Array<ChunkHeader>,}class ReceiptWithOutcome {outcome: ExecutionOutcome,receipt: ActionReceipt,block: Block,}
Estes tipos são repassados para handlers de blocos e recibos:
- Handlers de blocos receberão um
Block
- Handlers de recibos receberão um
ReceiptWithOutcome
Caso contrário, o resto da está à disposição dos programadores de subgraph no Near, durante a execução dos mapeamentos.
Isto inclui uma nova função de análise em JSON: logs na NEAR são frequentemente emitidos como JSONs em string. A nova função json.fromString(...)
está disponível como parte da para que programadores processem estes logs com facilidade.
Quando tiver um subgraph pronto, chegará a hora de lançá-lo no Graph Node para indexar. Subgraphs na NEAR podem ser lançados em qualquer Graph Node >=v0.26.x
(esta versão ainda não foi marcada ou lançada).
O Subgraph Studio e o Indexador de atualização na Graph Network apoiam atualmente a indexação da mainnet e da testnet do NEAR em beta, com os seguintes nomes de rede:
near-mainnet
near-testnet
Saiba mais sobre a criação e lançamento de subgraphs no Subgraph Studio .
Para começo de conversa, o primeiro passo consiste em "criar" o seu subgraph - isto só precisa ser feito uma vez. No Subgraph Studio, isto pode ser feito do : "Criar um subgraph".
Quando o seu subgraph estiver pronto, lance o seu subgraph com o comando de CLI graph deploy
:
$ graph create --node <graph-node-url> <subgraph-name> # cria um subgraph num Graph Node local (no Subgraph Studio, isto é feito via a interface)$ graph deploy --node <graph-node-url> --ipfs https://api.thegraph.com/ipfs/ <subgraph-name> # envia os arquivos de construção a um endpoint IPFS especificado, e depois edita o subgraph a um Graph Node especificado com base no hash IPFS do manifest
A configuração do nódulo dependerá de onde o subgraph será lançado.
graph auth --studiograph deploy --studio <subgraph-name>
graph deploy --node http://localhost:8020/ --ipfs http://localhost:5001 <subgraph-name>
Quando o seu subgraph for lançado, ele será indexado pelo Graph Node. O seu progresso pode ser conferido com um query no próprio subgraph:
{_meta {block {number}}}
Executar um Graph Node que indexa a NEAR exige estes requisitos opcionais:
- NEAR Indexer Framework (Estrutura de Indexer) com instrumentação Firehose
- Componente(s) de Firehose no NEAR
- Graph Node com endpoint Firehose configurado
Em breve, falaremos mais sobre como executar os componentes acima.
O endpoint da GraphQL para subgraphs na NEAR é determinado pela definição do schema, com a interface existente da API. Mais informações na .
Aqui estão alguns exemplos de subgraphs para referência:
O apoio à NEAR está em beta; podem ocorrer mais mudanças na API enquanto continuamos a melhorar a integração. Por favor, contacte-nos em para podermos apoiar-te na construção de subgraphs no NEAR e avisar-te sobre os acontecimentos mais recentes!
Não, um subgraph só pode apoiar fontes de dados de apenas uma chain/rede.
Atualmente, só há apoio a gatilhos de Blocos e Recibos. Estamos a investigar gatilhos para chamadas de função a uma conta específica. Também temos interesse em apoiar gatilhos de eventos, quando a NEAR receber apoio nativo a eventos.
Se uma conta (account
) for especificada, ela só combinará com o nome exacto da conta. É possível corresponder subcontas ao especificar um campo accounts
, com sufixos (suffixes
) e prefixos (prefixes
) particularizados para encontrar contas e subcontas. Por exemplo, todas as subcontas mintbase1.near
seriam encontradas com o seguinte:
accounts:suffixes:- mintbase1.near
Não há apoio a isto. Estamos a avaliar se esta funcionalidade é necessária para indexação.
Não há apoio a isto no momento. Estamos a avaliar se esta funcionalidade é necessária para indexação.
Subgraphs no Ethereum apoiam versões "pendentes" e "atuais". Como posso lançar uma versão "pendente" de um subgraph no NEAR?
No momento, não há apoio à funcionalidade de pendências para subgraphs na NEAR. Entretanto, podes lançar uma nova versão para um subgraph de "nome" diferente, e quando este for sincronizado com a cabeça da chain, podes relançá-la para seu subgraph de "nome" primário, que usará o mesmo ID de lançamento subjacente — e aí, o subgraph principal sincronizará instantaneamente.
A minha pergunta não foi respondida. Onde posso conseguir mais ajuda sobre construir subgraphs na NEAR?
Se esta for uma pergunta geral sobre desenvolvimento de subgraphs, há mais informações no resto da . Caso contrário, entre no e pergunte no canal #near, ou mande a sua pergunta para .