ザ・グラフ(GRT)を使ったスマートコントラクトの開発手順
ブロックチェーン技術の進化に伴い、分散型アプリケーション(DApps)の開発はますます複雑化しています。DAppsは、オンチェーンデータへの効率的なアクセスを必要としますが、従来のブロックチェーンデータへのクエリは、コストと速度の面で課題を抱えています。この課題を解決するために、ザ・グラフ(The Graph)が登場しました。ザ・グラフは、ブロックチェーンデータをインデックス化し、GraphQLを通じて効率的にクエリできるようにする分散型プロトコルです。本稿では、ザ・グラフを用いてスマートコントラクトを開発する手順を詳細に解説します。
1. ザ・グラフの概要
ザ・グラフは、ブロックチェーンデータを整理し、クエリ可能な形式に変換するインデックス作成プロトコルです。従来のデータベースと同様の機能を提供しますが、分散型であり、検閲耐性を持つ点が特徴です。ザ・グラフは、以下の主要なコンポーネントで構成されています。
- Subgraph: ブロックチェーンの特定のデータセットを記述する定義ファイルです。Subgraphは、どのイベントをインデックス化し、どのようにデータを構造化するかを定義します。
- Indexer: Subgraphを読み込み、ブロックチェーンデータをインデックス化するノードです。Indexerは、GraphQLクエリへの応答を生成するために、インデックス化されたデータを保存します。
- GraphQL API: インデックス化されたデータにアクセスするためのインターフェースです。GraphQL APIは、クライアントが特定のデータを効率的にクエリできるようにします。
ザ・グラフを使用することで、DApps開発者は、オンチェーンデータへのアクセスを大幅に改善し、より効率的でスケーラブルなアプリケーションを構築できます。
2. 開発環境の準備
ザ・グラフを使ったスマートコントラクト開発を開始するには、以下の開発環境を準備する必要があります。
- Node.jsとnpm: ザ・グラフのツールはNode.js上で動作します。Node.jsとnpm(Node Package Manager)をインストールしてください。
- Graph CLI: ザ・グラフのコマンドラインインターフェースです。以下のコマンドでインストールできます。
npm install -g @graphprotocol/graph-cli - GanacheまたはHardhat: ローカルのブロックチェーン環境を構築するために使用します。
- テキストエディタまたはIDE: Subgraph定義ファイルの作成と編集に使用します。
3. スマートコントラクトの準備
ザ・グラフでインデックス化するスマートコントラクトを準備します。ここでは、シンプルなERC20トークンコントラクトを例として使用します。ERC20トークンコントラクトは、トークンの名前、シンボル、および総供給量を定義し、トークンの転送を処理します。コントラクトのABI(Application Binary Interface)は、ザ・グラフがコントラクトのイベントを理解するために必要です。
4. Subgraphの定義
Subgraphを定義するには、以下の3つの主要なファイルを作成する必要があります。
- schema.graphql: インデックス化するデータのスキーマを定義します。GraphQLの型定義言語を使用して、エンティティとイベントの型を定義します。
- mapping.ts: ブロックチェーンのイベントをGraphQLエンティティにマッピングするロジックを記述します。TypeScriptを使用して、イベントハンドラを実装します。
- graph.yaml: Subgraphの構成ファイルを定義します。コントラクトのアドレス、イベント、およびデータソースを指定します。
4.1 schema.graphqlの作成
schema.graphqlファイルでは、インデックス化するデータの型を定義します。ERC20トークンコントラクトの場合、以下のエンティティとイベントを定義できます。
- Token: トークンの情報を格納するエンティティです。名前、シンボル、および総供給量を属性として持ちます。
- Transfer: トークンの転送イベントを格納するエンティティです。送信者、受信者、および転送量を属性として持ちます。
schema.graphqlファイルの例:
type Token @entity {
id: ID!
name: String!
symbol: String!
totalSupply: BigInt!
}
type Transfer @entity {
id: ID!
from: String!
to: String!
value: BigInt!
blockNumber: BigInt!
transactionHash: String!
}
4.2 mapping.tsの作成
mapping.tsファイルでは、ブロックチェーンのイベントをGraphQLエンティティにマッピングするロジックを記述します。ERC20トークンコントラクトの場合、Transferイベントを監視し、Transferエンティティを作成します。TypeScriptを使用して、イベントハンドラを実装します。
mapping.tsファイルの例:
import { Transfer } from "../generated/schema";
import { Transfer as TransferEvent } from "../generated/ERC20";
export function handleTransfer(event: TransferEvent):
void {
let transfer = new Transfer(
event.transaction.hash.toHex() + "-" + event.logIndex.toString()
);
transfer.from = event.params.from.toHex();
transfer.to = event.params.to.toHex();
transfer.value = event.params.value;
transfer.blockNumber = event.block.number;
transfer.transactionHash = event.transaction.hash.toHex();
transfer.save();
}
4.3 graph.yamlの作成
graph.yamlファイルでは、Subgraphの構成ファイルを定義します。コントラクトのアドレス、イベント、およびデータソースを指定します。
graph.yamlファイルの例:
specVersion: '0.20.0'
version: 0.1.0
name: erc20-subgraph
description: A subgraph for ERC20 tokens
repository:
url: https://github.com/your-username/erc20-subgraph
dataSources:
- kind: ethereum
name: ERC20
network: mainnet
source: <コントラクトアドレス>
abis: [
{
name: ERC20
file: ./abis/ERC20.json
}
]
mapping:
kind: ethereum/events
apiVersion: 0.0.7
language: ts
src: ./src/mapping.ts
events:
- kind: Transfer
handler: handleTransfer
コントラクトアドレス>
5. Subgraphのデプロイとクエリ
Subgraphをデプロイするには、以下の手順を実行します。
- Subgraphの初期化:
graph init erc20-subgraphコマンドを実行して、Subgraphプロジェクトを初期化します。 - Subgraphのビルド:
graph buildコマンドを実行して、Subgraphをビルドします。 - Subgraphのデプロイ:
graph deploy --studioコマンドを実行して、SubgraphをGraph Nodeにデプロイします。
Subgraphがデプロイされたら、GraphQL APIを使用してインデックス化されたデータにクエリできます。Graph ExplorerでSubgraphのGraphQL APIにアクセスし、クエリを実行できます。例えば、特定のトークンのすべての転送イベントをクエリするには、以下のGraphQLクエリを使用できます。
query {
transfers(where: {token: "<トークンアドレス>"}) {
id
from
to
value
blockNumber
transactionHash
}
}
トークンアドレス>
6. スマートコントラクトとの連携
ザ・グラフのGraphQL APIを使用して、DAppsからインデックス化されたデータにアクセスできます。DAppsは、GraphQLクライアントライブラリを使用して、GraphQL APIにクエリを送信し、結果を受け取ります。例えば、ReactでDAppsを開発している場合、Apollo ClientなどのGraphQLクライアントライブラリを使用できます。
7. まとめ
本稿では、ザ・グラフを用いてスマートコントラクトを開発する手順を詳細に解説しました。ザ・グラフは、ブロックチェーンデータを効率的にインデックス化し、GraphQLを通じてアクセスできるようにする強力なツールです。ザ・グラフを使用することで、DApps開発者は、オンチェーンデータへのアクセスを大幅に改善し、より効率的でスケーラブルなアプリケーションを構築できます。Subgraphの定義、デプロイ、およびスマートコントラクトとの連携を通じて、ザ・グラフの可能性を最大限に引き出し、革新的なDAppsの開発を加速させましょう。