Building & Deploying Subgraph (local node)

This tutorial will demonstrate how to build a subgraph and deploy it locally

Install the graph-cli

https://github.com/graphprotocol/graph-cli#installationarrow-up-right

Build your own graph-indexer local node

Copy paste the below docker-compose file and replace services.graph-node.environment.ethereum accordingly to the network: mainnet s0 : mainnet:archive,traces:https://a.api.s0.t.hmny.io mainnet s1 : mainnet:archive,traces:https://a.api.s1.t.hmny.io

version: "3"
services:
  graph-node:
    container_name: hmy_indexer
    image: graphprotocol/graph-node:latest
    ports:
      - "8000:8000"
      - "8001:8001"
      - "8020:8020"
      - "8030:8030"
      - "8040:8040"
    depends_on:
      - ipfs
      - postgres
    environment:
      postgres_host: postgres
      postgres_user: graph-node
      postgres_pass: let-me-in
      postgres_db: graph-node
      ipfs: "ipfs:5001"
      GRAPH_ETH_CALL_BY_NUMBER: 1
      GRAPH_ALLOW_NON_DETERMINISTIC_IPFS: 1
      ethereum: "mainnet:archive,traces:https://a.api.s0.t.hmny.io"
      RUST_LOG: info
  ipfs:
    container_name: ipfs
    image: ipfs/go-ipfs:v0.4.23
    ports:
      - "5001:5001"
    volumes:
      - ./data/ipfs:/data/ipfs
  postgres:
    image: postgres
    ports:
      - "5432:5432"
    command: ["postgres", "-cshared_preload_libraries=pg_stat_statements"]
    environment:
      POSTGRES_USER: graph-node
      POSTGRES_PASSWORD: let-me-in
      POSTGRES_DB: graph-node
    volumes:
      - ./data/postgres:/var/lib/postgresql/data

and run your indexer node

docker logs hmy_indexer -f should show the indexer synching with the harmony chain

A few component are installed

Management: https://localhost:8020/arrow-up-right where subgraph are being created/deployed/deleted

Metrics / playground: https://localhost:8030/arrow-up-right

Visit your playground using the URL http://127.0.0.1:8030/graphql/playgroundarrow-up-right and start playing around with graphQL API.

An example of query you can use to show subgraph currently being indexed would be :

Right now of course, the result is empty

Our first subgraph

lets use blocklytics/ethereum-blocks subgraph as example

Edit package.json file and add these lines

circle-info

It is highly recommended to minimize the number of blocks to be indexed to avoid putting load on the RPCs and to speed up the usage of your subgraph/application

Update the manifest

Update the manifest subgraph.yaml file datasources[0]['network'] from rinkeby to mainnet or testnet accordingly to how you edited the network in your docker-compose.yaml if there is no need to index the entire blockchain, you can add an attribute startBlock to speed up the sync : datasources[0]['source']['startBlock']

Also, update the subgraph.yaml apiVersion: 0.0.5

circle-info

It is highly recommended to minimize the number of blocks to be indexed to avoid putting load on the RPCs and to speed up the usage of your subgraph/application

Create and deploy the subgraph

Sync begins and you are good to query your subgraph http://localhost:8000/subgraphs/name/harmony/blocks/graphqlarrow-up-right

Note that the above example query should now show your something similar to the below

data['indexingStatuses'][0]['chains'][0]['latestBlock']['number'] will indicate the last block synched

circle-exclamation

How to write subgraphs

Official Graph's doc

https://thegraph.com/docs/developer/create-subgraph-hostedarrow-up-right

Community article

https://medium.com/protofire-blog/subgraph-development-part-1-understanding-and-aggregating-data-ef0c9a61063darrow-up-right

https://medium.com/protofire-blog/subgraph-development-part-2-handling-arrays-and-identifying-entities-30d63d4b1dc6arrow-up-right

Getting help

the Graph’s Discord server https://discord.gg/vtvv7FParrow-up-right

Last updated

Was this helpful?