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}