グラフティングでコントラクトを取り替え、履歴を残す
このガイドでは、既存のサブグラフをグラフティングして新しいサブグラフを構築し、配備する方法を学びます。
グラフティングは、既存のサブグラフからデータを再利用し、後のブロックからインデックスを作成します。これは、開発中にマッピングの単純なエラーを素早く乗り越えるため、または、既存のサブグラフが失敗した後に一時的に再び動作させるために有用です。また、ゼロからインデックスを作成するのに時間がかかる機能をサブグラフに追加する場合にも使用できます。
グラフト化されたサブグラフは、ベースとなるサブグラフのスキーマと同一ではなく、単に互換性のある GraphQL スキーマを使用することができます。また、それ自体は有効なサブグラフのスキーマでなければなりませんが、以下の方法でベースサブグラフのスキーマから逸脱することができます。
- エンティティタイプを追加または削除する
- エンティティタイプから属性を削除する
- 属性を追エンティティタイプに nullable加する
- null 化できない属性を null 化できる属性に変更する
- enums に値を追加する
- インターフェースの追加または削除
- インターフェースがどのエンティティタイプに実装されるかを変更する
詳しくは、こちらでご確認ください。
このチュートリアルでは、基本的なユースケースについて説明します。既存の契約を同一の契約に置き換えます(新しい住所ですが、コードは同じです)。次に、新しいコントラクトを追跡する「ベース」サブグラフに既存のサブグラフを移植します
注意: サブグラフを Subgraph Studio またはホストされたサービスから分散ネットワークにアップグレードする場合は、アップグレード プロセス中にグラフティングの使用を避けることを強くお勧めします。
グラフティングは、既存のサブグラフから新しいバージョンに歴史的なデータを効果的に転送することを可能にする、強力な機能です。これはデータを保存し、インデックス作業に時間を節約する効果的な方法ですが、ホスト環境から分散ネットワークに移行する際に複雑さや潜在的な問題を導入する可能性があります。The Graph NetworkからホストされたサービスやSubgraph Studioにサブグラフを戻すことはできません。
初期移行: サブグラフを初めて分散ネットワークにデプロイするときは、移植せずに実行してください。 サブグラフが安定しており、期待どおりに機能していることを確認します。
その後の更新: サブグラフが分散ネットワーク上で稼働し、安定したら、移行をよりスムーズにし、履歴データを保存するために、将来のバージョンにグラフティングを使用できます。
これらのガイドラインに従うことで、リスクを最小限に抑え、よりスムーズな移行プロセスを確保できます。
サブグラフの構築は、The Graphの重要な部分であり、こちらでより詳しく説明されています。このチュートリアルで使用する既存のサブグラフをビルドしてデプロイできるようにするために、以下のレポを提供します。
注:サブグラフで使用されているコントラクトは、以下のHackathon Starterkitから取得したものです。
サブグラフ マニフェスト subgraph.yaml
は、サブグラフのデータ ソース、関心のあるトリガー、およびこれらのトリガーに応答して実行される関数を識別します。使用するサブグラフ マニフェストの例については、以下を参照してください。
specVersion: 0.0.4schema:file: ./schema.graphqldataSources:- kind: ethereumname: Locknetwork: goerlisource:address: '0x4Ed995e775D3629b0566D2279f058729Ae6EA493'abi: LockstartBlock: 7674603mapping:kind: ethereum/eventsapiVersion: 0.0.6language: wasm/assemblyscriptentities:- Withdrawalabis:- name: Lockfile: ./abis/Lock.jsoneventHandlers:- event: Withdrawal(uint256,uint256)handler: handleWithdrawalfile: ./src/lock.ts
Lock
データソースは、コンパイルとデプロイ時に取得するアビとコントラクトのアドレスです。- ネットワークは、クエリされるインデックス付きネットワークに対応する必要があります。Goerli testnet で実行しているので、ネットワークは
goerli
となります。 mapping
セクションでは、関心のあるトリガーと、それらのトリガーに応答して実行されるべき関数を定義しています。この場合、Withdrawal
イベントをリスニングし、それが発信されたときにhandleWithdrawal
関数を呼び出すことにしています。
グラフティングは、元のサブグラフ・マニフェストに新しい2つの項目を追加する必要があります。
---特徴:- グラフト # 機能名移植:base: Qm... # ベース部分グラフの部分グラフIDblock: 1502122 # ブロック番号
features
: 使用されるすべてのfeature名のリストです。graft:
はbase
サブグラフとグラフティングをするブロックのマップです。block
はインデックスを開始するブロック番号です。Graphは、指定されたブロックまでのベースサブグラフのデータをコピーし、そのブロックから新しいサブグラフのインデックスを作成し続けます。
base
とblock
の値は、2つのサブグラフを展開することで求めることができます:一つはベースインデックス用、もう一つはグラフティング用です
- Graph Studio UIにアクセスし、Guerli testnet上に
graft-example
というサブグラフを作成します。 - レポの
graft-example
フォルダ内のサブグラフのページにあるAUTH & DEPLOY
セクションの指示にしたがってください。 - 終了後、サブグラフが正しくインデックスされていることを確認します。The Graph Playgroundで以下のコマンドを実行すると、サブグラフが正常にインデックスされます。
{withdrawals(first: 5) {idamountwhen}}
このようなものが返ってきます:
{"data": {"withdrawals": [{"id": "0x13098b538a61837e9f29b32fb40527bbbe63c9120c250242b02b69bb42c287e5-5","amount": "0","when": "1664367528"},{"id": "0x800c92fcc0edbd26f74e19ad058c62008a47c7789f2064023b987028343dd498-3","amount": "0","when": "1664367648"}]}}
サブグラフが正しくインデックスされていることを確認したら、グラフティングで素早くサブグラフを更新することができます。
グラフト置換されたsubgraph.yamlは、新しいコントラクトのアドレスを持つことになります。これは、ダンプを更新したり、コントラクトを再デプロイしたりしたときに起こりうることです。
- Graph Studio UIにアクセスし、Goerli testnet上に
graft-replacement
というサブグラフを作成します。 - 新しいマニフェストを作成します。
graph-replacement
のsubgraph.yaml
には、異なるコントラクト アドレスと、どのようにグラフティングするかについての新しい情報が含まれています。これらは、古いコントラクトで発生する最後のイベントのblock
と古いサブグラフのbase
です。base
サブグラフIDは、元のgraph-example
サブグラフのDeployment ID
となります。これは、The Graph Studio UIで確認できます。 - レポの
graft-replacement
フォルダ内のサブグラフのページにあるAUTH & DEPLOY
セクションの指示にしたがってください。 - 終了後、サブグラフが正しくインデックスされていることを確認します。The Graph Playgroundで以下のコマンドを実行すると、サブグラフが正常にインデックスされます。
{withdrawals(first: 5) {idamountwhen}}
以下のように返ってくるはずです:
{"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 1とEvent 2という2つのWithdrawal
イベントを発行しています。新しいコントラクトは、イベント3の後に、1つのWithdrawal
を発行しました。2つの以前インデックスされたトランザクション(イベント1、2)と新しいトランザクション(イベント3)はgraft-replacement
サブグラフで一緒に結合されます。
おめでとうございます。あなたは、サブグラフを別のサブグラフにグラフティングすることに成功しました。
もっとグラフティングを体験したい方に、人気のあるコントラクトの例をご紹介します:
グラフの専門家になるには、基礎となるデータソースの変更を処理する他の方法について学ぶことを検討してください。Data Source Templates のような代替手段で、同様の結果を得ることができます。
注:この記事の多くの資料は、以前公開されたアルウィーブの記事から引用したものです。