将子图部署到 Legacy Explorer 上

将子图部署到 Legacy Explorer 上

原文作者 :The Graph 基金会

翻译 :The Graph 社区成员

转载地址:https://www.chainnews.com/articles/438124169229.htm


在上一节中,您了解了如何编写构成子图清单的文件,以及如何安装 Graph CLI 来为您的子图生成代码。现在是时候将子图部署到托管服务(或 Legacy Explorer)了。

创建一个 Legacy Explorer 账户

在使用托管服务之前,请在我们的 Legacy Explorer 中创建一个账户。你将需要一个 Github 账户;如果你没有,你需要先创建一个。然后,导航到 Legacy Explorer (https://thegraph.com/legacy-explorer/),点击 " 用 Github 注册 " 按钮,完成 Github 的授权流程。

存储访问令牌

创建一个账户后,导航到你的仪表板。复制仪表板上显示的访问令牌,并运行 graph auth --product hosted-service 。这将在你的电脑上存储访问令牌。你只需要这样做一次,或者在你重新生成访问令牌的时候。

在 Legacy Explorer 上创建一个子图

在部署子图之前,你需要在 Graph 浏览器中创建它。进入仪表板(https://thegraph.com/legacy-explorer/dashboard),点击 " 添加子图 " 按钮,并根据情况填写以下信息:

Image- 选择一个图像,作为子图的预览图像和缩略图。

Subgraph Nam e- 与创建子图的账户名称一起,这也将定义用于部署和 GraphQL 端点的 account-name/subgraph-name--风格的名称。这个字段以后不能改变。

Account- 创建子图的帐户。这可以是个人或组织的账户。子图以后不能在账户之间移动。

Subtitle- 将出现在子图卡中的文本。

Description- 子图的描述,在子图详情页上可见。

GitHub URL- GitHub 上子图仓库的链接。

Hide- 开启此功能后,子图会在 Graph 浏览器中被隐藏。

保存新的子图后,你会看到一个屏幕,上面有关于如何安装 Graph CLI、如何搭建新的子图以及如何部署子图的帮助。前两个步骤已在上一节中讲到。

在 Legacy Explorer 上部署一个子图

部署你的子图将上传你用 yarn build 构建的子图文件到 IPFS,并告诉 Graph Explorer 开始使用这些文件对你的子图进行索引。

你可以通过运行 yarn deploy 来部署子图。

在部署子图之后,Graph Explorer 将切换到显示你的子图的同步状态。根据需要从历史以太坊区块中提取的数据量和事件数量,从创世区块开始,同步可能需要几分钟到几小时。一旦 Graph 节点从历史区块中提取了所有数据,子图状态就会切换到 Synced。Graph 节点将继续为你的子图检查以太坊区块,因为这些区块已被开采。

重新部署一个子图

当对你的子图定义进行修改时,例如修复实体映射中的问题,再次运行上面的 yarn deploy 命令来部署你的子图的更新版本。任何子图的更新都需要 Graph Node 重新索引你的整个子图,同样从创世块开始。

如果你之前部署的子图仍然处于 Syncing 状态,它将立即被新部署的版本所取代。如果先前部署的子图已经完全同步,Graph Node 将把新部署的版本标记为 Pending Version,在后台进行同步,并且只有在同步新版本完成后才会用新版本替换当前部署的版本。这可以确保在新版本同步的时候,你有一个子图可以使用。

将子图部署到多个 Ethereum 网络中

在某些情况下,你会想把同一个子图部署到多个以太坊网络,而不重复它的所有代码。这方面的主要挑战是,这些网络上的合约地址是不同的。一个允许对合约地址等方面进行参数化的解决方案是使用像 Mustache (https://mustache.github.io/)或 Handlebars (https://handlebarsjs.com/)这样的模板系统来生成它的一部分。

为了说明这种方法,让我们假设一个子图应该使用不同的合同地址部署到 mainnet 和 Ropsten。然后你可以定义两个配置文件,为每个网络提供地址:

{  "network": "mainnet",  "address": "0x123..."}

{  "network": "ropsten",  "address": "0xabc..."}

与此同时,你可以用变量占位符{{network}}和{{address}}替换清单中的网络名称和地址,并将清单重命名为例如 subgraph.template.yaml:

...dataSources: - kind: ethereum/contract name: Gravity network: mainnet network: {{network}} source: address: '0x2E645469f354BB4F5c8a05B3b30A929361cf77eC' address: '{{address}}' abi: Gravity mapping: kind: ethereum/events

为了给这两个网络生成清单,你可以在 package.json 中添加两个额外的命令,以及对 mustache 的依赖:

{ ... "scripts": { ... "prepare:mainnet": "mustache config/mainnet.json subgraph.template.yaml > subgraph.yaml", "prepare:ropsten": "mustache config/ropsten.json subgraph.template.yaml > subgraph.yaml" }, "devDependencies": { ... "mustache": "^3.1.0" }}

要为 mainnet 或 Ropsten 部署这个子图,你现在只需运行以下两个命令之一:

Mainnet:yarn prepare:mainnet && yarn deploy # Ropsten:yarn prepare:ropsten && yarn deploy

这里(https://github.com/graphprotocol/example-subgraph/tree/371232cf68e6d814facf5e5413ad0fef65144759)可以找到一个工作实例。

注意:这种方法也可以应用于更复杂的情况,在这种情况下,有必要替代比合同地址和网络名称更多的东西,或者从模板中生成映射或 ABI 也是如此。

检查子图的健康状况

如果一个子图同步成功,这是一个很好的迹象,它将永远保持良好的运行。然而,链上的新触发器可能会导致你的子图遇到一个未经测试的错误条件,或者由于性能问题或节点操作者的问题,它可能开始落后。

Graph Node 暴露了一个 graphql 端点,你可以通过查询来检查你的子图的状态。在托管服务上,它可以在 https://api.thegraph.com/index-node/graphql。在本地节点上,它默认在 8030/graphql 端口可用。这个端点的完整模式可以在这里(https://github.com/graphprotocol/graph-node/blob/master/server/index-node/hide/schema.graphql)找到。下面是一个检查子图的当前版本状态的查询示例:

{ indexingStatusForCurrentVersion(subgraphName: "org/subgraph") { synced health fatalError { message block { number hash } handler } chains { chainHeadBlock { number } latestBlock { number } } }}

这将为 chainHeadBlock 您提供可以与 latestBlock 子图上的比较的 , 以检查它是否落后。synced 通知子图是否曾经赶上链。health 当前可以采用以下值:healthy 如果没有发生错误,或者 failed 是否存在停止子图进度的错误。在这种情况下,您可以检查该 fatalError 字段以获取有关此错误的详细信息。