本文介绍了OpenZeppelin Subgraphs,它是一组用于轻松索引OpenZeppelin合约活动的模块。通过组合不同的模块和数据源,用户可以构建复杂的查询,以获取链上活动的信息,而无需编写大部分索引逻辑。文章还提供了关于如何构建manifest和组装schema的指导,并列出了可用的模块,如erc20、erc721、ownable等。
用于轻松索引 OpenZeppelin Contracts 活动的模块。
从 npm 安装为 @openzeppelin/subgraphs
。
在 GitHub 上浏览 OpenZeppelin/openzeppelin-subgraphs
。
Subgraph 使用三个组件描述:
graphql schema,通常命名为 schema.graphql
,它描述了数据库实体和链接。
subgraph manifest,通常命名为 subgraph.yaml
,它描述了应该监听的活动(合约地址、事件处理程序、函数处理程序)。
索引逻辑,用 assembly script 编写,它将处理区块链活动并相应地更新数据库。
OpenZeppelin Subgraphs 提供 schema 描述,以及相应的索引逻辑和用于构建 subgraph manifest 的模板。
类似于 OpenZeppelin Contracts 如何提供包含可以组合以简化应用程序构建的功能集的 solidity 代码,OpenZeppelin subgraphs 提供了专门用于索引与这些功能相对应的活动的模块。这些模块可以组合起来索引复杂的链上活动,而无需实际为大多数功能编写索引逻辑。
你可以使用为每个模块提供的模板为你的应用程序构建 manifest。这些模板在 src/datasource/<module-name>.yaml
中可用。对于每个 datasource,你将必须填写合约的名称、网络、地址和 startBlock。如果一个合约实现了多个模块,你将需要多个 datasources 监听相同的地址(每个模块一个)。
注意: 为了使索引逻辑起作用,对于使用的每个模块,你必须使用模块的名称命名你的一个 datasource。
@amxx/graphprotocol-utils
提供了 自动化生成 manifests 的工具。
根据你使用的模块,你的 schema 必须包含相应的实体。组装 schema 可能很困难,因为 graphql schema 本身不支持导入和合并操作。我们为 generated/<module-name>.schema.graphql
中的每个模块提供预编译的 schema。我们还提供一个 schema,其中包含 generated/all.schema.graphql
中所有模块的所有实体。
与 manifest 类似,@amxx/graphprotocol-utils
提供了 自动化生成 schemas 的工具。
模块名称 | 可用性 |
---|---|
erc20 | ✔ |
erc20votes | 计划中 |
erc721 | ✔ |
erc777 | 计划中 |
erc1155 | ✔ |
erc1967upgrade | ✔ |
ownable | ✔ |
accesscontrol | ✔ |
pausable | ✔ |
timelock | ✔ |
governor | ✔ |
通过在 subgraph 中组合多个模块和 datasources,你可以构建如下查询,该查询 检查具有 AccessControl 的 ERC20 token 的详细信息,并返回管理员的余额。
{
erc20Contract(id: "<erc20-with-accesscontrol-address-in-lowercase>") {
name
symbol
decimals
totalSupply { value }
asAccount {
asAccessControl {
admins: roles(where: { role: "0x0000000000000000000000000000000000000000000000000000000000000000" }) {
members {
account {
address: id
balance: ERC20balances(where: { contract: "<erc20-with-accesscontrol-address-in-lowercase>" }) {
value
}
}
}
}
}
}
}
}
- 原文链接: docs.openzeppelin.com/su...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!