小白专享-图解以太坊编程

2025年06月30日更新 17 人订阅
专栏简介 最基础的数据结构 - Merkle 树 MPT树前置 - 前缀树 以太坊的核心数据结构 - MPT树 以太坊数据检索的基石 - 布隆过滤器 入门以太坊的编程的第一步 - Solidity 基本语法 Gas优化的核心 - 以太坊数据存储布局及内存优化 以太坊进阶操作 - 合约调用、地址预测、发送与接收 ETH 以太坊编程进阶 - ABI 编码、函数选择器、合约升级 以太坊代理模式的进阶 - 钻石代理和最小代理 以太坊代理模式的天花板 - 信标代理 以太坊发币 - 超简单发行 ERC-20 代币并上线到 holesky 上 NFT发行 - 超简单发行 NFT 到 holesky 上(包含 ERC165、ERC721Receiver 的含义) 带你手搓一个预言机 - 极简版的 ChainLink VRF 随机数生成 监听合约事件 -- 手把手带你在线、离线部署 The Graph 事件监听 - 合约事件监听的方案汇总 代币集大成者 - 手搓一个ERC1155合约并上线 holesky DeFi 项目的基石 - ERC4626 代币金库协议的实现 智能合约的身份保证 - 数字签名 更安全的签名 - EIP712 结构化签名 ERC20授权的更优方案 - ERC20Permit 签名授权 更安全的钱包 - 最小代码手搓 gnosis safe 多签钱包 空投大杂烩 - 合约实现空投发放的三种方案 发币防止大户提前跑路 - 手搓一个线性释放合约 你也不想你的代币被盗吧? - 手搓实现代币锁和时间锁 Pectra 升级的核心:EIP-7702的原理分析和实操 Resupply 黑客事件分析

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

  • shawn_shaw
  • 发布于 2025-04-24 11:07
  • 阅读 1169

是什么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 条评论

请先 登录 后评论