跳至内容
0%

什么是 subgraph?(指南)

Logan Ross headshot

作者 Logan Ross

发布于 2023年9月26日2 分钟阅读

子图(Subgraph)聚合特定应用的区块链数据,供全栈开发者快速访问。

区块链按时间顺序记录数据,不区分具体应用。过去,开发者如果想展示与自己智能合约相关的信息,只能使用 JSON-RPC 逐块、逐笔交易地搜索。

子图为开发者提供了一种简单的方法来实时访问链上数据,使开发者能够为用户创建有用的应用交互。

本文将探讨子图,包括其功能、常见应用、优势、可用的服务提供方,以及帮助开发者入门使用子图的资源。

什么是子图?

子图聚合特定应用的区块链数据,供前端开发者快速访问。

子图通过 GraphQL API 向开发者开放,允许用户实时查询其合约上发生的交易数据。对于需要构建健壮前端界面的复杂自定义智能合约的开发者来说,子图尤其有用。

例如,要查询 Uniswap v3 某个流动性池在过去 24 小时内的所有交易,Uniswap 只需定义其模式(schema),对事件数据建立索引以创建子图,然后使用生成的 GraphQL API 查询该子图,即可灵活高效地获取区块链数据。

子图允许开发者根据自身需求对数据进行过滤和排序,只提取对其 dapp 重要的信息。子图还通过预编译和索引数据来加快查询速度,从而实现更高效的数据查询,而不必直接向全节点或存档节点请求数据。

子图是如何工作的?

子图的“映射(mapping)”是一种脚本,它根据子图的“清单(manifest)”指示节点从每个新发现的区块中提取相关数据。这些新数据随后会被添加到子图中,并按照子图“模式(schema)”的定义,通过 GraphQL 调用提供给开发者。

首先,我们需要理解子图的基本结构、其组成部分,以及它们之间是如何交互的。

什么是子图清单?

清单包含数据源、模板以及一些子图元数据(例如描述、代码仓库等)的信息。清单定义了子图所索引的智能合约、这些智能合约上的相关事件,以及如何将事件数据转换为 Graph 节点存储并可查询的实体。

什么是子图模式?

模式说明了子图数据的组织方式,以及如何使用 GraphQL 对其进行查询。模式应定义实体以及每个实体的结构化数据。

例如,如果你正在为 Uniswap v3 流动性池创建一个用于实时分析的子图,你的实体可能是一个流动性池,模式则会定义该池的资产、名称、智能合约地址、手续费等信息。

什么是子图映射?

映射是 AssemblyScript 代码,每当服务器发现清单中指定的事件时就会被调用。映射定义了事件处理程序,负责转换来自事件或调用的数据,并将其保存到 Graph 节点存储中。

子图的常见用例有哪些?

子图常用于 DeFi、NFT、DAO 以及其他各类链上应用。

自定义智能合约索引

想要为自定义智能合约(尤其是那些不遵循 ERC1155 或 ERC721 NFT 等标准的合约)建立数据索引的区块链应用开发者,是子图的常见创建者。对于构建带有搜索、过滤等功能的前端用户界面的开发者来说,自定义索引也尤为重要。

去中心化金融(DeFi)

DeFi 子图常用于应用中,以索引和查询代币价格、汇率、流动性和交易量等区块链数据。使用子图的 DeFi 应用可以让用户实时访问最新数据,实现高效的交易和其他金融操作。

非同质化代币(NFT)

NFT 子图可用于索引和查询 NFT 数据,例如所有权、来源以及交易历史,并结合链下数据使用。这有助于 NFT 交易市场及其他应用为买卖和交易 NFT 的用户提供更流畅的体验。

去中心化自治组织(DAO)

与中心化机构不同,去中心化自治组织(即 DAO)是由分布式社区运作的组织。由于大多数 DAO 决策都发生在链上,DAO 子图对于让成员能够正确投票和审查数据至关重要。

游戏

基于区块链的游戏通常需要实时访问用户账户余额、游戏状态和游戏内物品等数据。这些数据可以通过子图进行索引和查询,从而实现更高效、响应更迅速的游戏玩法及其他功能。

使用子图构建应用有哪些优势?

对于全栈开发者来说,子图是一种非常简单的区块链数据索引范式。写一些 AssemblyScript 代码即可上手!对于托管方案,它自带后端,因此开发者无需自行运行数据库和服务器。

以下是使用子图构建应用的其他一些优势:简单性、兼容性和韧性。

1. 子图的简单性

子图是可供查询的、特定应用的数据数据库。使用托管子图作为数据后端,可以为开发者节省自建数据库所需的时间和开销。

子图分别使用 AssemblyScript 和 GraphQL 进行定义和访问。对于全栈开发者来说,这些通常是熟悉的范式,这使得子图对刚接触 web3 的开发者也很容易上手。

2. 与多条区块链兼容

子图的一大优势在于可以与众多兼容 EVM 的区块链网络配合使用,使开发者能够从多个来源获取数据。因此,去中心化应用可以被设计为跨多个区块链网络运行,从而提高灵活性和可扩展性。

虽然每个子图只从一条链拉取数据,但开发者可以使用相似的模式和映射,以极低的工程成本在不同支持的区块链网络上部署子图。借助 graph-cli 或支持此功能的服务提供方,子图查询也可以实现跨链。

3. 更高的安全性和韧性

使用去中心化索引协议来查询子图,让开发者可以选择为其应用维持全栈去中心化。虽然使用去中心化版本与托管版本的子图在性能上存在取舍,但拥有多种选择可以让开发者根据自身具体用例进行优化。

借助去中心化索引器,应用可以通过运行来自不同提供方的多个子图,减少对单一数据源的依赖,从而降低因单一来源遭受攻击或宕机而受到影响的风险。Graph 协议就提供了此类服务。

子图也可以被设计用来过滤掉潜在的有害数据,从而为应用增加一层额外的保护。通过运行多个子图,可以使应用的数据基础设施更加安全和具有韧性。

使用子图构建应用有哪些取舍?

虽然现有的子图使用起来很简单,但创建和调试子图可能比较复杂,而且可能存在成本或设计上的限制。

1. 子图的开发与调试

要有效使用子图,开发者必须学习一个复杂的生态系统,并应对由于工具和可见性不足而带来的子图调试难题。使用子图构建应用的另一个挑战是,映射会被转译为 WebAssembly,这增加了调试子图的难度!

2. 定制化的局限性

虽然子图在索引哪些数据以及如何查询方面提供了很大的灵活性,但其定制化程度可能有限。如果一个 dapp 对索引或查询有非常严格的要求,可能就需要完全定制的数据索引和转换方案。

3. 成本

对于需要在新技术方案之间做出选择的应用开发者来说,成本是一个重要的决定因素。虽然与 JSON-RPC 相比,使用子图可以让查询区块链数据更容易、更快捷,但它也会带来附加成本,包括为索引和查询服务付费,这些费用会随着时间累积。

4. 索引速度

数据量大的应用开发者通常将索引速度列为使用子图时的挑战之一。索引速度不仅会随数据量和复杂度变化,还会因所使用的索引方案不同而有所差异。

有哪些优秀的子图服务提供方?

该领域较为知名的提供方包括 The Graph、Goldsky 和 ChainStack。

The Graph

The Graph 让开发者能够以可扩展且具有成本效益的方式生成和查询区块链数据的子集。

子图提供方可以利用 The Graph 的工具和基础设施来创建、部署和维护子图,开发者可以使用 The Graph 的 GraphQL API 轻松查询这些子图。The Graph 中的子图服务旨在具备灵活性和可配置性,使开发者能够对任意区块链或数据源的数据进行索引和查询。

将子图部署到 The Graph 主要有三种方式:

  1. 自托管
  2. The Graph 托管服务
  3. Subgraph Studio

1. 自托管

开发者可以自行托管构成子图生态系统的各个组件(`graph-node` 代码库),并将自己的子图部署到这个自托管系统中。

2. The Graph 的托管服务

如果开发者不想运行自己的基础设施,可以将子图免费部署到 The Graph 托管服务上。对于新团队和小团队来说,这是一个不错的选择,因为它使用简单,而且可以容忍较低的可靠性和较慢的速度。不过,The Graph 的托管服务目前正在被弃用

3. Subgraph Studio

开发者可以通过 Subgraph Studio 产品将子图部署到 The Graph 的去中心化网络中,该方式涉及 The Graph 的代币。不过,这种部署方式并不支持托管方案的所有功能(例如不支持 IPFS 功能,且支持的链更少)。

Goldsky

Goldsky 让工程师能够为其应用创建实时数据流,同时无需管理复杂的区块链和数据流基础设施。Goldsky 可以对区块链或子图进行索引,按你的需求转换数据,并将结果实时流式传输到数据仓库、webhook 或 API。

Chainstack

Chainstack Subgraphs 是一款速度极快、可用于生产环境的子图部署方案,无需经历质押、委托和/或奖励子图索引等繁琐流程即可使用。你可以依靠 Chainstack 获得快速索引和持续的数据可用性。

子图开发资源

以下列出了一些有助于开发者入门子图开发的资源:

1. The Graph 文档

The Graph 文档 是一份全面的资源,为开发者提供了开始构建去中心化应用子图所需的全部知识。它提供了详尽的说明、教程和参考资料,涵盖从搭建开发环境到部署和查询子图的方方面面。

2. 子图示例

The Graph 的官方 Github 代码仓库中包含了用于索引和查询区块链网络数据(包括 Ethereum、Polygon、IPFS 等)的子图实现示例。它提供了一个简单的子图模板以及示例代码,可根据特定 dapp 的需求进行定制。

3. Messari 标准子图

Messari子图代码仓库为开发者提供了多种预构建子图,用于分析来自 Ethereum、BNB Chain 等知名区块链网络的数据。它提供了历史价格数据、链上指标等多种功能,对于希望利用子图的开发者来说是一项有价值的资源。

我应该使用子图吗?

如果你有想要监控的自定义智能合约,那么构建一个子图对你来说可能是一个不错的解决方案。

子图聚合特定应用的区块链数据,供前端开发者快速访问。

Background gradient

构建区块链应用

Alchemy 将最强大的 Web3 开发者产品和工具与资源、社区及专业支持结合在一起。