7 минуты
Создание Субграфов на Arweave
Поддержка Arweave в Graph Node и Subgraph Studio находится на стадии бета-тестирования: пожалуйста, обращайтесь к нам в Discord с любыми вопросами о создании субграфов Arweave!
Из этого руководства Вы узнаете, как создавать и развертывать субграфы для индексации блокчейна Arweave.
Что такое Arweave?
Протокол Arweave позволяет разработчикам хранить данные на постоянной основе, и в этом основное различие между Arweave и IPFS, поскольку в IPFS отсутствует функция постоянства, а файлы, хранящиеся в Arweave, не могут быть изменены или удалены.
Arweave уже создала множество библиотек для интеграции протокола на нескольких различных языках программирования. С дополнительной информацией Вы можете ознакомиться:
Что такое субграфы Arweave?
The Graph позволяет создавать собственные открытые API, называемые “Субграфами”. Субграфы используются для указания индексаторам (операторам серверов), какие данные индексировать на блокчейне и сохранять на их серверах, чтобы Вы могли запрашивать эти данные в любое время используя GraphQL.
Graph Node теперь может индексировать данные на протоколе Arweave. Текущая интеграция индексирует только Arweave как блокчейн (блоки и транзакции), она еще не индексирует сохраненные файлы.
Построение Субграфа на Arweave
Чтобы иметь возможность создавать и развертывать Субграфы на Arweave, Вам понадобятся два пакета:
@graphprotocol/graph-cliверсии выше 0.30.2 — это инструмент командной строки для создания и развертывания субграфов. Нажмите здесь, чтобы скачать с помощьюnpm.@graphprotocol/graph-tsверсии выше 0.27.0 — это библиотека типов, специфичных для субграфов. Нажмите здесь, чтобы скачать с помощьюnpm.
Составляющие Субграфов
Существует три компонента субграфа:
1. Манифест - subgraph.yaml
Определяет источники данных, представляющие интерес, и то, как они должны обрабатываться. Arweave - это новый вид источника данных.
2. Схема - schema.graphql
Здесь Вы определяете, какие данные хотите иметь возможность запрашивать после индексации своего субграфа с помощью GraphQL. На самом деле это похоже на модель для API, где модель определяет структуру тела запроса.
Требования для субграфов Arweave описаны в существующей документации.
3. Мэппинги на AssemblyScript - mapping.ts
Это логика, которая определяет, как данные должны извлекаться и храниться, когда кто-то взаимодействует с источниками данных, которые Вы отслеживаете. Данные переводятся и сохраняются в соответствии с указанной Вами схемой.
Во время разработки субграфа есть две ключевые команды:
1$ graph codegen # генерирует типы из файла схемы, указанного в манифесте2$ graph build # генерирует Web Assembly из файлов AssemblyScript и подготавливает все файлы субграфа в папке /buildОпределение манифеста субграфа
Манифест субграфа subgraph.yaml идентифицирует источники данных для субграфа, триггеры, представляющие интерес, и функции, которые должны быть выполнены в ответ на эти триггеры. Ниже приведен пример манифеста субграфа для Arweave Subgraph:
1specVersion: 1.3.02description: Arweave Blocks Indexing3schema:4 file: ./schema.graphql # ссылка на файл схемы5dataSources:6 - kind: arweave7 name: arweave-blocks8 network: arweave-mainnet # The Graph поддерживает только Arweave Mainnet9 source:10 owner: 'ID-OF-AN-OWNER' # Открытый ключ кошелька Arweave11 startBlock: 0 # установите это значение на 0, чтобы начать индексацию с генезиса чейна12 mapping:13 apiVersion: 0.0.914 language: wasm/assemblyscript15 file: ./src/blocks.ts # ссылка на файл с мэппингами Assemblyscript16 entities:17 - Block18 - Transaction19 blockHandlers:20 - handler: handleBlock # имя функции в файле мэппинга21 transactionHandlers:22 - handler: handleTx # имя функции в файле мэппинга- Arweave Subgraphs вводят новый тип источника данных (
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 типы данных в [API AssemblyScript](https://thegraph. com/docs/using-graph-ts).
1class Block {2 timestamp: u643 lastRetarget: u644 height: u645 indepHash: Bytes6 nonce: Bytes7 previousBlock: Bytes8 diff: Bytes9 hash: Bytes10 txRoot: Bytes11 txs: Bytes[]12 walletList: Bytes13 rewardAddr: Bytes14 tags: Tag[]15 rewardPool: Bytes16 weaveSize: Bytes17 blockSize: Bytes18 cumulativeDiff: Bytes19 hashListMerkle: Bytes20 poa: ProofOfAccess21}2223class Transaction {24 format: u3225 id: Bytes26 lastTx: Bytes27 owner: Bytes28 tags: Tag[]29 target: Bytes30 quantity: Bytes31 data: Bytes32 dataSize: Bytes33 dataRoot: Bytes34 signature: Bytes35 reward: Bytes36}Обработчики блоков получают Block, в то время как обработчики транзакций получают Transaction.
Написание мэппингов для субграфа Arweave очень похоже на написание мэппингов для субграфа Ethereum. Для получения дополнительной информации нажмите сюда.
Развертывание субграфа Arweave в Subgraph Studio
После того как Ваш субграф был создан на панели управления Subgraph Studio, вы можете развернуть его с помощью команды CLI graph deploy.
1graph deploy --access-token <your-access-token>Запрос субграфа Arweave
Конечная точка GraphQL для Arweave Subgraphs определяется определением схемы, с использованием существующего интерфейса API. Пожалуйста, посетите документацию по GraphQL API для получения дополнительной информации.
Примеры субграфов
Вот пример субграфа для справки:
Часто задаваемые вопросы
Может ли субграф индексировать данные с Arweave и других чейнов?
Нет, субграф может поддерживать источники данных только из одного чейна/сети.
Могу ли я проиндексировать сохраненные файлы в Arweave?
В настоящее время The Graph индексирует Arweave только как блокчейн (его блоки и транзакции).
Могу ли я идентифицировать Bundlr-бандлы в своём субграфе?
В настоящее время это не поддерживается.
Как я могу отфильтровать транзакции по определенному аккаунту?
Source.owner может быть открытым ключом пользователя или адресом учетной записи.
Каков текущий формат шифрования?
Данные обычно передаются в мэппингах в виде байтов, которые, если сохраняются напрямую, возвращаются в субграфе в формате hex (например, хэши блоков и транзакций). Возможно, вам захочется преобразовать их в формат base64 или base64 URL-безопасный в ваших мэппингах, чтобы привести их в соответствие с тем, как они отображаются в эксплорерах блоков, таких как Arweave Explorer.
Следующая вспомогательная функция bytesToBase64(bytes: Uint8Array, urlSafe: boolean): string может быть использована и будет добавлена в graph-ts:
1const base64Alphabet = [2 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",3 "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",4 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",5 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",6 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"7];89const base64UrlAlphabet = [10 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",11 "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",12 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",13 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",14 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "_"15];1617function bytesToBase64(bytes: Uint8Array, urlSafe: boolean): string {18 let alphabet = urlSafe? base64UrlAlphabet : base64Alphabet;1920 let result = '', i: i32, l = bytes.length;21 for (i = 2; i < l; i += 3) {22 result += alphabet[bytes[i - 2] >> 2];23 result += alphabet[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];24 result += alphabet[((bytes[i - 1] & 0x0F) << 2) | (bytes[i] >> 6)];25 result += alphabet[bytes[i] & 0x3F];26 }27 if (i === l + 1) { // 1 octet yet to write28 result += alphabet[bytes[i - 2] >> 2];29 result += alphabet[(bytes[i - 2] & 0x03) << 4];30 if (!urlSafe) {31 result += "==";32 }33 }34 if (!urlSafe && i === l) { // 2 octets yet to write35 result += alphabet[bytes[i - 2] >> 2];36 result += alphabet[((bytes[i - 2] & 0x03) << 4) | (bytes[i - 1] >> 4)];37 result += alphabet[(bytes[i - 1] & 0x0F) << 2];38 if (!urlSafe) {39 result += "=";40 }41 }42 return result;43}