Cosmosでのサブグラフ構築
Reading time: 10 min
このガイドは、Cosmosベースのブロックチェーンをインデックスするサブグラフの構築について紹介するものです。
Graph は、ブロックチェーンのイベントを処理し、その結果得られたデータを GraphQL API を介して簡単に利用できるようにするためのツールを開発者に提供するもので、個別にはサブグラフとして知られています。Graph Nodeが Cosmosイベントを処理できるようになったということは、Cosmosの開発者がスマートコントラクトの指標となるサブグラフを構築できるようになったということです。
Cosmosのサブグラフでサポートされているハンドラーは4種類あります。
- ブロックハンドラーは、新しいブロックがチェーンに追加されるたびに実行されます。
- イベントハンドラーは、特定のイベントが発生したときに実行されます。
- トランザクションハンドラーは、トランザクションが発生したときに実行されます。
- メッセージハンドラーは、特定のメッセージが発生したときに実行されます。
Cosmosの公式ドキュメントに基づきます。
イベントは、アプリケーションの実行に関する情報を含むオブジェクトです。これらは主にブロックエクスプローラやウォレットなどのサービスプロバイダが、様々なメッセージやインデックストランザクションの実行を追跡するために使用されます。
トランザクションは、アプリケーションの状態変化を引き起こすためにエンドユーザーが作成するオブジェクトです。
メッセージはモジュール固有のオブジェクトで、属するモジュールのスコープ内で状態遷移を引き起こします。
ブロックハンドラーでは全てのデータにアクセスできますが、その他のハンドラーでは、サブグラフの開発者がよりきめ細かくデータを処理することができます。
graph-cliは、サブグラフの構築とデプロイのためのCLIツールです。Cosmosサブグラフを扱うには、バージョン>=0.30.0
が必要です。
graph-tsはサブグラフに特化した型のライブラリで、Cosmosのサブグラフを扱うにはバージョン>=0.27.0
が必要です。
サブグラフの定義には、3つの重要な部分があります。
subgraph.yaml: サブグラフのマニフェストを含むYAMLファイルで、追跡するイベントとその処理方法を特定します。
schema.graphql: サブグラフにどのようなデータが保存されているか、また GraphQL を使ってどのようにクエリを行うかを定義します。
AssemblyScript Mappingsです。AssemblyScript ブロックチェーンデータからスキーマで定義されたエンティティに変換するコードです。
サブグラフ マニフェスト (subgraph.yaml
) は、サブグラフのデータ ソース、関心のあるトリガー、およびこれらのトリガーに応答して実行される関数 (handlers
) を特定します。Cosmos サブグラフのサブグラフ マニフェストの例については、以下を参照してください。
specVersion: 0.0.5description: Cosmos Subgraph Exampleschema:file: ./schema.graphql # link to the schema filedataSources:- kind: cosmosname: CosmosHubnetwork: cosmoshub-4 # This will change for each cosmos-based blockchain. In this case, the example uses the Cosmos Hub mainnet.source:startBlock: 0 # Required for Cosmos, set this to 0 to start indexing from chain genesismapping:apiVersion: 0.0.7language: wasm/assemblyscriptblockHandlers:- handler: handleNewBlock # the function name in the mapping fileeventHandlers:- event: rewards # the type of the event that will be handledhandler: handleReward # the function name in the mapping filetransactionHandlers:- handler: handleTransaction # the function name in the mapping filemessageHandlers:- message: /cosmos.staking.v1beta1.MsgDelegate # the type of a messagehandler: handleMsgDelegate # the function name in the mapping filefile: ./src/mapping.ts # link to the file with the Assemblyscript mappings
- Cosmos subgraphs introduce a new
kind
of data source (cosmos
). ネットワーク
は、Cosmosエコシステム内のチェーンに対応する必要があります。この例では、Cosmos Hub mainnetが使用されています。
スキーマの定義は、結果として得られるサブグラフ・データベースの構造と、エンティティ間の関係を記述する。これは、元のデータソースに依存しません。スキーマ定義の詳細は、こちらにあります。
イベントを処理するためのハンドラはAssemblyScriptで書かれています。
Cosmosインデックスでは、Cosmos特有のデータ型をAssemblyScript APIに導入しています。
class Block {header: Headerevidence: EvidenceListresultBeginBlock: ResponseBeginBlockresultEndBlock: ResponseEndBlocktransactions: Array<TxResult>validatorUpdates: Array<Validator>}class EventData {event: Eventblock: HeaderOnlyBlocktx: TransactionContext}class TransactionData {tx: TxResultblock: HeaderOnlyBlock}class MessageData {message: Anyblock: HeaderOnlyBlocktx: TransactionContext}class TransactionContext {hash: Bytesindex: u32code: u32gasWanted: i64gasUsed: i64}class HeaderOnlyBlock {header: Header}class Header {version: ConsensuschainId: stringheight: u64time: TimestamplastBlockId: BlockIDlastCommitHash: BytesdataHash: BytesvalidatorsHash: BytesnextValidatorsHash: BytesconsensusHash: BytesappHash: ByteslastResultsHash: BytesevidenceHash: BytesproposerAddress: Byteshash: Bytes}class TxResult {height: u64index: u32tx: Txresult: ResponseDeliverTxhash: Bytes}class Event {eventType: stringattributes: Array<EventAttribute>}class Any {typeUrl: stringvalue: Bytes}
各ハンドラタイプは独自のデータ構造を持ち、マッピング関数の引数として渡されます。
- ブロックハンドラーは、
Block
を受け取ります. - イベントハンドラーは、
EventData
を受け取ります. - トランザクションハンドラーは、
TransactionData
を受け取ります. - メッセージハンドラーは、
MassageData
を受け取ります.
MessageData
の一部として、メッセージハンドラは、メッセージを包含するトランザクションに関する最も重要な情報を含む、トランザクションコンテキストを受け取ります。トランザクションコンテキストはEventData
型でも利用できますが、対 応するイベントがトランザクションと関連付けられている場合に限ります。さらに、すべてのハンドラはブロック(HeaderOnlyBlock
) への参照を受け取ります。
Cosmos統合の全種類一覧はこちらで確認できます。
Cosmosのメッセージはチェーンに固有であり、シリアル化されたProtocol Buffersペイロードの形でサブグラフに渡されることに注意することが重要です。その結果、メッセージデータは処理される前にマッピング関数でデコードされる必要があります。
サブグラフ内のメッセージ データをデコードする方法の例は、ここにあります。
サブグラフ マッピングの記述を開始する前の最初のステップは、サブグラフ スキーマ ファイル (schema.graphql
) で定義されたエンティティに基づいて型バインディングを生成することです。これにより、マッピング関数がそれらのタイプの新しいオブジェクトを作成し、ストアに保存できるようになります。これは、codegen
CLI コマンドを使用して行います。
$ graph codegen
マッピングの準備ができたら、サブグラフをビルドする必要があります。このステップでは、マニフェストまたはマッピングにある可能性のあるエラーがハイライトされます。グラフノードにデプロイするためには、サブグラフを正常にビルドする必要があります。これは build
CLI コマンドを使用して行うことができます。
$ graph build
サブグラフを作成したら、graph create
CLIコマンドを実行した後、graph deploy
CLIコマンドを使用してサブグラフをデプロイすることができます。
ホストされたサービス
グラフ作成アカウント/サブグラフ名 -製品ホスティングサービス
グラフ展開アカウント/サブグラフ名 -製品ホスティングサービス
ローカルのグラフノード(デフォルトの設定に基づく):
グラフ作成サブグラフ名 --ノード http://localhost:8020
グラフ展開サブグラフ名 --ノード http://localhost:8020/ --ipfs http://localhost:5001
CosmosサブグラフのGraphQLエンドポイントは、スキーマ定義によって決定され、既存のAPIインタフェースが使用されます。詳細はGraphQL API documentationを参照してください。
Cosmos Hubブロックチェーンは、Cosmosエコシステムの中で最初のブロックチェーンとなります。詳しくは公式ドキュメントをご覧ください。
Cosmos Hubのメインネットはcosmoshub-4
です。コスモスハブの現在のテストネットはtheta-testnet-001
です。
その他のCosmos Hubネットワーク、すなわちcosmoshub-3
は停止しているため、データは提供されていません。
グラフノードとホスティングサービスにおけるOsmosisのサポートはベータ版です。Osmosisサブグラフの構築に関するご質問は、The Graphチームまでお問い合わせください。
Osmosis は、Cosmos SDK の上に構築された分散型のクロスチェーン自動マーケット メーカー (AMM) プロトコルです。 IBC対応のトークンを取引します。詳細については、公式ドキュメントをご覧ください。
Osmosisメインネットはosmosis-1
です。現在のテストネットは osmo-test-4
です。
参考までにサブグラフの例を紹介します: