开发部署 FAQ
Last updated
Last updated
是的,强烈建议遵照HyperGraph 控制台页面上要求的格式命名您的子图。在添加子图时,只能填写小写字母,- 和数字 组成的名字,比如 subgraphdemo,dodoex-v2 等,而部署在HyperGraph 网络上的实际子图将为:“子图名称/公链名称”,也就是在控制台子图详情中显示的名字。如果所解析的合约在Heco网络上,子图名称为:“subgraphdemo/heco”, 如果是所解析的命约在BSC 网络上,而子图名称为:“subgraphdemo/bsc”。
目前HyperGraph 支持在 Heco 和BSC 等高性能区块链网络上的合约创建子图,后续将支持更多的网络,包括 Heco、BSC 的测试网、其他基于 EVM 的高性能区块链网络,甚至以太坊网络。
暂时HyperGraph 网络中的子图名称是全局唯一的。即使在不同的网络中,也不能有相同的名字。系统也会给出检测,请按提示操作。
不支持自行调整部署方式,如有特殊需求,请跟技术支持联系调整
暂时不提供子图部署改名或者删除。
子图索引的数据一般来源于合约,在合约中定义了事件,索引程序会根据合约检索区块,分析事件进行分析存储,形成查询数据源。正像在web3.js 中调用合约需要ABI等信息一样,在子图开发中同样是如此。
对于需要查询的数据,建议在合约中,使用事件(events)来进行关联。这是索引子图数据最为快捷的方式。也是强烈推荐的方式。
如果合约不包含事件,子图可以使用合约调用以及区块处理器来触发索引,但是这样的话,速度会慢很多。
另外,由于GraphQL会基于合约的事件生成查询实体,所以,在事件的参数中,参数名不要用id这样的定义,不然会跟实体自动生成的id字段名相冲突。
graph init 命令用于创建一个初始项目的脚手架,所以功能并不是很复杂,所以不支持多个合约创建子图。如果想添加多个合约,可以后续在配置文件中加入更多的数据源。
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" 进行有针对性的查询。
子图代码公开的情况下,可以基于其他项目的子图代码来进行数据查询与索引。
由于子图开发用 AssemblyScript 编写,所以并不能使用这类程序库,建议如果有其他的库需要调用数据,可以在数据存储之后,在查询端,使用你想要的库对数据进行调用。
在子图中,事件处理的顺序跟他们在区块中的顺序是一致的。跟所监听的合约个数、顺序等无关。
可以,通过引入 “graph-ts”,使用如下示例代码即可:
import { dataSource } from '@graphprotocol/graph-ts'
dataSource.network()
dataSource.address()
HyperGraph 的部署网络,已经进行了一定程度的部署优化,让用户可以快速添加子图和索引数据。对于用户自行添加的子图查询程序,强烈建议在 subgraph.yaml 中使用 startBlock ,以指定从某个区块开始进行索引。一般起始区块指定为合约创建所在的区块。
确实在某些业务中,一个应用或者页面,需要大量地用到查询请求,已经在规划与开发查询子图查询合并的网关,以实现子图查询的缓存、连接复用等,以提高查询的效率。
默认每个查询集合返回100条数据,如果想要查询更多数据,可以用分页式的查询代码,比如
someCollection(first: 1000, skip: <number>) { ... }
来最多一次查询1000条数据