Cookbook > Создание Субграфов на Arweave

Создание Субграфов на Arweave

Reading time: 6 min

Поддержка Arweave в Graph Node и Subgraph Studio находится в стадии бета-тестирования: обращайтесь к нам в Discord, если у Вас возникнут вопросы о создании субграфов Arweave!

Из этого руководства Вы узнаете, как создавать и развертывать субграфы для индексации блокчейна Arweave.

Что такое Arweave?

Ссылка на этот раздел

Протокол Arweave позволяет разработчикам хранить данные на постоянной основе, и в этом основное различие между Arweave и IPFS, поскольку в IPFS отсутствует функция постоянства, а файлы, хранящиеся в Arweave, не могут быть изменены или удалены.

Arweave уже создала множество библиотек для интеграции протокола на нескольких различных языках программирования. С дополнительной информацией Вы можете ознакомиться:

  • Arwiki
  • Ресурсы Arweave

Что такое субграфы Arweave?

Ссылка на этот раздел

The Graph позволяет Вам создавать пользовательские открытые API, называемые "Subgraphs". Субграфы используются для указания индексаторами (операторам серверов), какие данные индексировать в блокчейне и сохранять на их серверах, чтобы Вы могли запросить их в любое время, используя GraphQL.

Graph Node теперь может индексировать данные по протоколу Arweave. Текущая интеграция только индексирует Arweave как блокчейн (блоки и транзакции), но пока еще не индексирует сохраненные файлы.

Построение Субграфа на Arweave

Ссылка на этот раздел

Чтобы иметь возможность создавать и развертывать Субграфы на Arweave, Вам понадобятся два пакета:

  1. @graphprotocol/graph-cli выше версии 0.30.2 - это инструмент командной строки для построения и развертывания субграфов. Нажмите здесь, чтобы загрузить с помощью npm.
  2. @graphprotocol/graph-ts выше версии 0.27.0 - это библиотека типов, специфичных для субграфов. Нажмите здесь, чтобы загрузить с помощью npm.

Составляющие Субграфов

Ссылка на этот раздел

Существует 3 компонента субграфа:

1. Манифест - subgraph.yaml

Ссылка на этот раздел

Определяет источники данных, представляющие интерес, и то, как они должны обрабатываться. Arweave - это новый вид источника данных.

2. Схема - schema.graphql

Ссылка на этот раздел

Здесь Вы определяете, какие данные хотите иметь возможность запрашивать после индексации своего субграфа с помощью GraphQL. На самом деле это похоже на модель для API, где модель определяет структуру тела запроса.

Требования к субграфам Airweave описаны в существующей документации.

3. Мэппинги AssemblyScript - mapping.ts

Ссылка на этот раздел

Это логика, которая определяет, как данные должны извлекаться и храниться, когда кто-то взаимодействует с источниками данных, которые Вы отслеживаете. Данные переводятся и сохраняются в соответствии с указанной Вами схемой.

Во время разработки субграфа есть две ключевые команды:

$ graph codegen # генерирует типы из файла схемы, указанного в манифесте
$ graph build # генерирует Web Assembly из файлов AssemblyScript и подготавливает все файлы субграфа в папке /build

Определение манифеста Субграфа

Ссылка на этот раздел

Манифест субграфа subgraph.yaml определяет источники данных для субграфа, представляющие интерес триггеры и функции, которые должны выполняться в ответ на эти триггеры. Ниже приведен пример манифеста субграфа для субграфа Arweave:

specVersion: 0.0.5
description: Arweave Blocks Indexing
schema:
file: ./schema.graphql # ссылка на файл схемы
dataSources:
- kind: arweave
name: arweave-blocks
network: arweave-mainnet # The Graph поддерживает только Arweave Mainnet
source:
owner: 'ID-OF-AN-OWNER' # Открытый ключ кошелька Arweave
startBlock: 0 # установите это значение на 0, чтобы начать индексацию с генезиса чейна
mapping:
apiVersion: 0.0.5
language: wasm/assemblyscript
file: ./src/blocks.ts # ссылка на файл с мэппингами Assemblyscript
entities:
- Block
- Transaction
blockHandlers:
- handler: handleBlock # имя функции в файле мэппинга
transactionHandlers:
- handler: handleTx # имя функции в файле мэппинга
  • Субграфы Arweave представляют новый вид источника данных (arweave)
  • Сеть должна соответствовать сети на хостинге Graph Node. В Subgraph Studio основной сетью Arweave является arweave-mainnet
  • Источники данных Arweave содержат необязательное поле source.owner, которое является открытым ключом кошелька Arweave

Источники данных Arweave поддерживают два типа обработчиков:

  • blockHandlers - запускаются на каждом новом блоке Arweave. Не требуется source.owner.
  • transactionHandlers - запускаются при каждой транзакции, в которой источник данных source.owner является владельцем. В настоящее время для transactionHandlers требуется владелец, если пользователи хотят обрабатывать все транзакции, они должны указать "" в качестве source.owner

Source.owner может быть адресом владельца или его Публичным ключом.

Транзакции являются строительными блоками Arweave permaweb, и они представляют собой объекты, созданные конечными пользователями.

Примечание: Транзакции Irys (ранее Bundlr) пока не поддерживаются.

Определение схемы

Ссылка на этот раздел

Определение схемы описывает структуру результирующей базы данных субграфа и взаимосвязи между объектами. Это не зависит от исходного источника данных. Более подробная информация об определении схемы субграфа приведена здесь.

Мэппинги AssemblyScript

Ссылка на этот раздел

Обработчики событий написаны на AssemblyScript.

Индексация Arweave вводит типы данных, специфичные для Arweave, в AssemblyScript API.

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
}

Обработчики блоков получают Block, в то время как транзакции получают Transaction.

Написание мэппингов субграфа Arweave очень похоже на написание мэппингов субграфа Ethereum. Для получения дополнительной информации нажмите здесь.

Развертывание субграфа Arweave в Subgraph Studio

Ссылка на этот раздел

После создания субграфа на панели управления Subgraph Studio его можно развернуть с помощью команды CLI graph Deploy.

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

Запрос субграфа Arweave

Ссылка на этот раздел

Конечная точка GraphQL для субграфов Arweave устанавливается определением схемы с помощью существующего интерфейса API. Пожалуйста, посетите документацию GraphQL API для получения дополнительной информации.

Примеры субграфов

Ссылка на этот раздел

Ниже приведен пример субграфа для справки:

Часто задаваемые вопросы

Ссылка на этот раздел

Может ли субграф индексировать Arweave и другие чейны?

Ссылка на этот раздел

Нет, субграф может поддерживать источники данных только из одного чейна/сети.

Могу ли я проиндексировать сохраненные файлы в Arweave?

Ссылка на этот раздел

В настоящее время The Graph индексирует Arweave только как блокчейн (его блоки и транзакции).

Могу ли я идентифицировать связки Bundle в своем субграфе?

Ссылка на этот раздел

В настоящее время это не поддерживается.

Как я могу отфильтровать транзакции по определенному аккаунту?

Ссылка на этот раздел

Source.owner может быть открытым ключом пользователя или адресом учетной записи.

Каков текущий формат шифрования?

Ссылка на этот раздел

Данные обычно передаются в мэппинги в виде Байтов, которые при непосредственном сохранении возвращаются в субграф в формате hex (например, хэши блоков и транзакций). Возможно, Вы захотите преобразовать в безопасный формат base64 или base64 URL в своих мэппингах, чтобы они соответствовали тому, что отображается в обозревателях блоков, таких, как Arweave Explorer.

Можно использовать следующую вспомогательную функцию bytesToBase64(bytes: Uint8Array, urlSafe: boolean): string, которая будет добавлена в 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;
}
Редактировать страницу

Предыдущий
Создание субграфов на Cosmos
Следующий
Замените контракт и сохраните его историю с помощью Grafting
Редактировать страницу