开发 > 开发者常见问题

开发者常见问题

什么是子图?

链到本节

子图是基于区块链数据构建的自定义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. 如何从我的子图映射中调用合约函数,或访问公共状态变量?

链到本节

查看AssemblyScript API 部分中的访问智能合约 状态。

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

链到本节

不幸的是,目前这是不可能的。 graph init 旨在作为一个基本起点,然后您可以从中手动添加更多数据源。

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

链到本节
  • 图节点
  • graph-cli
  • graph-ts

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

链到本节

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

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

链到本节

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

14. 是否可以从事件处理程序中区分网络(主网、Goerli、本地)?

链到本节

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

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

15. 在Goerli上是否支持区块和调用处理程序?

链到本节

是的。Goerli支持区块处理程序、调用处理程序和事件处理程序。应该注意的是,事件处理程序的性能远远高于其他两个处理程序,并且在每个EVM兼容的网络上都支持它们。

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

链到本节

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

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

链到本节

可以。 subgraph.yaml 文件中的 dataSources.source.startBlock 可以用来指定数据源开始索引的区块的编号。 在大多数情况下,我们建议使用创建合约的区块,也就是开始区块。

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?

链到本节

如果您是子图开发人员,您可以使用 CLI 将新版本的子图升级到工作室。 届时子图将是私有的,但如果您对它感到满意,您可以发布到去中心化的 Graph浏览器。 这将创建一个新版本的子图,策展人可以开始对其发出信号。

编辑

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