クックブック > Arweaveでのサブグラフ構築

Arweaveでのサブグラフ構築

Reading time: 11 min

Arweave support in Graph Node and on Subgraph Studio is in beta: please reach us on Discord with any questions about building Arweave subgraphs!

このガイドでは、Arweaveブロックチェーンのインデックスを作成するためのサブグラフの構築とデプロイ方法について学びます。

Arweaveとは?

このセクションへのリンク

Arweave プロトコルは、開発者がデータを永久に保存することを可能にし、それが Arweave と IPFS の主な違いです。IPFSは永続性に欠ける一方、Arweaveに保存されたファイルは変更も削除もできません。

Arweaveは既に、さまざまなプログラミング言語でプロトコルを統合するための多数のライブラリを構築しています。詳細については、次を確認できます。

  • Arwiki
  • Arweaveリソース

Arweaveサブグラフとは?

このセクションへのリンク

グラフを使用すると、「サブグラフ」と呼ばれるカスタムのオープン API を構築できます。サブグラフは、を使用していつでもクエリできるようにするために、インデクサー (サーバー オペレーター) に、ブロックチェーンでインデックスを作成してサーバーに保存するデータを伝えるために使用されます。 GraphQL

Graph Node は、Arweave プロトコルでデータをインデックス化できるようになりました。現在の統合は、Arweave をブロックチェーン (ブロックとトランザクション) としてインデックス付けするだけで、保存されたファイルにはまだインデックス付けしていません。

Arweave サブグラフの作成

このセクションへのリンク

Arweaveのサブグラフを構築し展開できるようにするためには、2つのパッケージが必要です。

  1. @graphprotocol/graph-cli version 0.30.2以降 - サブグラフの構築と展開を行うコマンドラインツールです。ここをクリックし、npmを使用してダウンロードしてください。
  2. @graphprotocol/graph-ts version 0.27.0以降 - サブグラフに特化した型のライブラリです。こちらをクリックして、npmでダウンロードしてください。

サブグラフのコンポーネント

このセクションへのリンク

サブグラフには3つの構成要素があります:

1. マニフェスト - subgraph.yaml

このセクションへのリンク

対象のデータ ソースとその処理方法を定義します。 Arweave は新しい種類のデータ ソースです。

2. スキーマ - schema.graphql

このセクションへのリンク

ここでは、GraphQL を使用してサブグラフにインデックスを付けた後にクエリできるようにするデータを定義します。これは実際には API のモデルに似ており、モデルはリクエスト本文の構造を定義します。

Arweaveサブグラフの要件は、existing documentationに網羅されています。

3. アセンブリスクリプトマッピング - mapping.ts

このセクションへのリンク

これは、リスニングしているデータソースと誰かがやりとりするときに、データをどのように取得し、保存するかを決定するロジックです。データは変換され、あなたがリストアップしたスキーマに基づいて保存されます。

サブグラフの開発には 2 つの重要なコマンドがあります:

$ graph codegen # マニフェストで識別されたようにファイルから型を生成します
$ グラフ ビルド # AssemblyScript ファイルから Web アセンブリを生成し、/build フォルダにすべてのサブグラフ ファイルを準備します

サブグラフ マニフェスト定義

このセクションへのリンク

サブグラフ マニフェスト subgraph.yaml は、サブグラフのデータ ソース、関心のあるトリガー、およびこれらのトリガーに応答して実行される関数を識別します。Arweaveサブグラフのサブグラフ マニフェストの例については、以下を参照してください:

specVersion: 0.0.5
description: Arweave Blocks Indexing
schema:
file: ./schema.graphql # link to the schema file
dataSources:
- kind: arweave
name: arweave-blocks
network: arweave-mainnet # The Graph only supports Arweave Mainnet
source:
owner: 'ID-OF-AN-OWNER' # The public key of an Arweave wallet
startBlock: 0 # set this to 0 to start indexing from chain genesis
mapping:
apiVersion: 0.0.5
language: wasm/assemblyscript
file: ./src/blocks.ts # link to the file with the Assemblyscript mappings
entities:
- Block
- Transaction
blockHandlers:
- handler: handleBlock # the function name in the mapping file
transactionHandlers:
- 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の構成要素であり、エンドユーザーによって作成されるオブジェクトです。

Note: Irys (previously Bundlr) transactions are not supported yet.

スキーマの定義は、結果として得られるサブグラフ・データベースの構造と、エンティティ間の関係を記述する。これは、元のデータソースに依存しません。スキーマ定義の詳細は、こちらにあります。

AssemblyScript マッピング

このセクションへのリンク

イベントを処理するハンドラは、AssemblyScript で記述されています。

Arweaveのインデックス作成は、AssemblyScript APIにArweave固有のデータ型を導入しています。

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 サブグラフのマッピングの記述と非常に似ています。詳細については、こちらをクリックしてください。

Deploying an Arweave Subgraph in Subgraph Studio

このセクションへのリンク

Once your subgraph has been created on your Subgraph Studio dashboard, you can deploy by using the graph deploy CLI command.

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

Arweaveサブグラフのクエリ

このセクションへのリンク

ArweaveサブグラフのGraphQLエンドポイントは、スキーマ定義によって決定され、既存のAPIインタフェースが使用されます。詳細はGraphQL API documentationを参照してください。

参考までにサブグラフの例を紹介します:

サブグラフは Arweave やその他のチェーンにインデックスを付けることができますか?

このセクションへのリンク

いいえ、サブグラフは 1 つのチェーン/ネットワークのデータソースのみをサポートします。

保存されたファイルをArweaveでインデックス化することはできますか?

このセクションへのリンク

現在、The Graph は Arweave をブロックチェーン (ブロックとトランザクション) としてのみインデックス化しています。

自分のサブグラフにあるBundlrバンドルは特定できるのか?

このセクションへのリンク

現在はサポートされていません。

トランザクションを特定のアカウントにフィルターするにはどうすればよいですか?

このセクションへのリンク

Source.ownerには、ユーザの公開鍵またはアカウントアドレスを指定することができます。

現在の暗号化フォーマットは?

このセクションへのリンク

通常、データはバイトとしてマッピングに渡され、直接格納されている場合はサブグラフに hex 形式で返されます (例: ブロックおよびトランザクション ハッシュ). あなたはAに変換したいかもしれません base64 or 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でのサブグラフ構築
グラフティングでコントラクトを取り替え、履歴を残す
ページを編集