クックブック > グラフティングでコントラクトを取り替え、履歴を残す

グラフティングでコントラクトを取り替え、履歴を残す

このガイドでは、既存のサブグラフをグラフティングして新しいサブグラフを構築し、配備する方法を学びます。

グラフティングとは?

このセクションへのリンク

グラフティングは、既存のサブグラフからデータを再利用し、後のブロックからインデックスを作成します。これは、開発中にマッピングの単純なエラーを素早く乗り越えるため、または、既存のサブグラフが失敗した後に一時的に再び動作させるために有用です。また、ゼロからインデックスを作成するのに時間がかかる機能をサブグラフに追加する場合にも使用できます。

グラフト化されたサブグラフは、ベースとなるサブグラフのスキーマと同一ではなく、単に互換性のある GraphQL スキーマを使用することができます。また、それ自体は有効なサブグラフのスキーマでなければなりませんが、以下の方法でベースサブグラフのスキーマから逸脱することができます。

  • エンティティタイプを追加または削除する
  • エンティティタイプから属性を削除する
  • 属性を追エンティティタイプに nullable加する
  • null 化できない属性を null 化できる属性に変更する
  • enums に値を追加する
  • インターフェースの追加または削除
  • インターフェースがどのエンティティタイプに実装されるかを変更する

詳しくは、こちらでご確認ください。

このチュートリアルでは、基本的なユースケースについて説明します。既存の契約を同一の契約に置き換えます(新しい住所ですが、コードは同じです)。次に、新しいコントラクトを追跡する「ベース」サブグラフに既存のサブグラフを移植します

ネットワークにアップグレードする際の移植に関する重要な注意事項

このセクションへのリンク

注意: サブグラフを Subgraph Studio またはホストされたサービスから分散ネットワークにアップグレードする場合は、アップグレード プロセス中にグラフティングの使用を避けることを強くお勧めします。

何でこれが大切ですか?

このセクションへのリンク

グラフティングは、既存のサブグラフから新しいバージョンに歴史的なデータを効果的に転送することを可能にする、強力な機能です。これはデータを保存し、インデックス作業に時間を節約する効果的な方法ですが、ホスト環境から分散ネットワークに移行する際に複雑さや潜在的な問題を導入する可能性があります。The Graph NetworkからホストされたサービスやSubgraph Studioにサブグラフを戻すことはできません。

ベストプラクティス

このセクションへのリンク

初期移行: サブグラフを初めて分散ネットワークにデプロイするときは、移植せずに実行してください。 サブグラフが安定しており、期待どおりに機能していることを確認します。

その後の更新: サブグラフが分散ネットワーク上で稼働し、安定したら、移行をよりスムーズにし、履歴データを保存するために、将来のバージョンにグラフティングを使用できます。

これらのガイドラインに従うことで、リスクを最小限に抑え、よりスムーズな移行プロセスを確保できます。

既存のサブグラフの構築

このセクションへのリンク

サブグラフの構築は、The Graphの重要な部分であり、こちらでより詳しく説明されています。このチュートリアルで使用する既存のサブグラフをビルドしてデプロイできるようにするために、以下のレポを提供します。

注:サブグラフで使用されているコントラクトは、以下のHackathon Starterkitから取得したものです。

サブグラフマニフェストの定義

このセクションへのリンク

サブグラフ マニフェスト subgraph.yaml は、サブグラフのデータ ソース、関心のあるトリガー、およびこれらのトリガーに応答して実行される関数を識別します。使用するサブグラフ マニフェストの例については、以下を参照してください。

specVersion: 0.0.4
schema:
file: ./schema.graphql
dataSources:
- kind: ethereum
name: Lock
network: goerli
source:
address: '0x4Ed995e775D3629b0566D2279f058729Ae6EA493'
abi: Lock
startBlock: 7674603
mapping:
kind: ethereum/events
apiVersion: 0.0.6
language: wasm/assemblyscript
entities:
- Withdrawal
abis:
- name: Lock
file: ./abis/Lock.json
eventHandlers:
- event: Withdrawal(uint256,uint256)
handler: handleWithdrawal
file: ./src/lock.ts
  • Lockデータソースは、コンパイルとデプロイ時に取得するアビとコントラクトのアドレスです。
  • ネットワークは、クエリされるインデックス付きネットワークに対応する必要があります。Goerli testnet で実行しているので、ネットワークは goerli となります。
  • mappingセクションでは、関心のあるトリガーと、それらのトリガーに応答して実行されるべき関数を定義しています。この場合、Withdrawalイベントをリスニングし、それが発信されたときにhandleWithdrawal関数を呼び出すことにしています。

グラフティングマニフェストの定義

このセクションへのリンク

グラフティングは、元のサブグラフ・マニフェストに新しい2つの項目を追加する必要があります。

---
特徴:
- グラフト # 機能名
移植:
base: Qm... # ベース部分グラフの部分グラフID
block: 1502122 # ブロック番号
  • features: 使用されるすべてのfeature名のリストです。
  • graft:baseサブグラフとグラフティングをするブロックのマップです。blockはインデックスを開始するブロック番号です。Graphは、指定されたブロックまでのベースサブグラフのデータをコピーし、そのブロックから新しいサブグラフのインデックスを作成し続けます。

baseblockの値は、2つのサブグラフを展開することで求めることができます:一つはベースインデックス用、もう一つはグラフティング用です

ベースサブグラフの起動

このセクションへのリンク
  1. Graph Studio UIにアクセスし、Guerli testnet上にgraft-exampleというサブグラフを作成します。
  2. レポの graft-example フォルダ内のサブグラフのページにある AUTH & DEPLOY セクションの指示にしたがってください。
  3. 終了後、サブグラフが正しくインデックスされていることを確認します。The Graph Playgroundで以下のコマンドを実行すると、サブグラフが正常にインデックスされます。
{
withdrawals(first: 5) {
id
amount
when
}
}

このようなものが返ってきます:

{
"data": {
"withdrawals": [
{
"id": "0x13098b538a61837e9f29b32fb40527bbbe63c9120c250242b02b69bb42c287e5-5",
"amount": "0",
"when": "1664367528"
},
{
"id": "0x800c92fcc0edbd26f74e19ad058c62008a47c7789f2064023b987028343dd498-3",
"amount": "0",
"when": "1664367648"
}
]
}
}

サブグラフが正しくインデックスされていることを確認したら、グラフティングで素早くサブグラフを更新することができます。

グラフティングサブグラフの展開

このセクションへのリンク

グラフト置換されたsubgraph.yamlは、新しいコントラクトのアドレスを持つことになります。これは、ダンプを更新したり、コントラクトを再デプロイしたりしたときに起こりうることです。

  1. Graph Studio UIにアクセスし、Goerli testnet上にgraft-replacementというサブグラフを作成します。
  2. 新しいマニフェストを作成します。graph-replacementsubgraph.yaml には、異なるコントラクト アドレスと、どのようにグラフティングするかについての新しい情報が含まれています。これらは、古いコントラクトで発生する最後のイベントblockと古いサブグラフのbaseです。baseサブグラフIDは、元のgraph-exampleサブグラフのDeployment IDとなります。これは、The Graph Studio UIで確認できます。
  3. レポの graft-replacement フォルダ内のサブグラフのページにある AUTH & DEPLOY セクションの指示にしたがってください。
  4. 終了後、サブグラフが正しくインデックスされていることを確認します。The Graph Playgroundで以下のコマンドを実行すると、サブグラフが正常にインデックスされます。
{
withdrawals(first: 5) {
id
amount
when
}
}

以下のように返ってくるはずです:

{
"data": {
"withdrawals": [
{
"id": "0x13098b538a61837e9f29b32fb40527bbbe63c9120c250242b02b69bb42c287e5-5",
"amount": "0",
"when": "1664367528"
},
{
"id": "0x800c92fcc0edbd26f74e19ad058c62008a47c7789f2064023b987028343dd498-3",
"amount": "0",
"when": "1664367648"
},
{
"id": "0xb4010e4c76f86762beb997a13cf020231778eaf7c64fa3b7794971a5e6b343d3-22",
"amount": "0",
"when": "1664371512"
}
]
}
}

graft-replacementサブグラフは、古いgraph-exampleデータと新しいコントラクトアドレスからの新しいデータからインデックスを作成していることがわかります。元のコントラクトは、Event 1Event 2という2つのWithdrawalイベントを発行しています。新しいコントラクトは、イベント3の後に、1つのWithdrawalを発行しました。2つの以前インデックスされたトランザクション(イベント1、2)と新しいトランザクション(イベント3)はgraft-replacementサブグラフで一緒に結合されます。

おめでとうございます。あなたは、サブグラフを別のサブグラフにグラフティングすることに成功しました。

その他のリソース

このセクションへのリンク

もっとグラフティングを体験したい方に、人気のあるコントラクトの例をご紹介します:

グラフの専門家になるには、基礎となるデータソースの変更を処理する他の方法について学ぶことを検討してください。Data Source Templates のような代替手段で、同様の結果を得ることができます。

注:この記事の多くの資料は、以前公開されたアルウィーブの記事から引用したものです。

ページを編集

Arweaveでのサブグラフ構築
安全なサブグラフのコード生成
ページを編集