ザ・グラフ(GRT)実際に触って試そう!サンプルコード紹介
ザ・グラフ(The Graph, GRT)は、ブロックチェーンデータをインデックス化し、クエリ可能なAPIを提供する分散型プロトコルです。これにより、開発者はブロックチェーン上のデータを効率的に取得し、dApps(分散型アプリケーション)の構築を加速できます。本稿では、GRTの基本的な概念から、実際に触れて試すためのサンプルコードの紹介まで、詳細に解説します。
1. ザ・グラフとは?
ブロックチェーンは、その性質上、データの取得が困難な場合があります。特に、複雑なクエリを実行する場合、ノード全体をスキャンする必要があり、時間とリソースを消費します。ザ・グラフは、この問題を解決するために設計されました。GRTは、ブロックチェーンのイベントや状態変化を監視し、これらのデータをGraphQL形式でインデックス化します。GraphQLは、クライアントが必要なデータのみを要求できるクエリ言語であり、効率的なデータ取得を可能にします。
1.1. GRTの構成要素
GRTは、以下の主要な構成要素で構成されています。
- Indexer: ブロックチェーンデータを読み込み、GraphQLスキーマに基づいてインデックス化するノード。
- Graph Node: Indexerを管理し、GraphQL APIを提供するノード。
- GraphQL API: クライアントがクエリを実行するためのインターフェース。
- Subgraph: ブロックチェーンデータのインデックス化方法を定義するマニフェストファイル。
1.2. Subgraphの役割
Subgraphは、GRTの中核となる概念です。Subgraphは、以下の情報を含みます。
- スキーマ定義: GraphQLスキーマを定義します。
- データソース: ブロックチェーンのコントラクトアドレスとABI(Application Binary Interface)を指定します。
- マッピング: ブロックチェーンのイベントや状態変化をGraphQLエンティティに変換するロジックを記述します。
2. GRTのセットアップ
GRTを実際に使用するには、いくつかのセットアップが必要です。
2.1. 必要なツール
- Node.js: GRTのCLIツールを実行するために必要です。
- npmまたはYarn: GRTのパッケージをインストールするために必要です。
- Graph Node: ローカルまたはリモートでGraph Nodeを実行する必要があります。
- GanacheまたはHardhat: ローカルのブロックチェーン環境を構築するために使用できます。
2.2. Graph CLIのインストール
以下のコマンドを使用して、Graph CLIをインストールします。
npm install -g @graphprotocol/graph-cli
2.3. ローカルGraph Nodeの起動
Graph CLIを使用して、ローカルGraph Nodeを起動します。
graph node
3. サンプルコード紹介
ここでは、Ethereumブロックチェーン上のERC20トークンのトランザクションをインデックス化する簡単なSubgraphのサンプルコードを紹介します。
3.1. Subgraphマニフェスト (subgraph.yaml)
apiVersion: 0.0.1
kind: subgraph
runtime:
version: '0.0.1'
target: 'wasm'
dataSources:
- kind: ethereum
name: ERC20
network: mainnet
source:
address: '0xdAC17F958D2ee523a2206206994597C13D831ec7'
abi: |
[{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
entities:
- kind: ERC20Transfer
fields:
id: type_string!
from: type_address!
to: type_address!
amount: type_uint256!
blockNumber: type_uint256!
events:
- kind: ERC20TransferEvent
name: Transfer
handler: handleTransfer
mappings:
handleTransfer:
kind: ethereum
handlers:
- event: ERC20.Transfer(from, to, amount)
handler: handleTransferEvent
3.2. マッピングファイル (src/mappings.ts)
import { ERC20TransferEvent } from "../generated/ERC20";
import { ERC20Transfer } from "../generated/schema";
export function handleTransferEvent(event: ERC20TransferEvent):
void {
let transfer = new ERC20Transfer(
event.transaction.hash.toHex() + "-" + event.logIndex.toString()
);
transfer.from = event.params.from;
transfer.to = event.params.to;
transfer.amount = event.params.amount;
transfer.blockNumber = event.block.number;
transfer.save();
}
3.3. スキーマファイル (schema.graphql)
type ERC20Transfer @entity {
id: ID!
from: Address!
to: Address!
amount: BigInt!
blockNumber: BigInt!
}
4. Subgraphのデプロイとクエリ
4.1. Subgraphのデプロイ
Subgraphをデプロイするには、以下のコマンドを使用します。
graph create my-erc20-subgraph
graph add my-erc20-subgraph subgraph.yaml
graph deploy my-erc20-subgraph --ipfs
4.2. GraphQL APIへのクエリ
Subgraphがデプロイされると、GraphQL APIが提供されます。このAPIを使用して、インデックス化されたデータをクエリできます。例えば、ERC20トークンのすべてのトランザクションを取得するには、以下のクエリを使用します。
query {
eRC20Transfers {
id
from
to
amount
blockNumber
}
}
5. GRTの応用例
GRTは、様々なdAppsの構築に役立ちます。
- DeFi: DEX(分散型取引所)の取引履歴、レンディングプロトコルの貸付履歴などをインデックス化し、分析ツールやポートフォリオ管理ツールを提供できます。
- NFT: NFTの所有権、取引履歴などをインデックス化し、NFTマーケットプレイスやコレクション管理ツールを提供できます。
- ゲーム: ゲーム内のイベント、プレイヤーの行動などをインデックス化し、ゲーム分析ツールやリーダーボードを提供できます。
6. まとめ
ザ・グラフ(GRT)は、ブロックチェーンデータのインデックス化とクエリを効率的に行うための強力なツールです。Subgraphを使用することで、開発者はブロックチェーンデータを簡単に取得し、dAppsの構築を加速できます。本稿では、GRTの基本的な概念から、サンプルコードの紹介、応用例までを解説しました。GRTを活用することで、ブロックチェーン技術の可能性をさらに広げることができるでしょう。今後のGRTの発展と、それによって生まれる新たなdAppsの登場に期待が高まります。GRTは、ブロックチェーンエコシステムの重要なインフラストラクチャとして、今後ますます重要な役割を担っていくと考えられます。