开发部署 FAQ

1、子图创建命名对格式是有要求的吗?

是的,强烈建议遵照HyperGraph 控制台页面上要求的格式命名您的子图。在添加子图时,只能填写小写字母,- 和数字 组成的名字,比如 subgraphdemo,dodoex-v2 等,而部署在HyperGraph 网络上的实际子图将为:“子图名称/公链名称”,也就是在控制台子图详情中显示的名字。如果所解析的合约在Heco网络上,子图名称为:“subgraphdemo/heco”, 如果是所解析的命约在BSC 网络上,而子图名称为:“subgraphdemo/bsc”。

2、现在支持在哪些网络创建子图?

目前HyperGraph 支持在 Heco 和BSC 等高性能区块链网络上的合约创建子图,后续将支持更多的网络,包括 Heco、BSC 的测试网、其他基于 EVM 的高性能区块链网络,甚至以太坊网络。

3、在不同的网络是否支持同样的子图名称?

暂时HyperGraph 网络中的子图名称是全局唯一的。即使在不同的网络中,也不能有相同的名字。系统也会给出检测,请按提示操作。

4、是否可以更改部署类型,比如开始是Github 类型,调整成为API方式部署?

不支持自行调整部署方式,如有特殊需求,请跟技术支持联系调整

5、是否支持子图部署改名或者删除?

暂时不提供子图部署改名或者删除。

6、子图索引的数据源来自于哪里?

子图索引的数据一般来源于合约,在合约中定义了事件,索引程序会根据合约检索区块,分析事件进行分析存储,形成查询数据源。正像在web3.js 中调用合约需要ABI等信息一样,在子图开发中同样是如此。

7、要进行数据查询,对于合约编写有何建议?

对于需要查询的数据,建议在合约中,使用事件(events)来进行关联。这是索引子图数据最为快捷的方式。也是强烈推荐的方式。

如果合约不包含事件,子图可以使用合约调用以及区块处理器来触发索引,但是这样的话,速度会慢很多。

​另外,由于GraphQL会基于合约的事件生成查询实体,所以,在事件的参数中,参数名不要用id这样的定义,不然会跟实体自动生成的id字段名相冲突。

8、graph init 能支持多个合约创建子图吗?

graph init 命令用于创建一个初始项目的脚手架,所以功能并不是很复杂,所以不支持多个合约创建子图。如果想添加多个合约,可以后续在配置文件中加入更多的数据源。

9、我想获得数据索引的状态,有办法吗?

HyperGraph 在控制台提供了各个网络的健康状态查询功能。

Heco 网络是: https://h.hg.network/graphql/playground

BSC 网络是:https://ph.hg.network/graphql/playground

查询的典型 GraphQL 是:

{

indexingStatusesForSubgraphName(subgraphName:"pancakeswap/blocks") {

subgraph

health

synced

fatalError {

handler

message

deterministic

}

nonFatalErrors {

handler

}

chains {

chainHeadBlock {

number

__typename

}

latestBlock {

number

__typename

}

}

}

}

你可以将上述代码中的“pancakeswap/blocks”换成你想要的子图进行查询。

如果有多个版本,也可以将上述查询中的 indexingStatusesForSubgraphName 替换成为: "indexingStatusForCurrentVersion" 或 "indexingStatusForPendingVersion" 进行有针对性的查询。

10、我能否使用其他项目的子图代码进行索引?

子图代码公开的情况下,可以基于其他项目的子图代码来进行数据查询与索引。

11、我能否在子图开发中使用 ethers.js 等开发程序库?

由于子图开发用 AssemblyScript 编写,所以并不能使用这类程序库,建议如果有其他的库需要调用数据,可以在数据存储之后,在查询端,使用你想要的库对数据进行调用。

12、子图中对于合约事件的处理顺序是什么样的?

在子图中,事件处理的顺序跟他们在区块中的顺序是一致的。跟所监听的合约个数、顺序等无关。

13、在代码中可以取得数据源的网络和合约地址等信息吗?

可以,通过引入 “graph-ts”,使用如下示例代码即可:

import { dataSource } from '@graphprotocol/graph-ts'

dataSource.network()

dataSource.address()

14、有什么提高子图索引性能的做法?

HyperGraph 的部署网络,已经进行了一定程度的部署优化,让用户可以快速添加子图和索引数据。对于用户自行添加的子图查询程序,强烈建议在 subgraph.yaml 中使用 startBlock ,以指定从某个区块开始进行索引。一般起始区块指定为合约创建所在的区块。

15、有没有对子图查询合并查询的计划?

确实在某些业务中,一个应用或者页面,需要大量地用到查询请求,已经在规划与开发查询子图查询合并的网关,以实现子图查询的缓存、连接复用等,以提高查询的效率。

16、查询时最多可以取回多少条数据?

默认每个查询集合返回100条数据,如果想要查询更多数据,可以用分页式的查询代码,比如

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

来最多一次查询1000条数据

Last updated