Создание Субграфов на Arweave
Reading time: 6 min
Поддержка Arweave в Graph Node и Subgraph Studio находится в стадии бета-тестирования: обращайтесь к нам в , если у Вас возникнут вопросы о создании субграфов Arweave!
Из этого руководства Вы узнаете, как создавать и развертывать субграфы для индексации блокчейна Arweave.
Протокол Arweave позволяет разработчикам хранить данные на постоянной основе, и в этом основное различие между Arweave и IPFS, поскольку в IPFS отсутствует функция постоянства, а файлы, хранящиеся в Arweave, не могут быть изменены или удалены.
Arweave уже создала множество библиотек для интеграции протокола на нескольких различных языках программирования. С дополнительной информацией Вы можете ознакомиться:
The Graph позволяет Вам создавать пользовательские открытые API, называемые "Subgraphs". Субграфы используются для указания индексаторами (операторам серверов), какие данные индексировать в блокчейне и сохранять на их серверах, чтобы Вы могли запросить их в любое время, используя .
теперь может индексировать данные по протоколу Arweave. Текущая интеграция только индексирует Arweave как блокчейн (блоки и транзакции), но пока еще не индексирует сохраненные файлы.
Чтобы иметь возможность создавать и развертывать Субграфы на Arweave, Вам понадобятся два пакета:
@graphprotocol/graph-cli
выше версии 0.30.2 - это инструмент командной строки для построения и развертывания субграфов. , чтобы загрузить с помощьюnpm
.@graphprotocol/graph-ts
выше версии 0.27.0 - это библиотека типов, специфичных для субграфов. , чтобы загрузить с помощьюnpm
.
Существует 3 компонента субграфа:
Определяет источники данных, представляющие интерес, и то, как они должны обрабатываться. Arweave - это новый вид источника данных.
Здесь Вы определяете, какие данные хотите иметь возможность запрашивать после индексации своего субграфа с помощью GraphQL. На самом деле это похоже на модель для API, где модель определяет структуру тела запроса.
Требования к субграфам Airweave описаны в .
Это логика, которая определяет, как данные должны извлекаться и храниться, когда кто-то взаимодействует с источниками данных, которые Вы отслеживаете. Данные переводятся и сохраняются в соответствии с указанной Вами схемой.
Во время разработки субграфа есть две ключевые команды:
$ graph codegen # генерирует типы из файла схемы, указанного в манифесте$ graph build # генерирует Web Assembly из файлов AssemblyScript и подготавливает все файлы субграфа в папке /build
Манифест субграфа subgraph.yaml
определяет источники данных для субграфа, представляющие интерес триггеры и функции, которые должны выполняться в ответ на эти триггеры. Ниже приведен пример манифеста субграфа для субграфа Arweave:
specVersion: 0.0.5description: Arweave Blocks Indexingschema:file: ./schema.graphql # ссылка на файл схемыdataSources:- kind: arweavename: arweave-blocksnetwork: arweave-mainnet # The Graph поддерживает только Arweave Mainnetsource:owner: 'ID-OF-AN-OWNER' # Открытый ключ кошелька ArweavestartBlock: 0 # установите это значение на 0, чтобы начать индексацию с генезиса чейнаmapping:apiVersion: 0.0.5language: wasm/assemblyscriptfile: ./src/blocks.ts # ссылка на файл с мэппингами Assemblyscriptentities:- Block- TransactionblockHandlers:- 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, и они представляют собой объекты, созданные конечными пользователями.
Определение схемы описывает структуру результирующей базы данных субграфа и взаимосвязи между объектами. Это не зависит от исходного источника данных. Более подробная информация об определении схемы субграфа приведена .
Обработчики событий написаны на .
Индексация Arweave вводит типы данных, специфичные для Arweave, в .
class Block {timestamp: u64lastRetarget: u64height: u64indepHash: Bytesnonce: BytespreviousBlock: Bytesdiff: Byteshash: BytestxRoot: Bytestxs: Bytes[]walletList: BytesrewardAddr: Bytestags: Tag[]rewardPool: BytesweaveSize: BytesblockSize: BytescumulativeDiff: ByteshashListMerkle: Bytespoa: ProofOfAccess}class Transaction {format: u32id: ByteslastTx: Bytesowner: Bytestags: Tag[]target: Bytesquantity: Bytesdata: BytesdataSize: BytesdataRoot: Bytessignature: Bytesreward: Bytes}
Обработчики блоков получают Block
, в то время как транзакции получают Transaction
.
Написание мэппингов субграфа Arweave очень похоже на написание мэппингов субграфа Ethereum. Для получения дополнительной информации нажмите .
После создания субграфа на панели управления Subgraph Studio его можно развернуть с помощью команды CLI graph Deploy
.
graph deploy --studio --access-token <your-access-token>
Конечная точка GraphQL для субграфов Arweave устанавливается определением схемы с помощью существующего интерфейса API. Пожалуйста, посетите для получения дополнительной информации.
Ниже приведен пример субграфа для справки:
Нет, субграф может поддерживать источники данных только из одного чейна/сети.
В настоящее время The Graph индексирует Arweave только как блокчейн (его блоки и транзакции).
В настоящее время это не поддерживается.
Source.owner может быть открытым ключом пользователя или адресом учетной записи.
Данные обычно передаются в мэппинги в виде Байтов, которые при непосредственном сохранении возвращаются в субграф в формате hex
(например, хэши блоков и транзакций). Возможно, Вы захотите преобразовать в безопасный формат base64
или base64 URL
в своих мэппингах, чтобы они соответствовали тому, что отображается в обозревателях блоков, таких, как .
Можно использовать следующую вспомогательную функцию 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 writeresult += alphabet[bytes[i - 2] >> 2];result += alphabet[(bytes[i - 2] & 0x03) << 4];if (!urlSafe) {result += "==";}}if (!urlSafe && i === l) { // 2 octets yet to writeresult += 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;}