Arweaveでのサブグラフ構築
Reading time: 10 min
Arweave support in Graph Node and on Subgraph Studio is in beta: please reach us on with any questions about building Arweave subgraphs!
このガイドでは、Arweaveブロックチェーンのインデックスを作成するためのサブグラフの構築とデプロイ方法について学びます。
Arweave プロトコルは、開発者がデータを永久に保存することを可能にし、それが Arweave と IPFS の主な違いです。IPFSは永続性に欠ける一方、Arweaveに保存されたファイルは変更も削除もできません。
Arweaveは既に、さまざまなプログラミング言語でプロトコルを統合するための多数のライブラリを構築しています。詳細については、次を確認できます。
グラフを使用すると、「サブグラフ」と呼ばれるカスタムのオープン API を構築できます。サブグラフは、を使用していつでもクエリできるようにするために、インデクサー (サーバー オペレーター) に、ブロックチェーンでインデックスを作成してサーバーに保存するデータを伝えるために使用されます。 。
は、Arweave プロトコルでデータをインデックス化できるようになりました。現在の統合は、Arweave をブロックチェーン (ブロックとトランザクション) としてインデックス付けするだけで、保存されたファイルにはまだインデックス付けしていません。
Arweaveのサブグラフを構築し展開できるようにするためには、2つのパッケージが必要です。
@graphprotocol/graph-cli
version 0.30.2以降 - サブグラフの構築と展開を行うコマンドラインツールです。し、npm
を使用してダウンロードしてください。@graphprotocol/graph-ts
version 0.27.0以降 - サブグラフに特化した型のライブラリです。して、npm
でダウンロードしてください。
サブグラフには3つの構成要素があります:
対象のデータ ソースとその処理方法を定義します。 Arweave は新しい種類のデータ ソースです。
ここでは、GraphQL を使用してサブグラフにインデックスを付けた後にクエリできるようにするデータを定義します。これは実際には API のモデルに似ており、モデルはリクエスト本文の構造を定義します。
これは、リスニングしているデータソースと誰かがやりとりするときに、データをどのように取得し、保存するかを決定するロジックです。データは変換され、あなたがリストアップしたスキーマに基づいて保存されます。
サブグラフの開発には 2 つの重要なコマンドがあります:
$ graph codegen # マニフェストで識別されたようにファイルから型を生成します$ グラフ ビルド # AssemblyScript ファイルから Web アセンブリを生成し、/build フォルダにすべてのサブグラフ ファイルを準備します
サブグラフ マニフェスト subgraph.yaml
は、サブグラフのデータ ソース、関心のあるトリガー、およびこれらのトリガーに応答して実行される関数を識別します。Arweaveサブグラフのサブグラフ マニフェストの例については、以下を参照してください:
specVersion: 0.0.5description: Arweave Blocks Indexingschema:file: ./schema.graphql # link to the schema filedataSources:- kind: arweavename: arweave-blocksnetwork: arweave-mainnet # The Graph only supports Arweave Mainnetsource:owner: 'ID-OF-AN-OWNER' # The public key of an Arweave walletstartBlock: 0 # set this to 0 to start indexing from chain genesismapping:apiVersion: 0.0.5language: wasm/assemblyscriptfile: ./src/blocks.ts # link to the file with the Assemblyscript mappingsentities:- Block- TransactionblockHandlers:- handler: handleBlock # the function name in the mapping filetransactionHandlers:- handler: handleTx # the function name in the mapping file
- Arweave サブグラフは新しい種類のデータ ソースを導入します (
arweave
) - The network should correspond to a network on the hosting Graph Node. In Subgraph Studio, Arweave's mainnet is
arweave-mainnet
- Arweave データ ソースには、オプションの source.owner フィールドが導入されています。これは、Arweave ウォレットの公開鍵です。
Arweaveデータソースは 2 種類のハンドラーをサポートしています:
blockHandlers
- すべての新しいArweaveブロックに対して実行されます。source.ownerは必要ありません。transactionHandlers
- データ ソースのsource.owner
が所有者であるすべてのトランザクションで実行されます。現在、transactionHandlers
には所有者が必要です。ユーザーがすべてのトランザクションを処理したい場合は、source.owner
として "" を指定する必要があります。
Source.owner は、所有者のアドレスまたは公開鍵にすることができます。
トランザクションはArweave permawebの構成要素であり、エンドユーザーによって作成されるオブジェクトです。
スキーマの定義は、結果として得られるサブグラフ・データベースの構造と、エンティティ間の関係を記述する。これは、元のデータソースに依存しません。スキーマ定義の詳細は、にあります。
Arweave indexing introduces Arweave-specific data types to the .
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 サブグラフのマッピングの記述と非常に似ています。詳細については、をクリックしてください。
Once your subgraph has been created on your Subgraph Studio dashboard, you can deploy by using the graph deploy
CLI command.
graph deploy --access-token <your-access-token>
ArweaveサブグラフのGraphQLエンドポイントは、スキーマ定義によって決定され、既存のAPIインタフェースが使用されます。詳細はを参照してください。
参考までにサブグラフの例を紹介します:
いいえ、サブグラフは 1 つのチェーン/ネットワークのデータソースのみをサポートします。
現在、The Graph は Arweave をブロックチェーン (ブロックとトランザクション) としてのみインデックス化しています。
現在はサポートされていません。
Source.ownerには、ユーザの公開鍵またはアカウントアドレスを指定することができます。
通常、データはバイトとしてマッピングに渡され、直接格納されている場合はサブグラフに hex
形式で返されます (例: ブロックおよびトランザクション ハッシュ). あなたはAに変換したいかもしれません base64
or 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;}