监听合约事件 -- 手把手带你在线、离线部署 The Graph

是什么TheGraph是一个去中心化的协议,用于索引和查询区块链数据。它使得开发者能够构建基于区块链的数据应用(dApps),并能快速、高效地查询和访问链上的信息:https://learnblockchain.cn/shawn_shaw

是什么

The Graph 是一个去中心化的协议,用于索引和查询区块链数据。它使得开发者能够构建基于区块链的数据应用(dApps),并能快速、高效地查询和访问链上的信息。 在此处,主要用于监听获取我们部署的合约的事件

  1. SubgraphsSubgraph 是一个数据子图,它定义了如何从区块链中抓取和索引数据。开发者通过编写子图来指定数据源、查询事件、映射规则等。 Subgraph 会自动抓取区块链数据,进行索引并存储在数据库中(通常是 PostgreSQL)。开发者可以通过 GraphQL 查询语言来访问这些数据。
  2. GraphQLThe Graph 使用 GraphQL 作为查询语言,允许开发者以非常高效和灵活的方式从区块链中查询数据。 Subgraph 可以处理特定区块链事件(如交易、合约调用等),将这些事件转化为易于查询的数据。
  3. Graph NodeGraph NodeThe Graph 协议的核心组件,负责从区块链上抓取、索引和存储数据。它运行在后端,接收来自 Subgraph 的请求,并将数据存储在数据库中(通常是 PostgreSQL)和去中心化存储(如 IPFS)。
  4. IPFS(InterPlanetary File System)IPFS 用来存储 Subgraph 的代码、ABI 文件、schema 文件等静态内容。它确保这些文件在去中心化的存储网络中不易篡改,能够安全地被访问。

在线部署

注册

Browse and Explore Subgraphs (thegraph.com)上创建一个Subgraph

添加 subgraph

在网页上,添加一个 subgraph 工作空间 image.png

在线部署 subgraph

控制台中安装依赖

yarn global add @graphprotocol/graph-cli

初始化目录

graph init my-subgraph

按照命令行指引,往下走即可。 image.png

认证

graph auth _your_token_

image.png

image.png

构建项目代码

 graph codegen && graph build

image.png

部署到 the graphstudio

 graph deploy my-subgraph

image.png

此时,我们在 the graph 的官方网页应该能看到变化,说明 subgraph 已经被部署。

image.png

测试

此时,我们在 the graph 的网页仪表板中,点击 playground 执行查询,即可获取到合约对应的事件。经过区块浏览器的对比,两者获取到的事件哈希一致。

image.png

本地部署 Graph 节点

• 完全本地运行(PostgreSQL + IPFS + Graph Node) • 不依赖官方网络 • 更适合: • 👨‍💻 本地开发调试子图 • 🧪 针对测试链或私链部署索引器 • 🕵️‍♀️ 自定义数据抓取需求

docker 部署

docker-compose.yml文件

version: '3'  # 指定 Docker Compose 文件使用的版本
services:
  # PostgreSQL 数据库服务(用于 graph-node 存储数据)
  postgres:
    image: postgres:15  # 使用官方 postgres 镜像的第15版
    environment:
      POSTGRES_USER: postgres         # 设置数据库用户名
      POSTGRES_DB: graph-node         # 创建的数据库名
      POSTGRES_HOST_AUTH_METHOD: trust # 使用 trust 模式,无需密码
      POSTGRES_INITDB_ARGS: "--locale=C --encoding=UTF8" # 初始化参数,设置编码为 UTF-8
    ports:
      - '5432:5432'  # 将容器的 5432 端口映射到主机的 5432(Postgres 默认端口)
    volumes:
      - pgdata:/var/lib/postgresql/  # 使用名为 pgdata 的卷挂载数据目录,持久化存储

  # IPFS 服务(用于存储和获取子图文件)
  ipfs:
    image: ipfs/go-ipfs:v0.4.23  # 使用 IPFS 官方镜像,版本 0.4.23
    ports:
      - '5001:5001'  # IPFS API 接口端口
      - '8080:8080'  # IPFS 网关端口
      - '4001:4001'  # IPFS swarm 通信端口(用于 P2P 通信)
    volumes:
      - ipfsdata:/data/ipfs  # 使用名为 ipfsdata 的卷挂载 IPFS 数据目录

  # graph-node 服务(核心服务)
  graph-node:
    image: graphprotocol/graph-node:latest  # 使用 graph-node 的最新版镜像
    ports:
      - '8000:8000'  # GraphQL 查询接口(用于前端查询)
      - '8020:8020'  # 管理接口(用于部署、管理子图)
      - '8030:8030'  # Prometheus 指标端口(监控用)
      - '8040:8040'  # JSON-RPC 指标端口(监控用)
      - '8001:8001'  # 备用 GraphQL 端口或调试用
    depends_on:
      - postgres  # 启动前依赖 postgres
      - ipfs      # 启动前依赖 ipfs
    environment:
      postgres_host: postgres         # PostgreSQL 容器服务名(Docker Compose 会自动识别)
      postgres_user: postgres         # 登录数据库的用户名
      postgres_pass: ''               # 数据库密码(为空,因为使用 trust 模式)
      postgres_db: graph-node         # 要连接的数据库名
      ipfs: 'ipfs:5001'               # IPFS 容器地址(Docker Compose 内部通信用)
      ethereum: 'anvil:http://host.docker.internal:8545' 
        # 指定以太坊节点地址,这里用的是 Foundry 的 anvil,host.docker.internal 让容器访问宿主机
    volumes:
      - ./data:/data  # 本地的 ./data 挂载到容器的 /data 目录(用于存储 graph-node 相关数据)

# 声明持久化存储卷
volumes:
  pgdata:
  ipfsdata:

启动 docker compose up -d 停止 docker compose down -v

首先启动 anvil

anvil -vvvv

image.png

然后使用 docker-compose 启动 graph-node 和 postgre 以及 ipfs

image.png docker ps 查看是否启动成功

image.png

部署 ShawnERC20 合约到 anvil 上,复制出来合约地址

forge script script/ERC20/DeployShawnERC20.sol \
  --rpc-url 127.0.0.1:8545 \
  --private-key $PRIVATE_KEY_1 \
  --broadcast \
  -vvvv

image.png

创建子图

创建 subgraph 项目,将端口指向 graph-node的管理端口

graph create erc20-subgraph --node http://localhost:8020

完善 subgraph 项目的内容,包括 subgraph.yaml (定义数据域、IPFS 交互、事件处理程序) 和 mapping.ts(处理事件逻辑,解析事件并保存在 Graph 数据库中) 代码见仓库 https://github.com/Shawn-Shaw-x/hello-foundry/tree/main/erc20-subgraph

生成代码、编译项目

graph codegen && graph build

image.png

部署项目到本地 Graph Node

graph deploy erc20-subgraph \
  --node http://localhost:8020 \
  --ipfs http://localhost:5001

image.png

测试

浏览器上查看 http://localhost:8000/subgraphs/name/erc20-subgraph

输入

{
  transfers {
    id
    from
    to
    value
  }
}

image.png 通过编写 GraphQL 查询语言,可以看到本地 Graph给我们返回了正确的合约 transfer 事件。本地部署成功。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
shawn_shaw
shawn_shaw
web3潜水员、技术爱好者、web3钱包开发工程师、欢迎交流工作机会。欢迎骚扰:vx:cola_ocean