Cookbook > Construindo Subgraphs no Arweave

Construindo Subgraphs no Arweave

Reading time: 7 min

O apoio ao Arweave no Graph Node e no Subgraph Studio está em beta: por favor nos contacte no Discord se tiver dúvidas sobre a construção de subgraphs no Arweave!

Neste guia, você aprenderá como construir e lançar Subgraphs para indexar a blockchain Arweave.

O que é o Arweave?

Link para esta seção

O protocolo Arweave permite que programadores armazenem dados permanentemente. Esta é a grande diferença entre o Arweave e o IPFS, considerando que o IPFS não tem esta característica; a permanência, e os arquivos armazenados no Arweave, não podem ser mudados ou apagados.

O Arweave já construiu várias bibliotecas para integrar o protocolo num número de línguas de programação diferentes. Para mais informações, pode-se conferir:

  • Arwiki
  • Arweave Resources

O que são Subgraphs no Arweave?

Link para esta seção

The Graph lhe permite construir APIs abertas e customizadas chamadas "Subgraphs". Subgraphs são usados para contar aos indexadores (operadores de servidor) quais dados devem ser indexados em uma blockchain e salvar em seus servidores para que você possa consultá-la a qualquer hora usando o GraphQL.

O Graph Node é atualmente capaz de indexar dados no protocolo Arweave. A integração atual indexa apenas o Arweave como uma blockchain (blocos e transações), mas não indexa os arquivos armazenados no momento.

Construindo um Subgraph no Arweave

Link para esta seção

Para construir e lançar Subgraphs no Arweave, são necessários dois pacotes:

  1. @graphprotocol/graph-cli acima da versão 0.30.2 — Esta é uma ferramenta de linha de comandos para a construção e lançamento de subgraphs. Clique aqui para baixá-la usando o npm.
  2. @graphprotocol/graph-ts acima da versão 0.07.2 — Esta é uma biblioteca de tipos específicos a subgraphs. Clique aqui para baixar usando o npm.

Os componentes de um subgraph

Link para esta seção

Um subgraph tem três componentes:

1. Manifest - subgraph.yaml

Link para esta seção

Define as fontes de dados de interesse, e como elas devem ser processadas. O Arweave é uma nova categoria de fontes de dados.

2. Schema - schema.graphql

Link para esta seção

Aqui é possível definir quais dados queres consultar após indexar o seu subgraph utilizando o GraphQL. Isto é como um modelo para uma API, onde o modelo define a estrutura de um órgão de requisito.

Os requerimentos para subgraphs no Arweave são cobertos pela documentação existente.

3. Mapeamentos de AssemblyScript - mapping.ts

Link para esta seção

Esta é a lógica que determina como os dados devem ser retirados e armazenados quando alguém interage com as fontes de dados que estás a escutar. Os dados são traduzidos e armazenados baseados no schema que listaste.

Durante o desenvolvimento de um subgraph, existem dois comandos importantes:

$ 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

Definição do Manifest do Subgraph

Link para esta seção

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 um manifest de subgraph para um subgraph no Arweave:

specVersion: 0.0.5
description: Arweave Blocks Indexing
schema:
file: ./schema.graphql # link ao arquivo schema
dataSources:
- kind: arweave
name: arweave-blocks
network: arweave-mainnet # The Graph apoia apenas a Mainnet do Arweave
source:
owner: 'ID-OF-AN-OWNER' # A chave pública de uma carteira no Arweave
startBlock: 0 # coloque isto como 0 para começar a indexar da gênese da chain
mapping:
apiVersion: 0.0.5
language: wasm/assemblyscript
file: ./src/blocks.ts # link ao arquivo com os mapeamentos no Assemblyscript
entities:
- Block
- Transaction
blockHandlers:
- handler: handleBlock # o nome da função no arquivo de mapeamento
transactionHandlers:
- handler: handleTx # o nome da função no arquivo de mapeamento
  • Subgraphs no Arweave introduzem uma nova categoria de fonte de dados (arweave)
  • A rede deve corresponder a uma rede no Graph Node que a hospeda. No Subgraph Studio, a mainnet do Arweave é arweave-mainnet
  • Fontes de dados no Arweave introduzem um campo source.owner opcional, a chave pública de uma carteira no Arweave

Fontes de dados no Arweave apoiam duas categorias de handlers:

  • blockHandlers - Executar em cada bloco novo no Arweave. Nenhum source.owner é exigido.
  • transactionHandlers — Executar em todas as transações onde o source.owner da fonte de dados é o dono. Atualmente, um dono é exigido para o transactionHandlers; caso utilizadores queiram processar todas as transações, eles devem providenciar "" como o source.owner

O source.owner pode ser o endereço do dono, ou sua Chave Pública.

Transações são os blocos de construção da permaweb do Arweave, além de serem objetos criados para utilizadores finais.

Nota: Transações no Irys (antigo Bundlr) não são apoiadas presentemente.

Definição de Schema

Link para esta seção

A definição de Schema descreve a estrutura do banco de dados resultado do subgraph, e os relacionamentos entre entidades. Isto é agnóstico da fonte de dados original. Há mais detalhes na definição de schema de subgraph aqui.

Mapeamentos de AssemblyScript

Link para esta seção

Os handlers para eventos de processamento são escritos em AssemblyScript.

O indexing do Arweave introduz categorias de dados específicas ao Arweave ao API do AssemblyScript.

class Block {
timestamp: u64
lastRetarget: u64
height: u64
indepHash: Bytes
nonce: Bytes
previousBlock: Bytes
diff: Bytes
hash: Bytes
txRoot: Bytes
txs: Bytes[]
walletList: Bytes
rewardAddr: Bytes
tags: Tag[]
rewardPool: Bytes
weaveSize: Bytes
blockSize: Bytes
cumulativeDiff: Bytes
hashListMerkle: Bytes
poa: ProofOfAccess
}
class Transaction {
format: u32
id: Bytes
lastTx: Bytes
owner: Bytes
tags: Tag[]
target: Bytes
quantity: Bytes
data: Bytes
dataSize: Bytes
dataRoot: Bytes
signature: Bytes
reward: Bytes
}

Handlers de bloco recebem um Block, enquanto transações recebem uma Transaction.

Escrever os mapeamentos de um Subgraph no Arweave é muito similar à escrita dos mapeamentos de um Subgraph no Ethereum. Para mais informações, clique aqui.

Como lançar um Subgraph no Arweave ao Subgraph Studio

Link para esta seção

Após criar o seu Subgraph no painel de controlo do Subraph Studio, você pode lançá-lo com o código de linha de comando graph deploy.

graph deploy --studio --access-token <your-access-token>

Consultando um Subgraph no Arweave

Link para esta seção

O ponto final do GraphQL para subgraphs no Arweave é determinado pela definição do schema, com a interface existente da API. Visite a documentação da API da GraphQL para mais informações.

Exemplos de Subgraphs

Link para esta seção

Aqui está um exemplo de subgraph para referência:

Perguntas Frequentes

Link para esta seção

Um subgraph pode indexar o Arweave e outras chains?

Link para esta seção

Não, um subgraph só pode apoiar fontes de dados de apenas uma chain/rede.

Posso indexar os arquivos armazenados no Arweave?

Link para esta seção

Atualmente, The Graph apenas indexa o Arweave como uma blockchain (seus blocos e transações).

Posso identificar pacotes do Bundlr em meu subgraph?

Link para esta seção

Isto não é apoiado no momento.

Como posso filtrar transações para uma conta específica?

Link para esta seção

O source.owner pode ser a chave pública ou o endereço da conta do utilizador.

Qual é o formato atual de encriptação?

Link para esta seção

Os dados são geralmente passados aos mapeamentos como Bytes, que se armazenados diretamente, são retornados ao subgraph em um formato hex (por ex. hashes de transações e blocos). Você pode querer convertê-lo a um formato seguro em base64 ou base64 URL em seus mapeamentos, para combinar com o que é exibido em exploradores de blocos, como o Arweave Explorer.

A seguinte função bytesToBase64(bytes: Uint8Array, urlSafe: boolean): string pode ser usada, e será adicionada ao graph-ts:

const base64Alphabet = [
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"
];
const base64UrlAlphabet = [
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "_"
];
function bytesToBase64(bytes: Uint8Array, urlSafe: boolean): string {
let alphabet = urlSafe? base64UrlAlphabet : base64Alphabet;
let result = '', i: i32, l = bytes.length;
for (i = 2; i < l; i += 3) {
result += alphabet[bytes[i - 2] >> 2];
result += alphabet[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];
result += alphabet[((bytes[i - 1] & 0x0F) << 2) | (bytes[i] >> 6)];
result += alphabet[bytes[i] & 0x3F];
}
if (i === l + 1) { // 1 octet yet to write
result += alphabet[bytes[i - 2] >> 2];
result += alphabet[(bytes[i - 2] & 0x03) << 4];
if (!urlSafe) {
result += "==";
}
}
if (!urlSafe && i === l) { // 2 octets yet to write
result += alphabet[bytes[i - 2] >> 2];
result += alphabet[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];
result += alphabet[(bytes[i - 1] & 0x0F) << 2];
if (!urlSafe) {
result += "=";
}
}
return result;
}
Editar página

Anterior
Construção de Subgraphs no Cosmos
Próximo
Como Substituir um Contrato e Manter a sua História com Enxertos
Editar página