diff --git a/website/src/pages/ar/subgraphs/cookbook/_meta.js b/website/src/pages/ar/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/ar/subgraphs/cookbook/_meta.js +++ b/website/src/pages/ar/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/cs/subgraphs/cookbook/_meta.js b/website/src/pages/cs/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/cs/subgraphs/cookbook/_meta.js +++ b/website/src/pages/cs/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/de/subgraphs/cookbook/_meta.js b/website/src/pages/de/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/de/subgraphs/cookbook/_meta.js +++ b/website/src/pages/de/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/en/subgraphs/cookbook/_meta.js b/website/src/pages/en/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/en/subgraphs/cookbook/_meta.js +++ b/website/src/pages/en/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/en/subgraphs/cookbook/subgraph-composition-three-sources.mdx b/website/src/pages/en/subgraphs/cookbook/subgraph-composition-three-sources.mdx new file mode 100644 index 000000000000..49a57ab19964 --- /dev/null +++ b/website/src/pages/en/subgraphs/cookbook/subgraph-composition-three-sources.mdx @@ -0,0 +1,98 @@ +--- +title: Aggregate Data Using Subgraph Composition +sidebarTitle: 'Build a Composable Subgraph with Multiple Subgraphs' +--- + +Optimize your Subgraph by merging data from three independent, source Subgraphs into a single composable Subgraph to enhance data aggregation. + +> Important Reminders: +> +> - Subgraph composition is built into the CLI, and you can deploy with [Subgraph Studio](https://thegraph.com/studio/). +> - This feature requires `specVersion` 1.3.0. + +## Overview + +Subgraph composition empowers you use one Subgraph as a data source for another, allowing it to consume and respond to entity changes. Instead of fetching on-chain data directly, a Subgraph can listen for updates from another Subgraph and react to changes. This is useful for aggregating data from multiple Subgraphs or triggering actions based on external updates. + +## Prerequisites + +To deploy **all** Subgraphs locally, you must have the following: + +- A [graph-node](https://github.com/graphprotocol/graph-node) instance running locally +- An [IPFS](https://docs.ipfs.tech/) instance running locally +- [Node.js](https://nodejs.org) and npm + +## Get Started + +The following guide provides examples for defining three source Subgraphs to create one powerful composed Subgraph. + +### Specifics + +- To keep this example simple, all source Subgraphs use only block handlers. However, in a real environment, each source Subgraph will use data from different smart contracts. +- The examples below show how to import and extend the schema of another Subgraph to enhance its functionality. +- Each source Subgraph is optimized with a specific entity. +- All the commands listed install the necessary dependencies, generate code based on the GraphQL schema, build the Subgraph, and deploy it to your local Graph Node instance. + +### Step 1. Deploy Block Time Source Subgraph + +This first source Subgraph calculates the block time for each block. + +- It imports schemas from other Subgraphs and adds a `block` entity with a `timestamp` field, representing the time each block was mined. +- It listens to time-related blockchain events (e.g., block timestamps) and processes this data to update the Subgraph's entities accordingly. + +To deploy this Subgraph locally, run the following commands: + +```bash +npm install +npm run codegen +npm run build +npm run create-local +npm run deploy-local +``` + +### Step 2. Deploy Block Cost Source Subgraph + +This second source Subgraph indexes the cost of each block. + +#### Key Functions + +- It imports schemas from other Subgraphs and adds a `block` entity with cost-related fields. +- It listens to blockchain events related to costs (e.g. gas fees, transaction costs) and processes this data to update the Subgraph's entities accordingly. + +To deploy this Subgraph locally, run the same commands as above. + +### Step 3. Define Block Size in Source Subgraph + +This third source Subgraph indexes the size of each block. + +#### Key Functions + +- It imports existing schemas from other Subgraphs and adds a `block` entity with a `size` field representing each block's size. +- It listens to blockchain events related to block sizes (e.g., storage or volume) and processes this data to update the Subgraph's entities accordingly. + +### Step 4. Combine Into Block Stats Subgraph + +This composed Subgraph combines and aggregates the information from the three source Subgraphs above, providing a unified view of block statistics. + +> Note: +> +> - Any change to a source Subgraph will likely generate a new deployment ID. +> - Be sure to update the deployment ID in the data source address of the Subgraph manifest to take advantage of the latest changes. +> - All source Subgraphs should be deployed before the composed Subgraph is deployed. + +#### Key Functions + +- It provides a consolidated data model that encompasses all relevant block metrics. +- It combines data from three source Subgraphs, and provides a comprehensive view of block statistics, enabling more complex queries and analyses. + +## Key Takeaways + +- This powerful tool will scale your Subgraph development and allow you to combine multiple Subgraphs. +- The setup includes the deployment of three source Subgraphs and one final deployment of the composed Subgraph. +- This feature unlocks scalability, simplifying both development and maintenance efficiency. + +## Additional Resources + +- Check out all the code for this example in [this GitHub repo](https://github.com/isum/subgraph-composition-example). +- Add advanced features in your Subgraph. Check out [Subgraph advanced features](/developing/creating/advanced/). +- To learn more about aggregations, check out [Timeseries and Aggregations](/subgraphs/developing/creating/advanced/#timeseries-and-aggregations). diff --git a/website/src/pages/es/subgraphs/cookbook/_meta.js b/website/src/pages/es/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/es/subgraphs/cookbook/_meta.js +++ b/website/src/pages/es/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/fr/subgraphs/cookbook/_meta.js b/website/src/pages/fr/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/fr/subgraphs/cookbook/_meta.js +++ b/website/src/pages/fr/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/hi/subgraphs/cookbook/_meta.js b/website/src/pages/hi/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/hi/subgraphs/cookbook/_meta.js +++ b/website/src/pages/hi/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/it/subgraphs/cookbook/_meta.js b/website/src/pages/it/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/it/subgraphs/cookbook/_meta.js +++ b/website/src/pages/it/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/ja/subgraphs/cookbook/_meta.js b/website/src/pages/ja/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/ja/subgraphs/cookbook/_meta.js +++ b/website/src/pages/ja/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/ko/subgraphs/cookbook/_meta.js b/website/src/pages/ko/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/ko/subgraphs/cookbook/_meta.js +++ b/website/src/pages/ko/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/mr/subgraphs/cookbook/_meta.js b/website/src/pages/mr/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/mr/subgraphs/cookbook/_meta.js +++ b/website/src/pages/mr/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/nl/subgraphs/cookbook/_meta.js b/website/src/pages/nl/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/nl/subgraphs/cookbook/_meta.js +++ b/website/src/pages/nl/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/pl/subgraphs/cookbook/_meta.js b/website/src/pages/pl/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/pl/subgraphs/cookbook/_meta.js +++ b/website/src/pages/pl/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/pt/subgraphs/cookbook/_meta.js b/website/src/pages/pt/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/pt/subgraphs/cookbook/_meta.js +++ b/website/src/pages/pt/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/ro/subgraphs/cookbook/_meta.js b/website/src/pages/ro/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/ro/subgraphs/cookbook/_meta.js +++ b/website/src/pages/ro/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/ru/subgraphs/cookbook/_meta.js b/website/src/pages/ru/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/ru/subgraphs/cookbook/_meta.js +++ b/website/src/pages/ru/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/sv/subgraphs/cookbook/_meta.js b/website/src/pages/sv/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/sv/subgraphs/cookbook/_meta.js +++ b/website/src/pages/sv/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/tr/subgraphs/cookbook/_meta.js b/website/src/pages/tr/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/tr/subgraphs/cookbook/_meta.js +++ b/website/src/pages/tr/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/uk/subgraphs/cookbook/_meta.js b/website/src/pages/uk/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/uk/subgraphs/cookbook/_meta.js +++ b/website/src/pages/uk/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/ur/subgraphs/cookbook/_meta.js b/website/src/pages/ur/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/ur/subgraphs/cookbook/_meta.js +++ b/website/src/pages/ur/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/vi/subgraphs/cookbook/_meta.js b/website/src/pages/vi/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/vi/subgraphs/cookbook/_meta.js +++ b/website/src/pages/vi/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '', diff --git a/website/src/pages/zh/subgraphs/cookbook/_meta.js b/website/src/pages/zh/subgraphs/cookbook/_meta.js index e642f12ef11d..1b169037deee 100644 --- a/website/src/pages/zh/subgraphs/cookbook/_meta.js +++ b/website/src/pages/zh/subgraphs/cookbook/_meta.js @@ -1,4 +1,5 @@ export default { + 'subgraph-composition-three-sources': '', 'subgraph-debug-forking': '', near: '', arweave: '',