3、开发环境准备:安装Graph CLI、初始化项目、连接以太坊节点(Infura/Alchemy)

好,咱们正式开始动手了。这一章我带你搭好开发环境。说白了,就是装好工具、建好项目、连上链。这三步走完,你就能跑通第一个索引流程。

我个人习惯先把环境搞干净再动手。你想想看,如果后面调试时发现是环境问题,那多冤枉。所以咱们一步步来,别急。

3.1 安装Graph CLI

Graph CLI 是 The Graph 的官方命令行工具。它的作用就是帮你创建、编译、部署子图。没有它,你几乎没法干活。

安装方式很简单,用 npm 全局安装就行:

npm install -g @graphprotocol/graph-cli

嗯,这里要注意。如果你用的是 Node.js 16 以下版本,可能会报错。我建议你至少用 Node.js 18 或 20。为什么?因为 Graph CLI 新版本已经放弃了对老 Node 的支持。我在项目中遇到过有人用 Node 14 装了半天装不上,最后升级版本就解决了。

装完之后,验证一下:

graph --version

如果看到版本号,比如 0.70.0 之类的,就说明装好了。

小技巧: 如果你在中国大陆,npm 安装可能慢。可以用淘宝镜像:npm config set registry https://registry.npmmirror.com。装完记得切回来,不然发布子图时可能出问题。

3.2 初始化项目

CLI 装好了,接下来创建子图项目。Graph CLI 提供了一个交互式初始化命令:

graph init --studio

运行后,它会问你几个问题:

  • 子图名称:比如 my-first-subgraph
  • 合约地址:你要索引的合约地址
  • 网络:比如 mainnetgoerli
  • ABI 文件路径:合约的 ABI 文件
  • 起始区块:从哪个区块开始索引

我个人习惯先准备好合约地址和 ABI 文件再跑这个命令。不然中途停下来去找,挺打断思路的。

举个例子,假设我要索引一个 Uniswap V3 的池子合约:

graph init --studio uniswap-v3-pool \
  --contract-name Pool \
  --contract-address 0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640 \
  --network mainnet \
  --abi ./abis/pool.abi.json \
  --start-block 12369621

命令跑完后,你会看到项目结构:

my-first-subgraph/
├── abis/           # 合约 ABI 文件
├── schema.graphql  # 数据模型定义
├── src/            # 映射逻辑(AssemblyScript)
├── subgraph.yaml   # 子图配置文件
├── package.json
└── tsconfig.json

这个结构很清晰。你主要改的就是 schema.graphqlsrc/ 里的映射文件。subgraph.yaml 是总配置文件,告诉 Graph 节点怎么处理你的数据。

避坑指南: 我曾经在初始化时忘了指定起始区块,结果索引器从创世块开始扫,扫了整整两天还没扫完。后来我查了合约的部署区块,指定了起始区块,几分钟就搞定了。所以起始区块一定要填对。

3.3 连接以太坊节点(Infura / Alchemy)

子图要读取链上数据,必须连一个以太坊节点。你不可能自己跑一个全节点,那太费劲了。所以一般用 Infura 或 Alchemy 这类节点服务商。

我个人更常用 Alchemy,因为它的免费额度更慷慨,而且 WebSocket 支持更稳定。但 Infura 也不错,看个人喜好。

3.3.1 注册并获取 API Key

步骤很简单:

  1. InfuraAlchemy 官网注册账号
  2. 创建一个项目(选 Ethereum 主网)
  3. 复制你的 API Key 或 HTTPS 端点

比如 Alchemy 的端点长这样:

https://eth-mainnet.g.alchemy.com/v2/你的API_KEY

Infura 的端点长这样:

https://mainnet.infura.io/v3/你的API_KEY

3.3.2 配置到子图项目

subgraph.yaml 里,你需要指定节点地址。但注意,Graph CLI 初始化时不会自动帮你填这个。你需要在 subgraph.yamldataSources 部分找到 network 字段,然后确保你的网络配置正确。

实际上,Graph CLI 在初始化时已经帮你配好了网络。你只需要在运行 graph deploy 时,通过环境变量或配置文件传入节点地址。

比如,在 .env 文件里写:

GRAPH_NODE_URL=https://api.thegraph.com/deploy/
IPFS_NODE_URL=https://api.thegraph.com/ipfs/
ETHEREUM_NODE_URL=https://eth-mainnet.g.alchemy.com/v2/你的API_KEY

然后运行部署命令时,Graph CLI 会自动读取这些环境变量。

小提示: 如果你只是本地测试,可以用 graph local-node 启动一个本地 Graph 节点。它会自动连一个模拟的以太坊节点。但说实话,我很少用这个,因为本地节点数据量太小,测不出真实效果。

3.3.3 测试连接

怎么知道节点连上了?你可以用 curl 测试一下:

curl https://eth-mainnet.g.alchemy.com/v2/你的API_KEY \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'

如果返回类似 {"jsonrpc":"2.0","result":"0x10f4c7a","id":1},就说明连上了。那个 0x10f4c7a 就是当前区块号(十六进制)。

嗯,这里要注意。如果你用的是 Infura 的免费版,每天有 10 万次请求限制。对于开发测试来说够用,但生产环境建议升级付费版。Alchemy 的免费版是 3 亿次/月,宽松很多。

3.4 验证环境是否就绪

最后,跑一个简单的编译命令,看看环境是否完整:

graph codegen
graph build

graph codegen 会根据你的 schema.graphql 生成 TypeScript 类型定义。graph build 会把 AssemblyScript 代码编译成 WASM。如果这两步都通过,说明你的开发环境已经准备好了。

总结一下: 装好 Graph CLI → 初始化项目 → 连上以太坊节点。这三步走完,你就可以开始写映射逻辑了。下一章我会带你写第一个实体和事件处理器。

我个人觉得,环境准备这一步虽然枯燥,但值得花时间做好。我见过太多人因为节点地址写错、ABI 文件不对、起始区块填错,浪费了好几个小时。你按我上面说的来,基本不会踩坑。

好,环境搭好了。咱们下一章见。