开发 > 开发者常见问题

开发者常见问题

Reading time: 10 min

什么是子图?

链到本节

子图是基于区块链数据构建的自定义API。子图使用GraphQL查询语言进行查询,并使用Graph CLI部署到Graph节点。一旦部署并发布到Graph的去中心化网络,索引人就会处理子图,并使其可供子图消费者查询。

2. 我可以删除我的子图吗?

链到本节

子图一旦创建就无法删除。

3. 我可以更改我的子图名称吗?

链到本节

不可以。一旦创建子图,就不能更改名称。 请务必在创建子图之前仔细考虑这一点,以便其他 dapp 可以轻松搜索和识别它。

4. 我可以更改与我的子图关联的 GitHub 账户吗?

链到本节

不可以。一旦创建了子图,就不能更改关联的 GitHub 账户。 在创建子图之前,请务必仔细考虑这一点。

5. 如果我的智能合约没有事件,还能创建子图吗?

链到本节

强烈建议您构建智能合约,以使事件与您有兴趣查询的数据相关联。 子图中的事件处理程序由合约事件触发,是迄今为止检索有用数据的最快方式。

如果您正在使用的合约不包含事件,您的子图可以使用调用和区块处理程序来触发索引。 因为这样做会严重影响性能,所以不建议。

6. 是否可以在多个网络上部署同名的子图?

链到本节

在多个网络的情况下,您将需要不同的名称。 虽然您不能在同一个名称下拥有不同的子图,但有一些方便的方法可以为多个网络提供一个代码库。 请在我们的文档中找到更多相关信息:重新部署子图

7. 模板与数据源有何不同?

链到本节

模板允许您在子图索引时动态创建数据源。 当人们与之交互时,您的合约可能会产生新的合约,并且由于您预先知道这些合同的架构(ABI、事件等),您可以定义您希望如何在模板中索引它们,当这些合约创建您的子图时将通过提供合约地址来创建动态数据源。

请查看“实例化数据源模板”部分:数据源模板

8. 如何确保我使用最新版本的 graph-node 进行本地部署?

链到本节

您可以运行以下命令:

docker pull graphprotocol/graph-node:latest

注意: docker / docker-compose 将始终使用您第一次运行时提取的任何 graph-node 版本,因此执行此操作非常重要,可以确保您使用的是最新版本的 graph-node。

9. 如何从我的子图映射中调用合约函数,或访问公共状态变量?

链到本节

Take a look at Access to smart contract state inside the section AssemblyScript API.

10. 是否可以使用 graph-cli 中的 graph init 和两个合约来设置子图? 还是应该在运行 graph init 之后在 subgraph.yaml 中手动添加另一个数据源?

链到本节

Yes. On graph init command itself you can add multiple datasources by entering contracts one after the other. You can also use graph add command to add new datasource.

11. 我想向 GitHub 贡献代码或者添加 issue,在哪里可以找到相关代码?

链到本节
  • 图节点
  • graph-tooling
  • graph-docs
  • graph-client

12. 在处理事件时,为实体构建“自动生成”id 的推荐方法是什么?

链到本节

如果在事件期间只创建了一个实体并且没有更好的其他方法,那么交易hash + 日志索引的组合是唯一的。 您可以先将其转换为字节,然后将调用 crypto.keccak256 来混淆这些内容,但这不会使其更加独特。

13、监听多个合约时,是否可以选择监听事件的合约顺序?

链到本节

在子图中,无论是否跨多个合约,事件始终按照它们在区块中出现的顺序进行处理的。

14. Is it possible to differentiate between networks (mainnet, Sepolia, local) from within event handlers?

链到本节

是的。 您可以按照以下示例通过导入 graph-ts 来做到这一点:

import { dataSource } from '@graphprotocol/graph-ts'
dataSource.network()
dataSource.address()

15. Do you support block and call handlers on Sepolia?

链到本节

Yes. Sepolia supports block handlers, call handlers and event handlers. It should be noted that event handlers are far more performant than the other two handlers, and they are supported on every EVM-compatible network.

16. 我可以将 ethers.js 或其他 JS 库导入我的子图映射吗?

链到本节

目前不能,因为映射是用 AssemblyScript 编写的。 一种可能的替代解决方案是将原始数据存储在实体中,并在客户端执行需要 JS 库的逻辑。

17. 是否可以指定从哪个特定区块开始索引?

链到本节

Yes. dataSources.source.startBlock in the subgraph.yaml file specifies the number of the block that the data source starts indexing from. In most cases, we suggest using the block in which the contract was created: Start blocks

18. 有没有一些提高索引性能的技巧? 子图需要很长时间才能同步。

链到本节

是的,您应该看看可选的起始区块功能,以便从部署合约的区块开始索引:起始区块

19. 有没有办法直接查询子图,来确定它索引的最新区块号是多少?

链到本节

是的! 请尝试以下命令,并将“organization/subgraphName”替换为发布的组织和子图名称:

curl -X POST -d '{ "query": "{indexingStatusForCurrentVersion(subgraphName: \"organization/subgraphName\") { chains { latestBlock { hash number }}}}"}' https://api.thegraph.com/index-node/graphql

20. Graph 支持哪些网络?

链到本节

您可以在这里找到支持的网络列表。

21. 是否可以在不重新部署的情况下,将子图复制到另一个账户或端点?

链到本节

您必须重新部署子图,但如果子图 ID(IPFS hash)没有更改,则不必从头开始同步。

22. 可以在 graph节点之上使用 Apollo Federation 吗?

链到本节

虽然我们确实希望在未来支持联合(Federation),但目前还不支持。 目前,您可以在客户端或通过代理服务使用模式拼接。

23. Graph 每次查询可以返回多少个对象有限制吗?

链到本节

默认情况下,每个集合的查询响应限制为 100 个项目。 如果您想收到更多,则每个收藏最多可以包含 1000 个项目,并且可以使用以下查询进行分页:

someCollection(first: 1000, skip: <number>) { ... }

24. 如果我的 dapp 前端使用Graph 进行查询,我是否需要将我的查询密钥直接写入前端? 如果我们为用户支付查询费用,恶意用户会不会导致我们的查询费用非常高?

链到本节

目前,推荐的 dapp 方法是将密钥添加到前端并将其公开给最终用户。 也就是说,您可以将该键限制为主机名,例如 yourdapp.io 和子图。 网关目前由 Edge & Node 运营。 网关的部分职责是监控滥用行为,并阻止来自恶意客户端的流量。

25. Where do I go to find my current subgraph on the hosted service?

链到本节

请前往托管服务,查找您或其他人部署到托管服务的子图。 您可以在这里找到托管服务。

26. Will the hosted service start charging query fees?

链到本节

Graph 永远不会对托管服务收费。 Graph 是一个去中心化的协议,中心化服务的收费与 Graph 的价值观不一致。 托管服务始终是帮助进入去中心化网络的临时步骤。 开发人员将有足够的时间在他们适宜时迁移到去中心化网络。

27. How do I update a subgraph on mainnet?

链到本节

If you’re a subgraph developer, you can deploy a new version of your subgraph to Subgraph Studio using the CLI. It’ll be private at that point, but if you’re happy with it, you can publish to the decentralized Graph Explorer. This will create a new version of your subgraph that Curators can start signaling on.

28. In what order are the event, block, and call handlers triggered for a data source?

链到本节

Event and call handlers are first ordered by transaction index within the block. Event and call handlers within the same transaction are ordered using a convention: event handlers first then call handlers, each type respecting the order they are defined in the manifest. Block handlers are run after event and call handlers, in the order they are defined in the manifest. Also these ordering rules are subject to change.

When new dynamic data source are created, the handlers defined for dynamic data sources will only start processing after all existing data source handlers are processed, and will repeat in the same sequence whenever triggered.

编辑

上页
单元测试框架
下页
基于Substreams的子图
编辑