开发者常见问题
Reading time: 10 min
子图是基于区块链数据构建的自定义API。子图使用GraphQL查询语言进行查询,并使用Graph CLI部署到Graph节点。一旦部署并发布到Graph的去中心化网络,索引人就会处理子图,并使其可供子图消费者查询。
子图一旦创建就无法删除。
不可以。一旦创建子图,就不能更改名称。 请务必在创建子图之前仔细考虑这一点,以便其他 dapp 可以轻松搜索和识别它。
不可以。一旦创建了子图,就不能更改关联的 GitHub 账户。 在创建子图之前,请务必仔细考虑这一点。
强烈建议您构建智能合约,以使事件与您有兴趣查询的数据相关联。 子图中的事件处理程序由合约事件触发,是迄今为止检索有用数据的最快方式。
如果您正在使用的合约不包含事件,您的子图可以使用调用和区块处理程序来触发索引。 因为这样做会严重影响性能,所以不建议。
在多个网络的情况下,您将需要不同的名称。 虽然您不能在同一个名称下拥有不同的子图,但有一些方便的方法可以为多个网络提供一个代码库。 请在我们的文档中找到更多相关信息:
模板允许您在子图索引时动态创建数据源。 当人们与之交互时,您的合约可能会产生新的合约,并且由于您预先知道这些合同的架构(ABI、事件等),您可以定义您希望如何在模板中索引它们,当这些合约创建您的子图时将通过提供合约地址来创建动态数据源。
您可以运行以下命令:
docker pull graphprotocol/graph-node:latest
注意: docker / docker-compose 将始终使用您第一次运行时提取的任何 graph-node 版本,因此执行此操作非常重要,可以确保您使用的是最新版本的 graph-node。
Take a look at Access to smart contract
state inside the section .
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.
如果在事件期间只创建了一个实体并且没有更好的其他方法,那么交易hash + 日志索引的组合是唯一的。 您可以先将其转换为字节,然后将调用 crypto.keccak256
来混淆这些内容,但这不会使其更加独特。
在子图中,无论是否跨多个合约,事件始终按照它们在区块中出现的顺序进行处理的。
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()
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.
目前不能,因为映射是用 AssemblyScript 编写的。 一种可能的替代解决方案是将原始数据存储在实体中,并在客户端执行需要 JS 库的逻辑。
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:
是的,您应该看看可选的起始区块功能,以便从部署合约的区块开始索引:
是的! 请尝试以下命令,并将“organization/subgraphName”替换为发布的组织和子图名称:
curl -X POST -d '{ "query": "{indexingStatusForCurrentVersion(subgraphName: \"organization/subgraphName\") { chains { latestBlock { hash number }}}}"}' https://api.thegraph.com/index-node/graphql
您必须重新部署子图,但如果子图 ID(IPFS hash)没有更改,则不必从头开始同步。
虽然我们确实希望在未来支持联合(Federation),但目前还不支持。 目前,您可以在客户端或通过代理服务使用模式拼接。
默认情况下,每个集合的查询响应限制为 100 个项目。 如果您想收到更多,则每个收藏最多可以包含 1000 个项目,并且可以使用以下查询进行分页:
someCollection(first: 1000, skip: <number>) { ... }
目前,推荐的 dapp 方法是将密钥添加到前端并将其公开给最终用户。 也就是说,您可以将该键限制为主机名,例如 yourdapp.io 和子图。 网关目前由 Edge & Node 运营。 网关的部分职责是监控滥用行为,并阻止来自恶意客户端的流量。
请前往托管服务,查找您或其他人部署到托管服务的子图。 您可以在找到托管服务。
Graph 永远不会对托管服务收费。 Graph 是一个去中心化的协议,中心化服务的收费与 Graph 的价值观不一致。 托管服务始终是帮助进入去中心化网络的临时步骤。 开发人员将有足够的时间在他们适宜时迁移到去中心化网络。
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.
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.