NEAR でサブグラフを作成する
Reading time: 13 min
このガイドは、上のスマートコントラクトを索引するサブグラフを構築するための入門書です。
is a smart contract platform for building decentralized applications. Visit the for more information.
Graph は、ブロックチェーンのイベントを処理し、その結果得られたデータを GraphQL API を介して簡単に利用できるようにするためのツールを開発者に提供するもので、個別にはサブグラフとして知られています。が NEAR イベントを処理できるようになったということは、NEAR の開発者がスマートコントラクトの指標となるサブグラフを構築できるようになったということです。
サブグラフはイベントベースなので、チェーン上のイベントをリッスンしてから処理します。現在、NEAR サブグラフでサポートされているハンドラーは 2 種類あります:
- ブロックハンドラ:新しいブロックごとに実行されます
- レシートハンドラ:指定されたアカウントでメッセージが実行されるたびに実行されます
レシートは、システム内で唯一実行可能なオブジェクトです。NEAR プラットフォームで「トランザクションの処理」といえば、最終的にはどこかの時点で「レシートの適用」を意味します。
@graphprotocol/graph-cli
は、サブグラフを構築・展開するためのコマンドラインツールです。
@graphprotocol/graph-ts
は、サブグラフ固有の型のライブラリです。
NEAR サブグラフの開発には、バージョン0.23.0
以上のgraph-cli
と、バージョン0.23.0
以上のgraph-ts
が必要です。
NEAR サブグラフの構築は、Ethereum のインデックスを作成するサブグラフの構築と非常によく似ています。
サブグラフの定義には 3 つの側面があります:
subgraph.yaml:: サブグラフのマニフェストで、対象となるデータソースとその処理方法を定義します。NEAR は新しい種類
のデータソースです。
schema.graphql:: サブグラフのためにどのようなデータが保存されているか、そして GraphQL を介してどのようにクエリを行うかを定義するスキーマファイル。NEAR サブグラフの要件は、でカバーされています。
AssemblyScript Mappings:: は、イベントデータから、スキーマで定義されたエンティティに変換するコードです。NEAR サポートでは、NEAR 固有のデータタイプと、新しい JSON パース機能が導入されています。
サブグラフの開発には 2 つの重要なコマンドがあります:
$ graph codegen # マニフェストで識別されたようにファイルから型を生成します$ グラフ ビルド # AssemblyScript ファイルから Web アセンブリを生成し、/build フォルダにすべてのサブグラフ ファイルを準備します
サブグラフ マニフェスト (subgraph.yaml
) は、サブグラフのデータ ソース、対象のトリガー、およびそれらのトリガーに応答して実行する必要がある関数を識別します。 NEAR サブグラフのサブグラフ マニフェストの例については、以下を参照してください。
specVersion: 0.0.2schema:file: ./src/schema.graphql # link to the schema filedataSources:- kind: nearnetwork: near-mainnetsource:account: app.good-morning.near # This data source will monitor this accountstartBlock: 10662188 # Required for NEARmapping:apiVersion: 0.0.5language: wasm/assemblyscriptblockHandlers:- handler: handleNewBlock # the function name in the mapping filereceiptHandlers:- handler: handleReceipt # the function name in the mapping filefile: ./src/mapping.ts # link to the file with the Assemblyscript mappings
- NEAR サブグラフは、新しい
種類
のデータソース(near
) を導入する - The
network
should correspond to a network on the hosting Graph Node. On Subgraph Studio, NEAR's mainnet isnear-mainnet
, and NEAR's testnet isnear-testnet
- NEAR data sources introduce an optional
source.account
field, which is a human-readable ID corresponding to a . This can be an account or a sub-account. - NEARのデータソースは、オプションの
source.accounts
フィールドを導入し、オプションのサフィックスとプレフィックスを含んでいます。少なくともプレフィックスまたはサフィックスを指定する必要があり、それぞれ値のリストで始まるまたは終わる任意のアカウントにマッチします。以下の例では、以下のようにマッチします。[app|good].*[morning.near|morning.testnet]
. リストだけが必要な場合は、他のフィールドを省略することができます。
accounts:prefixes:- app- goodsuffixes:- morning.near- morning.testnet
NEAR データソースは 2 種類のハンドラーをサポートしています:
blockHandlers
: 新しい NEAR ブロックごとに実行され、source.account
は必要ありません。receiptHandlers
: run on every receipt where the data source'ssource.account
is the recipient. Note that only exact matches are processed ( must be added as independent data sources).
スキーマの定義は、結果として得られるサブグラフ・データベースの構造と、エンティティ間の関係を記述する。これは、元のデータソースに依存しません。スキーマ定義の詳細は、にあります。
NEAR インデックスは、に NEAR 固有のデータタイプを導入します。
class ExecutionOutcome {gasBurnt: u64,blockHash: Bytes,id: Bytes,logs: Array<string>,receiptIds: Array<Bytes>,tokensBurnt: BigInt,executorId: string,}class ActionReceipt {predecessorId: string,receiverId: string,id: CryptoHash,signerId: string,gasPrice: BigInt,outputDataReceivers: Array<DataReceiver>,inputDataIds: Array<CryptoHash>,actions: Array<ActionValue>,}class BlockHeader {height: u64,prevHeight: u64,// Always zero when version < V3epochId: Bytes,nextEpochId: Bytes,chunksIncluded: u64,hash: Bytes,prevHash: Bytes,timestampNanosec: u64,randomValue: Bytes,gasPrice: BigInt,totalSupply: BigInt,latestProtocolVersion: u32,}class ChunkHeader {gasUsed: u64,gasLimit: u64,shardId: u64,chunkHash: Bytes,prevBlockHash: Bytes,balanceBurnt: BigInt,}class Block {author: string,header: BlockHeader,chunks: Array<ChunkHeader>,}class ReceiptWithOutcome {outcome: ExecutionOutcome,receipt: ActionReceipt,block: Block,}
これらのタイプは、ブロックハンドラとレシートハンドラに渡されます:
- ブロックハンドラーは、
Block
を受け取ります - レシートハンドラーは
ReceiptWithOutcome
を受け取ります
その他、マッピング実行中の NEAR サブグラフ開発者は、 の残りの部分を利用できます。
これには、新しい JSON parsing function が含まれています。NEAR のログは、頻繁に文字列化された JSON として出力されます。新しいjson.fromString(...)
関数は、開発者がこれらのログを簡単に処理できるように、の一部として利用できます。
サブグラフを作成したら、それをインデックス作成のためにグラフ ノードにデプロイします。 NEAR サブグラフは、>=v0.26.x
以降のグラフ ノードにデプロイできます (このバージョンはまだタグ付けされていないか、リリースされていません)。
Subgraph Studio and the upgrade Indexer on The Graph Network currently supports indexing NEAR mainnet and testnet in beta, with the following network names:
near-mainnet
near-testnet
More information on creating and deploying subgraphs on Subgraph Studio can be found .
As a quick primer - the first step is to "create" your subgraph - this only needs to be done once. On Subgraph Studio, this can be done from : "Create a subgraph".
サブグラフが作成されたら、CLI コマンドのgraph deploy
を使ってサブグラフをデプロイすることができます。
$ graph create --node <graph-node-url> <subgraph-name> # creates a subgraph on a local Graph Node (on Subgraph Studio, this is done via the UI)$ graph deploy --node <graph-node-url> --ipfs https://api.thegraph.com/ipfs/ <subgraph-name> # uploads the build files to a specified IPFS endpoint, and then deploys the subgraph to a specified Graph Node based on the manifest IPFS hash
ノードの構成は、サブグラフがどこにディプロイされるかによって異なります。
graph auth --studiograph deploy --studio <subgraph-name>
graph deploy --node http://localhost:8020/ --ipfs http://localhost:5001 <subgraph-name>
デプロイされたサブグラフは、Graph Node によってインデックス化され、その進捗状況は、サブグラフ自体にクエリして確認できます:
{_meta {block {number}}}
NEAR のインデックスを作成するグラフノードの運用には、以下のような運用要件があります:
- NEAR Indexer Framework と Firehose instrumentation
- NEAR Firehose コンポーネント
- Firehose エンドポイントが設定されたグラフノード
上記のコンポーネントの運用については、近日中に詳しくご紹介します。
NEAR サブグラフの GraphQL エンドポイントは、既存の API インターフェイスを用いて、スキーマ定義によって決定されます。詳細は、 をご覧ください。
Here are some example subgraphs for reference:
NEAR サポートはベータ版です。統合の改善を続ける中で、API に変更が加えられる可能性があります。NEAR サブグラフの構築をサポートし、最新の開発状況をお知らせしますので、までメールをお送りください。
いいえ、サブグラフは 1 つのチェーン/ネットワークのデータソースのみをサポートします。
現在、ブロックとレシートのトリガーのみがサポートされています。指定されたアカウントへのファンクションコールのトリガーを検討しています。また、NEAR がネイティブイベントをサポートするようになれば、イベントトリガーのサポートも検討しています。
もしaccount
が指定された場合、それは正確なアカウント名にのみマッチします。accounts
フィールドを指定して、suffixes
と prefixes
でアカウントとサブアカウントにマッチさせることが可能で、例えば、次のようにするとすべての mintbase1.near
サブアカウントにマッチすることになります。
accounts:suffixes:- mintbase1.near
これはサポートされていません。この機能がインデックス作成に必要かどうかを評価しています。
これは現在サポートされていません。この機能がインデックス作成に必要かどうかを評価しています。
「pending」は、NEAR サブグラフではまだサポートされていません。暫定的に、新しいバージョンを別の「named」サブグラフにデプロイし、それがチェーンヘッドと同期したときに、メインの「named」サブグラフに再デプロイすることができます。
もし、サブグラフ開発に関する一般的な質問であれば、に多くの情報があります。それ以外の場合は、に参加し、#nearチャンネルで質問するか、までお寄せください。