是什么TheGraph是一个去中心化的协议,用于索引和查询区块链数据。它使得开发者能够构建基于区块链的数据应用(dApps),并能快速、高效地查询和访问链上的信息:https://learnblockchain.cn/shawn_shaw
The Graph
是一个去中心化的协议,用于索引和查询区块链数据。它使得开发者能够构建基于区块链的数据应用(dApps
),并能快速、高效地查询和访问链上的信息。
在此处,主要用于监听获取我们部署的合约的事件。
Subgraphs
:
Subgraph
是一个数据子图,它定义了如何从区块链中抓取和索引数据。开发者通过编写子图来指定数据源、查询事件、映射规则等。
Subgraph
会自动抓取区块链数据,进行索引并存储在数据库中(通常是 PostgreSQL
)。开发者可以通过 GraphQL
查询语言来访问这些数据。GraphQL
:
The Graph
使用 GraphQL
作为查询语言,允许开发者以非常高效和灵活的方式从区块链中查询数据。
Subgraph
可以处理特定区块链事件(如交易、合约调用等),将这些事件转化为易于查询的数据。Graph Node
:
Graph Node
是 The Graph
协议的核心组件,负责从区块链上抓取、索引和存储数据。它运行在后端,接收来自 Subgraph
的请求,并将数据存储在数据库中(通常是 PostgreSQL
)和去中心化存储(如 IPFS
)。IPFS(InterPlanetary File System)
:
IPFS
用来存储 Subgraph
的代码、ABI
文件、schema
文件等静态内容。它确保这些文件在去中心化的存储网络中不易篡改,能够安全地被访问。Browse and Explore Subgraphs (thegraph.com)上创建一个Subgraph
在网页上,添加一个 subgraph
工作空间
控制台中安装依赖
yarn global add @graphprotocol/graph-cli
graph init my-subgraph
按照命令行指引,往下走即可。
graph auth _your_token_
graph codegen && graph build
the graph
的 studio
中 graph deploy my-subgraph
此时,我们在 the graph
的官方网页应该能看到变化,说明 subgraph 已经被部署。
此时,我们在 the graph 的网页仪表板中,点击 playground 执行查询,即可获取到合约对应的事件。经过区块浏览器的对比,两者获取到的事件哈希一致。
• 完全本地运行(PostgreSQL + IPFS + Graph Node
)
• 不依赖官方网络
• 更适合:
• 👨💻 本地开发调试子图
• 🧪 针对测试链或私链部署索引器
• 🕵️♀️ 自定义数据抓取需求
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
docker ps 查看是否启动成功
ShawnERC20
合约到 anvil
上,复制出来合约地址forge script script/ERC20/DeployShawnERC20.sol \
--rpc-url 127.0.0.1:8545 \
--private-key $PRIVATE_KEY_1 \
--broadcast \
-vvvv
创建 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
Graph Node
中graph deploy erc20-subgraph \
--node http://localhost:8020 \
--ipfs http://localhost:5001
浏览器上查看 http://localhost:8000/subgraphs/name/erc20-subgraph
输入
{
transfers {
id
from
to
value
}
}
通过编写 GraphQL 查询语言,可以看到本地 Graph给我们返回了正确的合约 transfer 事件。本地部署成功。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!