10 分钟
开发者常见问题
本页总结了开发者在The Graph上最常见的一些问题。
子图相关的
1. 什么是子图?
子图是基于区块链数据构建的自定义API。子图使用GraphQL查询语言进行查询,并使用Graph CLI部署到Graph节点。一旦部署并发布到Graph的去中心化网络,索引人就会处理子图,并使其可供子图消费者查询。
2. 创建子图的第一步是什么?
要成功创建子图,您需要安装Graph CLI。请检查快速启动 以开始操作。 详情请查看创建子图。
3. 如果我的智能合约没有事件,还能创建子图吗?
强烈建议您构建智能合约,以使事件与您有兴趣查询的数据相关联。 子图中的事件处理程序由合约事件触发,是迄今为止检索有用数据的最快方式。
如果您正在使用的合约不包含事件,您的子图可以使用调用和区块处理程序来触发索引。 因为这样做会严重影响性能,所以不建议。
4. 可以更改与我的子图关联的 GitHub 账户吗?
不可以。一旦创建了子图,就不能更改关联的 GitHub 账户。 在创建子图之前,请务必仔细考虑这一点。
5. 如何升级主网上的子图?
如果您是子图开发人员,您可以使用 CLI 将新版本的子图升级到工作室。 届时子图将是私有的,但如果您对它感到满意,您可以发布到去中心化的 Graph浏览器。 这将创建一个新版本的子图,策展人可以开始对其发出信号。
6. 是否可以在不重新部署的情况下,将子图复制到另一个账户或端点?
您必须重新部署子图,但如果子图 ID(IPFS hash)没有更改,则不必从头开始同步。
7. 如何从我的子图映射中调用合约函数,或访问公共状态变量?
查看AssemblyScript API中的访问智能合约
状态。
8. 我可以将 ethers.js
或其他 JS 库导入到子图映射吗?
目前不行,因为映射是在 AssemblyScript 中写的。
一个可能的解决办法是将原始数据存储在实体中,并执行需要客户端上的 JS库的逻辑。
9. 在监听多项合约时,是否可以选择听取事件的合约命令?
在子图中,无论是否跨多个合约,事件始终按照它们在区块中出现的顺序进行处理的。
10. 模板与数据源有何不同?
模板允许您在子图索引时动态创建数据源。 当人们与之交互时,您的合约可能会产生新的合约,并且由于您预先知道这些合约的架构(ABI、事件等),您可以定义您希望如何在模板中索引它们。当这些合约已生成,您的子图将通过提供合约地址来创建动态数据源。
查看“实例化数据源模板”部分:数据源模板。
11. 是否可以使用graph-cli
中的graph-init
和两个合约来设置一个子图?或者,在运行graph-init
后,我应该在subgraph.yaml
中手动添加另一个数据源吗?
是的。在graph init
命令中,您可以通过输入合约来添加多个数据源。
您也可以使用 grap add
命令来添加新的数据源。
12. 事件、方块和调用处理程序触发到数据源的顺序是什么?
事件和调用处理程序,首先是按区块内的交易索引排序的。 在同一交易中的事件和调用处理程序是通过常规订购的:事件处理程序先进行,然后调用处理程序, 每种类型遵守清单中定义的顺序。 区块处理程序是在事件和调用处理程序之后运行的,其顺序是在清单中定义的。 这些排序规则也可能会有变化。
注意:当创建新的动态数据源时,为动态数据源定义的处理程序只会在所有现有数据源处理程序处理完毕后开始处理,并且每次触发时都会按相同的顺序重复处理。
13. 如何确保我使用最新版本的 graph-节点 进行本地部署?
您可以运行以下命令:
1docker pull graphprotocol/graph-node:latest
注意: docker / docker-compose 将始终使用您第一次运行时提取的任何 graph-node 版本,因此执行此操作非常重要,可以确保您使用的是最新版本的 graph-node。
14. 在处理事件时,为实体构建“自动生成”id 的推荐方法是什么?
如果在事件期间只创建了一个实体并且没有更好的其他方法,那么交易hash + log索引的组合是唯一的。 您可以先将其转换为字节,然后将调用 crypto.keccak256
来混淆这些内容,但这不会使其更加独特。
15. 我可以删除我的子图吗?
网络相关的问题
16. The Graph 支持哪些网络?
您可以在这里找到支持的网络。
17. 是否可以从事件处理程序中区分网络(主网、Sepolia、本地)?
是的,您可以通过下面的示例导入graph-ts
来完成这项工作:
1import { dataSource } from '@graphprotocol/graph-ts'23dataSource.network()4dataSource.address()
18. 您是否支持Sepolia上的区块和调用处理程序?
是的,Sepolia 支持区块处理器、调用处理器和事件处理器。 应当指出,事件处理器的性能远远超过其他两个处理器,并且在每个EVM兼容的网络上得到支持。
索引和查询相关内容
19. 是否可以指定从哪个特定区块开始索引?
是的,subgraph.yaml
文件中的dataSources.source.startBlock
可以指定数据源开始索引的区块编号。 在大多数情况下,我们建议使用创建合约的区块:开始区块。
20. 有没有一些提高索引性能的技巧? 子图需要很长时间才能同步。
是的,您应该看看可选的起始区块功能,以便从部署合约的区块开始索引:起始区块。
21. 有没有办法直接查询子图,来确定它索引的最新区块号是多少?
是的! 请尝试以下命令,并将“organization/subgraphName”替换为发布的组织和子图名称:
1curl -X POST -d '{ "query": "{indexingStatusForCurrentVersion(subgraphName: \"organization/subgraphName\") { chains { latestBlock { hash number }}}}"}' https://api.thegraph.com/index-node/graphql
22. The Graph 每次查询可以返回多少个对象有限制吗?
默认情况下,每个集合的查询响应限制为 100 个项目。 如果您想收到更多,则每个收藏最多可以包含 1000 个项目,并且可以使用以下查询进行分页:
1someCollection(first: 1000, skip: <number>) { ... }
23. 如果我的 dapp 前端使用The Graph 进行查询,我是否需要将我的查询密钥直接写入前端? 如果我们为用户支付查询费用,恶意用户会不会导致我们的查询费用非常高?
目前,推荐的 dapp 方法是将密钥添加到前端并将其公开给最终用户。 也就是说,您可以将该键限制为主机名,例如yourdapp.io 和子图。 网关目前由 Edge & Node 运营。 网关的部分职责是监控滥用行为,并阻止来自恶意客户端的流量。
其他
24. 可以在 graph节点之上使用 Apollo Federation 吗?
尚不支持Federation。目前,您可以在客户端或通过代理服务使用Schema stiching。