ザ・グラフ(GRT)のAPIを使ったデータ取得実例集
ザ・グラフ(The Graph)は、ブロックチェーンデータをインデックス化し、効率的なデータアクセスを可能にする分散型プロトコルです。GraphQLインターフェースを通じて、開発者は複雑なブロックチェーンデータを簡単にクエリできます。本稿では、ザ・グラフのAPIを活用したデータ取得の実例を、具体的なシナリオを交えながら詳細に解説します。対象読者は、ブロックチェーン開発者、データアナリスト、およびザ・グラフの活用に関心のある技術者です。
1. ザ・グラフの基本概念
ザ・グラフは、Subgraphsと呼ばれるデータソースを定義し、それらをインデックス化することで機能します。Subgraphsは、スマートコントラクトのイベントや状態変化を監視し、関連データをGraphQLスキーマに変換します。このスキーマは、開発者がクエリを実行するためのインターフェースを提供します。ザ・グラフのアーキテクチャは、以下の要素で構成されます。
- GraphQL API: データへのアクセスポイント。
- Subgraphs: ブロックチェーンデータのインデックス化定義。
- Indexer: Subgraphsをインデックス化するノード。
- Graph Node: GraphQL APIを提供するノード。
ザ・グラフの利用には、Hosted Serviceを利用する方法と、Self-Hosted Nodeを運用する方法があります。Hosted Serviceは、ザ・グラフ財団が提供するサービスであり、手軽に利用できます。Self-Hosted Nodeは、より柔軟な運用が可能ですが、インフラの管理が必要となります。
2. データ取得環境の構築
ザ・グラフのAPIを利用するには、まずGraphQLクライアントが必要です。JavaScript、Python、Javaなど、様々な言語でGraphQLクライアントが利用可能です。ここでは、JavaScriptのApollo Clientを用いた環境構築を例に説明します。
npm install @apollo/client graphql
次に、ザ・グラフのAPIエンドポイントを設定します。Hosted Serviceを利用する場合は、以下のエンドポイントを使用します。
https://api.thegraph.com/subgraphs/name/{subgraph_name}
{subgraph_name}は、利用するSubgraphsの名前で置き換えます。例えば、EthereumのERC20トークンの情報を取得するSubgraphsの名前は、’ethereum/erc20’です。
3. 実例1: Ethereumのブロック情報取得
Ethereumのブロック情報を取得する例です。ブロックのハッシュ値、ブロック番号、タイムスタンプなどを取得できます。
import { ApolloClient, gql } from '@apollo/client';
const client = new ApolloClient({
uri: 'https://api.thegraph.com/subgraphs/name/blocklytics/ethereum-blocks',
});
const GET_BLOCKS = gql`
query GetBlocks {
blocks(first: 10) {
id
number
timestamp
}
}
`;
client
.query({ query: GET_BLOCKS })
.then(data => {
console.log(data.data.blocks);
});
このコードは、’blocklytics/ethereum-blocks’ Subgraphsに対して、直近10個のブロック情報をクエリしています。クエリ結果は、ブロックのID、ブロック番号、タイムスタンプの配列としてコンソールに出力されます。
4. 実例2: ERC20トークンの取引履歴取得
ERC20トークンの取引履歴を取得する例です。トークンのコントラクトアドレス、送信者アドレス、受信者アドレス、取引量などを取得できます。
import { ApolloClient, gql } from '@apollo/client';
const client = new ApolloClient({
uri: 'https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2',
});
const GET_TRANSACTIONS = gql`
query GetTransactions($tokenAddress: String!) {
tokenTransfers(where: { token: $tokenAddress }, first: 10) {
id
from
to
value
timestamp
}
}
`;
const tokenAddress = '0xdac17f958d2ee523a2206206994597c13d831ec7'; // USDTのコントラクトアドレス
client
.query({ query: GET_TRANSACTIONS, variables: { tokenAddress } })
.then(data => {
console.log(data.data.tokenTransfers);
});
このコードは、’uniswap/uniswap-v2′ Subgraphsに対して、USDTトークンの取引履歴をクエリしています。クエリ結果は、取引のID、送信者アドレス、受信者アドレス、取引量、タイムスタンプの配列としてコンソールに出力されます。
5. 実例3: NFTの所有者情報取得
NFTの所有者情報を取得する例です。NFTのコントラクトアドレス、トークンID、所有者アドレスなどを取得できます。
import { ApolloClient, gql } from '@apollo/client';
const client = new ApolloClient({
uri: 'https://api.thegraph.com/subgraphs/name/ensdomains/mainnet-nft',
});
const GET_NFT_OWNERS = gql`
query GetNftOwners($contractAddress: String!, $tokenId: String!) {
nft(id: $contractAddress + '-' + $tokenId) {
owner
tokenUri
}
}
`;
const contractAddress = '0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d'; // CryptoPunksのコントラクトアドレス
const tokenId = '1';
client
.query({ query: GET_NFT_OWNERS, variables: { contractAddress, tokenId } })
.then(data => {
console.log(data.data.nft);
});
このコードは、’ensdomains/mainnet-nft’ Subgraphsに対して、CryptoPunksのNFTの所有者情報をクエリしています。クエリ結果は、所有者アドレスとトークンURIとしてコンソールに出力されます。
6. 高度なクエリテクニック
ザ・グラフのGraphQL APIは、様々なクエリテクニックをサポートしています。以下に、いくつかの例を示します。
- フィルタリング:
where句を使用して、特定の条件に合致するデータのみを取得できます。 - ソート:
orderBy句を使用して、取得したデータを特定のフィールドでソートできます。 - ページネーション:
first、skip、before、afterオプションを使用して、大量のデータを分割して取得できます。 - エイリアス:
aliasキーワードを使用して、クエリ結果のフィールド名を変更できます。
これらのテクニックを組み合わせることで、複雑なデータ取得要件に対応できます。
7. エラーハンドリングとパフォーマンス
ザ・グラフのAPIを利用する際には、エラーハンドリングとパフォーマンスに注意する必要があります。エラーハンドリングについては、GraphQLクライアントのエラーオブジェクトを適切に処理し、エラーメッセージをログに出力することが重要です。パフォーマンスについては、不要なフィールドをクエリしない、適切なフィルタリングを行う、ページネーションを利用するなどの対策を講じることが有効です。
8. まとめ
本稿では、ザ・グラフのAPIを活用したデータ取得の実例を、具体的なシナリオを交えながら詳細に解説しました。ザ・グラフは、ブロックチェーンデータのインデックス化と効率的なデータアクセスを可能にする強力なツールです。本稿で紹介した内容を参考に、ザ・グラフを活用して、様々なブロックチェーンアプリケーションを開発してください。ザ・グラフの可能性は無限大であり、今後の発展が期待されます。継続的な学習と実践を通じて、ザ・グラフの活用スキルを向上させることが重要です。