Docs
検索⌘ K
  • Home
  • The Graphについて
  • サポートされているネットワーク
  • Protocol Contracts
  • サブグラフ
    • サブストリーム
      • Token API
        • AI Suite
          • インデクシング
            • リソース
              サブグラフ > How-to Guides

              7 分

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

              In this guide, you will learn how to build and deploy new Subgraphs by grafting existing Subgraphs.

              グラフティングとは?

              Grafting reuses the data from an existing Subgraph and starts indexing it at a later block. This is useful during development to get past simple errors in the mappings quickly or to temporarily get an existing Subgraph working again after it has failed. Also, it can be used when adding a feature to a Subgraph that takes long to index from scratch.

              The grafted Subgraph can use a GraphQL schema that is not identical to the one of the base Subgraph, but merely compatible with it. It has to be a valid Subgraph schema in its own right, but may deviate from the base Subgraph’s schema in the following ways:

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

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

              • Grafting

              In this tutorial, we will be covering a basic use case. We will replace an existing contract with an identical contract (with a new address, but the same code). Then, graft the existing Subgraph onto the “base” Subgraph that tracks the new contract.

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

              Caution: It is recommended to not use grafting for Subgraphs published to The Graph Network

              何でこれが大切ですか?

              Grafting is a powerful feature that allows you to “graft” one Subgraph onto another, effectively transferring historical data from the existing Subgraph to a new version. It is not possible to graft a Subgraph from The Graph Network back to Subgraph Studio.

              ベストプラクティス

              Initial Migration: when you first deploy your Subgraph to the decentralized network, do so without grafting. Ensure that the Subgraph is stable and functioning as expected.

              Subsequent Updates: once your Subgraph is live and stable on the decentralized network, you may use grafting for future versions to make the transition smoother and to preserve historical data.

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

              既存のサブグラフの構築

              Building Subgraphs is an essential part of The Graph, described more in depth here. To be able to build and deploy the existing Subgraph used in this tutorial, the following repo is provided:

              • Subgraph example repo⁠

              Note: The contract used in the Subgraph was taken from the following Hackathon Starterkit⁠.

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

              The Subgraph manifest subgraph.yaml identifies the data sources for the Subgraph, the triggers of interest, and the functions that should be run in response to those triggers. See below for an example Subgraph manifest that you will use:

              1specVersion: 1.3.02schema:3  file: ./schema.graphql4dataSources:5  - kind: ethereum6    name: Lock7    network: sepolia8    source:9      address: '0xb3aabe721794b85fe4e72134795c2f93b4eb7e63'10      abi: Lock11      startBlock: 595569012    mapping:13      kind: ethereum/events14      apiVersion: 0.0.915      language: wasm/assemblyscript16      entities:17        - Withdrawal18      abis:19        - name: Lock20          file: ./abis/Lock.json21      eventHandlers:22        - event: Withdrawal(uint256,uint256)23          handler: handleWithdrawal24      file: ./src/lock.ts
              • The Lock data source is the abi and contract address we will get when we compile and deploy the contract
              • The network should correspond to an indexed network being queried. Since we’re running on Sepolia testnet, the network is sepolia
              • The mapping section defines the triggers of interest and the functions that should be run in response to those triggers. In this case, we are listening for the Withdrawal event and calling the handleWithdrawal function when it is emitted.

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

              Grafting requires adding two new items to the original Subgraph manifest:

              1---2features:3  - grafting # feature name4graft:5  base: Qm... # Subgraph ID of base Subgraph6  block: 5956000 # block number
              • features: is a list of all used feature names.
              • graft: is a map of the base Subgraph and the block to graft on to. The block is the block number to start indexing from. The Graph will copy the data of the base Subgraph up to and including the given block and then continue indexing the new Subgraph from that block on.

              The base and block values can be found by deploying two Subgraphs: one for the base indexing and one with grafting

              ベースサブグラフの起動

              1. Go to Subgraph Studio and create a Subgraph on Sepolia testnet called graft-example
              2. Follow the directions in the AUTH & DEPLOY section on your Subgraph page in the graft-example folder from the repo
              3. Once finished, verify the Subgraph is indexing properly. If you run the following command in The Graph Playground
              1{2  withdrawals(first: 5) {3    id4    amount5    when6  }7}

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

              1{2  "data": {3    "withdrawals": [4      {5        "id": "0xe8323d21c4f104607b10b0fff9fc24b9612b9488795dea8196b2d5f980d3dc1d0a000000",6        "amount": "0",7        "when": "1716394824"8      },9      {10        "id": "0xea1cee35036f2cacb72f2a336be3e54ab911f5bebd58f23400ebb8ecc5cfc45203000000",11        "amount": "0",12        "when": "1716394848"13      }14    ]15  }16}

              Once you have verified the Subgraph is indexing properly, you can quickly update the Subgraph with grafting.

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

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

              1. Go to Subgraph Studio and create a Subgraph on Sepolia testnet called graft-replacement
              2. Create a new manifest. The subgraph.yaml for graph-replacement contains a different contract address and new information about how it should graft. These are the block of the last event emitted⁠ you care about by the old contract and the base of the old Subgraph. The base Subgraph ID is the Deployment ID of your original graph-example Subgraph. You can find this in Subgraph Studio.
              3. Follow the directions in the AUTH & DEPLOY section on your Subgraph page in the graft-replacement folder from the repo
              4. Once finished, verify the Subgraph is indexing properly. If you run the following command in The Graph Playground
              1{2  withdrawals(first: 5) {3    id4    amount5    when6  }7}

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

              1{2  "data": {3    "withdrawals": [4      {5        "id": "0xe8323d21c4f104607b10b0fff9fc24b9612b9488795dea8196b2d5f980d3dc1d0a000000",6        "amount": "0",7        "when": "1716394824"8      },9      {10        "id": "0xea1cee35036f2cacb72f2a336be3e54ab911f5bebd58f23400ebb8ecc5cfc45203000000",11        "amount": "0",12        "when": "1716394848"13      },14      {15        "id": "0x2410475f76a44754bae66d293d14eac34f98ec03a3689cbbb56a716d20b209af06000000",16        "amount": "0",17        "when": "1716429732"18      }19    ]20  }21}

              You can see that the graft-replacement Subgraph is indexing from older graph-example data and newer data from the new contract address. The original contract emitted two Withdrawal events, Event 1⁠ and Event 2⁠. The new contract emitted one Withdrawal after, Event 3⁠. The two previously indexed transactions (Event 1 and 2) and the new transaction (Event 3) were combined together in the graft-replacement Subgraph.

              Congrats! You have successfully grafted a Subgraph onto another Subgraph.

              その他のリソース

              If you want more experience with grafting, here are a few examples for popular contracts:

              • Curve⁠
              • ERC-721⁠
              • Uniswap⁠,

              To become even more of a Graph expert, consider learning about other ways to handle changes in underlying datasources. Alternatives like Data Source Templates can achieve similar results

              Note: A lot of material from this article was taken from the previously published Arweave article

              ⁠GitHubで編集する⁠

              Arweaveでのサブグラフ構築安全なサブグラフのコード生成
              このページでは
              • グラフティングとは?
              • ネットワークにアップグレードする際の移植に関する重要な注意事項
              • 何でこれが大切ですか?
              • ベストプラクティス
              • 既存のサブグラフの構築
              • サブグラフマニフェストの定義
              • グラフティングマニフェストの定義
              • ベースサブグラフの起動
              • グラフティングサブグラフの展開
              • その他のリソース
              The GraphStatusTestnetBrand AssetsForumSecurityプライバシーポリシーTerms of Service