本文详细介绍了如何使用 The Graph 创建和部署自定义 Subgraph,涵盖了 Web3 数据访问需求、GraphQL 的基本概念及 The Graph 的架构,并提供了详细的步骤说明和代码示例。文章适合具有基础以太坊开发知识的开发者,通过实际示例帮助读者理解如何与区块链数据高效交互。
tip
本指南将为你提供有关如何使用 The Graph 的托管服务创建和部署自定义 Subgraph 的深入步骤。如果你希望更快完成此任务,我们推荐使用 Hosted Subgraphs 附加组件。通过使用此附加组件,你将节省开发时间,并能够在几分钟内创建、部署和托管 Subgraph。不要忘记查看完整内容: 如何在 Zeeve 上运行托管的 Subgraph
Web3 的一个关键方面是需要有效和可靠地访问链上数据。以太坊,作为一个流行的智能合约平台,通过 JSON-RPC 提供对其区块链数据的访问,JSON-RPC 是一种远程过程调用 (RPC) 协议,以 JSON 格式编码数据。
虽然 JSON-RPC 是与以太坊数据交互的有效方式,但对于希望构建可扩展的 dApp 的开发者来说,可能并不总是最高效或用户友好的方法。这正是 The Graph 的用武之地。The Graph 是一个去中心化协议,旨在对难以直接查询的区块链数据进行索引和查询。
依赖项 | 版本 |
---|---|
node.js | 18.13.0 |
graph-cli | 0.49.0 |
The Graph 是一个旨在简化开发者访问区块链数据的去中心化协议。它提供了一种可靠且高效的方式,通过 GraphQL(一种由 Facebook 开发的开源查询语言)查询以太坊、IPFS 和其他支持网络的数据。The Graph 使开发者能够构建和发布自定义 “Subgraphs”,以定义如何对区块链数据进行索引和抓取,从而简化构建可扩展和高性能 dApp 的过程。
GraphQL 是一种查询语言和 API 的运行时,使开发者可以只请求他们所需的数据,同时接收可预测的响应。它允许开发者创建更高效且灵活的应用程序,能够指定响应数据的结构。这减少了过多提取和提取不足的情况,从而避免了不必要的数据传输和较慢的应用程序。
与传统的 REST APIs 相比,GraphQL 提供了一种更强大和灵活的方式与数据进行交互,使它成为在以太坊等区块链平台上构建 dApp 的极佳选择。
Subgraph 是对区块链数据进行有效支持查询的集合,经过特定方式进行索引。Subgraph 是使用 GraphQL 编程语言查询的。
让我们快速回顾一个已发布的 Subgraph,以便更好地理解它们的工作方式。访问此 链接,你将在 The Graph Playground 中看到以下查询:
{
blocks(first: 5) {
id
number
timestamp
parentHash
}
}
此查询使用 GraphQL 语言,调用以太坊主网的以太坊区块 Subgraph。GraphQL 查询请求区块链中前五个区块的数据。对于每个区块,它检索唯一标识符 (id
)、区块编号 (number
)、区块创建的时间 (timestamp
) 和区块父哈希 parentHash
。你可以单击播放按钮进行查询。花一点时间去做这件事。你应该能看到类似以下内容的输出:
关于此 Subgraph 的一些替代查询包括:
示例:按照 gasUsed 排序响应,并返回字段 timestamp、gasUsed 和 totalDifficulty。
{
blocks(orderBy: gasUsed) {
timestamp
gasUsed
totalDifficulty
}
}
尝试将上述查询复制粘贴到 Playground 中并进行请求。要通过 Playground 构建自己的查询,请单击右侧的文件夹图标,你可以查看你的 Subgraph 字典并选择/取消选择字段。这很有帮助,因为它显示了你可以按字段和格式查询 Subgraph 的所有可能内容。
在我们创建自定义 Subgraph 之前,让我们了解 The Graph 的架构,以便更好地理解它是如何运作的。我们还将介绍 The Graph 提供的不同产品。
开发者:在 The Graph 的上下文中,开发者指的是构建和部署需要访问区块链数据的去中心化应用(dApps)或服务的个人或实体。开发者利用 The Graph 高效地查询和检索来自各种区块链的数据,从而简化在区块链网络上构建强大应用的过程。
索引者:索引者参与 The Graph 协议,对来自不同区块链的数据进行索引和组织。索引者操作和维护索引节点,这些节点负责处理和存储以优化查询格式存储的数据。
策展人:策展人是识别有价值的 subgraph 并帮助策划 The Graph 去中心化数据市场中可用数据的个人或实体。
委托者:委托者是通过将其 Graph Tokens (GRT) 委托给特定索引者参与 The Graph 协议的个人。委托者不操作自己的基础设施,而是通过分配其 GRT 持有给索引者来支持索引者。
The Graph 提供的不同产品包括:
The Graph Explorer 是一个供你与已发布的 subgraphs 进行交互并查看其他市场参与者(如索引者、策展人和委托者)的门户。请花几分钟查看该网页。
你还可以使用位于 The Graph Explorer "Playground" 选项卡中的 GraphQL playground 来查询一个 subgraph。
Subgraph Studio 是一个专门用于创建和管理 subgraphs、集成元数据以及将其部署到 The Graph Explorer 的空间。
在接下来的部分中,我们将介绍在以太坊主网上创建一个自定义 subgraph 的步骤。
The Graph Hosted Service 作为一个免费的 Graph 节点索引器运作。它最初是为了增加 The Graph 的采纳者而创建的,但现在已被停用,然而请注意仍然可用于未在 The Graph 去中心化网络上支持的网络。
注意:在开始之前,请确保你有一个有资金的 Web3 钱包(拥有足够的 ETH 来支付矿工费用),例如 MetaMask 或任何其他 WalletConnect 兼容的 Wallet。
现在,要开始创建自己的自定义 subgraph,你需要遵循以下步骤:
首先,通过在终端中运行以下命令之一安装 Graph CLI:
npm:
npm install -g @graphprotocol/graph-cli
或通过 yarn:
yarn global add @graphprotocol/graph-cli
接下来,我们将创建一个新 subgraph。访问 The Graph Studio,连接你的钱包,然后点击 Create a subgraph。在我们的教程中,我们将分析一个已在以太坊主网上部署的 BAYC NFT 合约,因此我们将我们的 Subgraph 命名为 bayc。你可以填写其他字段,但这不是继续的必要条件。最后,点击 Save。
现在,在你的终端中运行以下命令:
graph init --studio bayc
系统会提示你几个问题。你可以按照以下答案的格式进行:
请注意,在此过程中,ABI 获取可能会失败(如上所示)。在这种情况下,你需要前往 Etherscan,找出合约部署的区块。在 Transfers 标签中导航到最后一页,这几乎总是合约创建交易。
如果你正在使用主网中的相同 BAYC 智能合约,请使用区块号 12287507。最后,你将拥有如下格式的项目目录:
现在让我们深入项目文件夹(例如 bayc)中的每个重要文件:
schema.graphql
就像建筑的蓝图。它定义了 The Graph 将要索引并进行查询的数据结构。它使用 GraphQL 架构定义语言 (SDL),这是描述数据形状的人类可读语法。在我们的例子中,它描述了 Subgraph 将从区块链处理的数据类型以及它们之间的关系。
subgraph.yaml
文件就像项目经理,协调蓝图与施工队之间的关系。它将 schema.graphql
和 src/mappings
联系在一起,指定哪些区块链事件应触发哪些处理函数。
在此文件中,你定义要在区块链上跟踪的智能合约、你感兴趣的合约中所发生的事件以及在这些事件被触发时应调用的处理函数。你还指定 Subgraph 的起始区块,即它应从哪个区块开始处理数据。从本质上讲,subgraph.yaml
作为配置文件,引导 Graph 节点查找所需数据,找到这些数据并进行处理。
如果 schema.graphql
是蓝图,则 src/mappings
目录就像按照蓝图建造结构的施工队。此目录包含了处理区块链数据并将其转换为 schema.graphql
定义的结构化数据的逻辑。
该逻辑是用 AssemblyScript(TypeScript 的一种变体)编写的,并响应区块链事件。你要跟踪的每个事件在此目录中都有一个相应的处理函数。例如,当区块链中发生新“交易”时,处理函数会处理原始交易数据,创建一个在 schema.graphql
中定义的新“交易”实体,并将其保存到 Graph 的数据库中。
在本教程中,我们不会自定义这些文件;不过,花几分钟时间查看代码后再继续。
接下来,让我们介绍部署过程。
部署你的 Subgraph 将花费一些 ETH,因为你将实际在以太坊上发布它(这将需要一次交易)。由于我们在以太坊主网上进行部署,我们只需要一些测试 ETH。现在,谁在支付你的 Subgraph 的托管费用?好问题。The Graph 目前运行托管服务,该服务是中心化的,最初是为更大的采用而构建的(最终将被停用)。我们将使用这个托管服务,因此我们不需要担心质押 GRT 来为我们的 Subgraph 发出信号。
我们需要在你的 Subgraph 草稿中显示的部署者密钥(例如,https://thegraph.com/studio/subgraph/bayc; 将 bayc 替换为你的 subgraph 名称)来进行部署。
获取密钥后,在终端中运行以下命令:
使用你的访问Token进行身份验证:
graph auth --studio <DEPLOY_KEY>
然后,进入 bayc 目录并编译 subgraph:
cd bayc
graph codegen && graph build
部署 Subgraph:
graph deploy --studio bayc
选择默认版本或你自己的版本。
你将看到类似以下内容的输出:
如果你在部署过程中遇到问题,比如 - Error: Failed to deploy to Graph node https://api.studio.thegraph.com/deploy/: Could not deploy subgraph on graph-node: subgraph validation error: [the specified block must exist on the Ethereum network] - 请尝试重新运行部署命令。
在部署你的 Subgraph 后,它将开始对数据进行索引,并可以通过 The Graph 的托管服务或去中心化的 Graph 节点操作员网络进行查询。根据你的 Subgraph 的大小,可能需要几分钟到几天的时间。在我们的示例中,可能需要约 1 小时。一旦同步成功,导航到你的 Subgraph 的 Playground 标签,并单击 Play 按钮进行查询。以下是一些示例查询:
返回转账中 from
、to
和 tokenId
字段,其中 from
字段是特定地址:
query MyQuery {
transfers(where: {from: "0x00774750C8017f3cF313BDA8a0780e98781f4330"}) {
from
to
id
}
}
返回转账中 transactionHash
、from
、to
和 tokenId
字段,其中区块号为 9020247,并按照 tokenId
排序。
query MyQuery {
transfers(where: {blockNumber: "18536882"}, orderBy: tokenId) {
transactionHash
from
to
tokenId
}
}
上面的截图查询来自钱包地址的转账,返回
from
、to
和tokenId
值。
在将你的 subgraph 部署到 Subgraph Studio 并进行了彻底测试后,你可以继续在 The Graph 的去中心化网络上将其发布到生产环境。这一操作使该 subgraph 可供策展人开始他们的策展活动,并供索引者启动索引过程。
为此,单击 Publish 按钮,选择网络,在我们的案例中是以太坊主网,并在你的 Web3 钱包中提交交易。
一旦发布,你或其他人都可以查询你的 subgraph。你还可以通过向绑定曲线存入 GRT 来为你的 subgraph 发信号,以向索引者表明该 subgraph 应被索引。
就是这样!你现在知道如何创建、部署、互动和发布你自己的自定义 Subgraph 在 The Graph 上。
此外,如果你想在此指南上构建,可以考虑以下想法:
所有权历史:跟踪该集合中每个 NFT 的所有权历史。这可能包括每次 NFT 转移或销售的信息,包括参与方、售价(如适用)和交易日期。
价格历史:与所有权历史类似,你可以跟踪每个 NFT 的价格历史。这对频繁交易的 NFT 收藏尤其有趣,因为这可以帮助识别 NFT 价值随时间的趋势。
元数据分析:许多 NFT 包含有关艺术品的元数据,例如艺术家的名字、创作日期,有时甚至包括更复杂的信息,如颜色方案或主题。你可以对这些元数据进行索引并使其可搜索,允许用户根据这些属性查找 NFT。
最活跃的交易者:通过跟踪谁买卖 NFT,你可以识别出该集合中最活跃的交易者。这对希望了解该 NFT 市场中关键参与者的潜在买家或卖家来说是有趣的。
想要了解更多吗?请查看以下资源列表:
The Graph 提供了一种强大、去中心化且高效的方式,以 GraphQL 访问区块链数据。通过创建自定义 subgraphs,开发者可以轻松在以太坊和其他支持的网络上构建可扩展和高性能的 dApp。
我们很想了解你正在构建的内容。请随时在 Discord 中与我们联系,或在 Twitter 上关注我们,以便随时获取最新信息!
如果你对本指南有任何反馈,请 告诉我们。我们期待你的回复。
- 原文链接: quicknode.com/guides/inf...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!