The Graphでサブグラフを作成して、ブロックチェーンデータを取得する方法


###

ブロックチェーンのデータの可視化と分析を手助けするための「The Graph」でサブグラフを作成してみました。

下記ドキュメントを参考に、以下の手順で作成しました。
https://thegraph.com/docs/ja/cookbook/quick-start/

# Graph CLIのインストール

このプロセスを行うためには、まずGraph CLIを使用します。
Graph CLIはJavaScriptで書かれており、npmまたはyarnを使用してインストールできます。
以下のコマンドのいずれかを使用してGraph CLIをインストールできます。

NPMを使用する場合:

```
$ npm install -g @graphprotocol/graph-cli
```

Yarnを使用する場合:
```
$ yarn global add @graphprotocol/graph-cli
```


# サブグラフの作成

サブグラフの作成は、The GraphのStudioで行います。
以下のURLにアクセスし、「Create Subgraph」をクリックしてください。
https://thegraph.com/studio/

# サブグラフの初期化

サブグラフの初期化は以下のコマンドで行います。

```
graph init --studio <SUBGRAPH_SLUG>
```

SUBGRAPH_SLUGの部分は作成したサブグラフのスラッグ名を入力します。
対話式で進んでいくので、指示に従って情報を入力しました。
今回はEthereumネットワークとしてFantom Testnetを選択して、コントラクトアドレスは以下を指定しました。
https://testnet.ftmscan.com/address/0x830AEE0b142F34187e9C286753A06ef17336FbC4

# サブグラフの認証

次に、以下のコマンドを使用してサブグラフを認証します。
デプロイキーはサブグラフのダッシュボードで確認できます。
```
graph auth --studio <DEPLOY_KEY>
```


# ビルドとデプロイ

サブグラフのディレクトリに移動し、以下のコマンドを使用してビルドとデプロイを行います。

```
cd <SUBGRAPH_SLUG>
graph codegen && graph build
graph deploy --studio <SUBGRAPH_SLUG>
```


以上の手順で、The Graphにサブグラフを作成しデプロイすることが可能になります。
デプロイ後、サブグラフがブロックチェーンとの同期を初め、同期状態はサブグラフのダッシュボードで確認できます。
私が実施したときは一時間くらいかかりました。

# データの取得
同期後、PlayGroundにて、クエリを実行し、ブロックチェーンデータを取得しました。

### クエリ
```
{
  # Approvalsエンティティの最初の5件を取得
  approvals(first: 5) {
    id                            # 各承認の一意の識別子
    owner                         # 承認を行ったユーザーのアドレス
    spender                       # オーナーから承認を受けたユーザーのアドレス
    value                         # オーナーがスペンダーに対して承認したトークンの量
  }
  # MinTokensBeforeSwapUpdatedsエンティティの最初の5件を取得
  minTokensBeforeSwapUpdateds(first: 5) {
    id
    minTokensBeforeSwap          # スワップが起こる前の新しい最小トークン量
    blockNumber                  # 更新が行われたブロックの番号
    blockTimestamp               # 更新が行われたブロックのタイムスタンプ
  }
}
```

### メタデータ
```
{
  "data": {
    "approvals": [
      {
        "id": "0x1b6fc0ff854c2db871a3ab1469fbf136b9897d7a0ee19c01a02614f87f8eddc800000000",
        "owner": "0xebe141903cbf95f533d631c6d3f63f4ea1ccda2c",
        "spender": "0x655c5c7c57a397643bb4b201f465a1df40fc5fa3",
        "value": "115792089237316195423570985008687907853269984665640564039457584007913129639935"
      },
      {
        "id": "0x3cc4fc845552fff40068cdf5f63f7586121af79bc2eba7834e8619591774cb2100000000",
        "owner": "0x2c5fe61cb1b239d36aa891177a5ae7b4db999cc1",
        "spender": "0x655c5c7c57a397643bb4b201f465a1df40fc5fa3",
        "value": "115792089237316195423570985008687907853269984665640564039457584007913129639935"
      },
      {
        "id": "0xc4b20dec5aae400e595f8a0ebea8d1046e180b74307c43bd9a993b555931146700000000",
        "owner": "0xebe141903cbf95f533d631c6d3f63f4ea1ccda2c",
        "spender": "0x655c5c7c57a397643bb4b201f465a1df40fc5fa3",
        "value": "115792089237316195423570985008687907853269984665640564039457584007913129639935"
      },
      {
        "id": "0xd5f06c66562165607164906bfaf65dc05d124b871f1156650316c32065a3a40000000000",
        "owner": "0xebe141903cbf95f533d631c6d3f63f4ea1ccda2c",
        "spender": "0x655c5c7c57a397643bb4b201f465a1df40fc5fa3",
        "value": "115792089237316195423570985008687907853269984665640564039457584007913129639935"
      }
    ],
    "minTokensBeforeSwapUpdateds": []
  }
}
```

このようなクエリにて、ブロックチェーンデータを特定の目的のために取得・可視化・分析できるようになります。