Skip to main content
Graph Node 可以从任何 Ethereum JSON-RPC 端点索引 subgraph。将其指向 Node RPC 端点,即可使用事件处理器、调用处理器以及映射中的合约调用来索引公共网络。 本页使用 Graph Node 0.45.0 在 Ethereum Mainnet 上测试:一个包含事件处理器、USDC transfer(address,uint256) 调用处理器以及映射中 balanceOf 调用的 subgraph 从最近的一个区块开始索引,并始终与链头保持在一个区块以内。要改为索引网络的 fork 副本,请参见使用 The Graph 索引 Virtual Environment。

开始之前

  • 您所用网络的 Node RPC URL,可在 Tenderly Dashboard 中 Node RPC 的 Integrate 视图中获取
  • 一个 subgraph 以及 graph init 为其生成的 docker-compose.yml(参见设置 Graph Node 和 subgraph;对于公共网络,脚手架生成步骤相同)

配置 Ethereum 提供程序

在生成的 docker-compose.yml 中,将 graph-node 服务中的 ethereum 设置为 <network>:archive,traces:<Node RPC URL>。第一个冒号之前的网络名称必须与 subgraph.yaml 中的 network 一致。
docker-compose.yml(graph-node 的 environment)
Docker Compose 会从您的 shell 中替换 ${TENDERLY_NODE_ACCESS_KEY},因此访问密钥不会写入文件:
启动时,Graph Node 会为该提供程序记录 capabilities: archive, traces 和 Provider supports block receipts,后者表示它通过一个 eth_getBlockReceipts 请求获取区块的所有收据。 当 ethereum 值未声明任何能力时(mainnet:<url>),Graph Node 会假定两项能力都可用。请显式声明它们,使配置能够表明 subgraph 依赖哪些能力。 在公共网络上,请将 ETHEREUM_REORG_THRESHOLD 保持为默认值 250。Graph Node 使用它在网络发生重组时回退区块,因此不要照搬 Virtual Environment 设置中的值 1。

检查您的网络是否提供 trace_filter

调用处理器需要 trace_filter,但并非 Node RPC 上的每个网络都提供该方法。请针对最近的一个区块发出请求:
如果 result 中返回数组,说明调用处理器可以在该网络上使用。如果返回 the method trace_filter does not exist/is not available 或 Method not found 之类的错误,说明无法使用;请改用 eventHandlers 索引合约的事件。请以十六进制传入区块号,因为 trace_filter 会以 Invalid params 拒绝 latest 标签。

Graph Node 发送的请求

Graph Node 会持续轮询 Node RPC,因此即使没有 subgraph 出现新事件,每个被索引的网络也会产生请求。各类请求的成本请参见 Node RPC 定价。 在 Node RPC 上,调用处理器是典型 subgraph 中成本最高的部分,因为一次 trace 请求的成本高于一次读取或一次合约调用。如果合约针对同一操作会发出事件,请改为索引该事件。如果可以接受几秒的索引延迟,请调高 ETHEREUM_POLLING_INTERVAL 以降低轮询频率。

故障排除

相关内容