12 分钟
在 NEAR 上构建子图
本指南介绍了如何在NEAR 区块链上构建索引智能合约的子图。
NEAR 是什么?
NEAR是一个用于构建去中心化应用程序的智能合约平台。请访问官方文档以获取更多信息。
NEAR 子图是什么?
The Graph 为开发人员提供了一种被称为子图的工具,利用这个工具,开发人员能够处理区块链事件,并通过 GraphQL API 提供结果数据。 Graph 节点现在能够处理 NEAR 事件,这意味着 NEAR 开发人员现在可以构建子图来索引他们的智能合约。
子图是基于事件的,这意味着子图可以侦听并处理链上事件。 NEAR 子图目前支持两种类型的处理程序:
- 区块处理器: 这些处理程序在每个新区块上运行。
- 收据处理器: 每次在指定账户上一个消息被执行时运行。
Receipt 是系统中唯一可操作的对象。 当我们在 NEAR 平台上谈论“处理交易”时,这最终意味着在某个时候“应用收据”。
构建 NEAR 子图
@graphprotocol/graph-cli
是一个用于构建和部署子图的命令行工具。
@graphprotocol/graph-ts
是子图特定类型的库。
NEAR 子图开发需要0.23.0
以上版本的graph-cli
,以及 0.23.0
以上版本的graph-ts
。
构建 NEAR 子图与构建索引以太坊的子图非常相似。
子图定义包括三个方面:
subgraph.yaml: 子图清单,定义感兴趣的数据源以及如何处理它们。 NEAR 是一种全新类型
数据源。
schema.graphql: 一个模式文件,定义子图存储的数据以及如何通过 GraphQL 查询数据。NEAR 子图的要求已经在现有的文档中介绍了。
Assembly Script Mappings:将事件数据转换为架构中定义实体的AssemblyScript代码 。NEAR支持引入了NEAR特定的数据类型和新的JSON解析功能。
在子图开发过程中,有两个关键命令:
1$ graph codegen # 从清单中标识的模式文件生成类型2$ graph build # 从 AssemblyScript 文件生成 Web Assembly,并在 /build 文件夹中准备所有子图文件
子图清单定义
子图清单(subgraph.yaml
)标识子图的数据源、感兴趣的触发器以及响应这些触发器而运行的函数。 以下是一个 NEAR 的子图清单的例子:
1specVersion: 1.3.02schema:3 file: ./src/schema.graphql # link to the schema file4dataSources:5 - kind: near6 network: near-mainnet7 source:8 account: app.good-morning.near # This data source will monitor this account9 startBlock: 10662188 # Required for NEAR10 mapping:11 apiVersion: 0.0.912 language: wasm/assemblyscript13 blockHandlers:14 - handler: handleNewBlock # the function name in the mapping file15 receiptHandlers:16 - handler: handleReceipt # the function name in the mapping file17 file: ./src/mapping.ts # link to the file with the Assemblyscript mappings
- NEAR 子图引入了一种新的
kind
数据源(near
)。 - 该
网络
应与主机Graph Node上的网络相对应。在Subgraph Studio上,NEAR的主网靠近near-主网
,NEAR测试网靠近near-测试网
。 - NEAR数据源引入了一个可选的
source.account
字段,这是一个与NEAR帐户对应的人类可读ID。这可以是一个帐户或子帐户。 - NEAR 数据源引入了一个替代的可选
source. account
字段,其中包含可选的后缀和前缀。至少必须指定前缀或后缀,它们将分别与以值列表开始或结束的任何账户匹配。下面的例子将匹配:[ app | good]。* [ morning.near | morning.testnet]
.如果只需要一个前缀或后缀列表,则可以省略其他字段。
1accounts:2 prefixes:3 - app4 - good5 suffixes:6 - morning.near7 - morning.testnet
NEAR 数据源支持两种类型的处理程序:
blockHandlers
:在每个新的 NEAR 区块上运行。 不需要source.account
。receiptHandlers
:在数据源的source.account
收件人的每个收据上运行。请注意,只处理完全匹配的数据(子帐户必须作为独立的数据源添加)。
模式定义
数据查询结构定义描述了生成的子图数据库的结构以及实体之间的关系,无需与原始数据源有关。这里有关于子图模式定义的更多细节。
AssemblyScript 映射
处理事件的处理程序是用 AssemblyScript 编写的。
NEAR索引将NEAR特定的数据类型引入AssemblyScript API。
1class ExecutionOutcome {2 gasBurnt: u64,3 blockHash: Bytes,4 id: Bytes,5 logs: Array<string>,6 receiptIds: Array<Bytes>,7 tokensBurnt: BigInt,8 executorId: string,9 }1011class ActionReceipt {12 predecessorId: string,13 receiverId: string,14 id: CryptoHash,15 signerId: string,16 gasPrice: BigInt,17 outputDataReceivers: Array<DataReceiver>,18 inputDataIds: Array<CryptoHash>,19 actions: Array<ActionValue>,20 }2122class BlockHeader {23 height: u64,24 prevHeight: u64,// Always zero when version < V325 epochId: Bytes,26 nextEpochId: Bytes,27 chunksIncluded: u64,28 hash: Bytes,29 prevHash: Bytes,30 timestampNanosec: u64,31 randomValue: Bytes,32 gasPrice: BigInt,33 totalSupply: BigInt,34 latestProtocolVersion: u32,35 }3637class ChunkHeader {38 gasUsed: u64,39 gasLimit: u64,40 shardId: u64,41 chunkHash: Bytes,42 prevBlockHash: Bytes,43 balanceBurnt: BigInt,44 }4546class Block {47 author: string,48 header: BlockHeader,49 chunks: Array<ChunkHeader>,50 }5152class ReceiptWithOutcome {53 outcome: ExecutionOutcome,54 receipt: ActionReceipt,55 block: Block,56 }
这些类型被传递给区块 & 收据处理程序:
- 块处理程序将收到
Block
- 收据处理程序将收到
ReceiptWithOutcome
否则,在映射执行期间,AssemblyScript API的其余部分可供NEAR子图开发人员使用。
这包括一个新的 JSON 解析函数—— NEAR 上的日志经常作为带字符串的 JSONs 发出。作为JSON API 的一部分,可以使用一个新的 json.fromString(...)
函数来允许开发人员轻松地处理这些日志。
部署 NEAR 子图
构建子图后,就可以将其部署到 Graph节点以进行索引了。 NEAR 子图可以部署到任何大于或等于0.26.x版本
(此版本尚未标记和发布)的图节点 。
Subgraph Studio和The Graph网络上的升级索引人,目前支持在测试版中对NEAR主网和测试网进行索引,网络名称如下:
near-主网
near-测试网
有关在Subgraph Studio上创建和部署子图的更多信息,请参阅此处。
作为一个快速入门——第一步是“创建”你的子图——这只需要完成一次。在Subgraph Studio上,这可以从您的Dashboard完成:“创建子图”。
创建子图后,您可以使用 graph deploy
CLI 命令部署子图:
1$ graph create --node <graph-node-url> <subgraph-name> # creates a Subgraph on a local Graph Node (on Subgraph Studio, this is done via the UI)2$ graph deploy --node <graph-node-url> --ipfs https://ipfs.thegraph.com <subgraph-name> # uploads the build files to a specified IPFS endpoint, and then deploys the Subgraph to a specified Graph Node based on the manifest IPFS hash
节点配置将取决于子图的部署位置。
子图工作室
1graph auth2graph deploy <subgraph-name>
本地Graph节点(基于默认配置)
1graph deploy --node http://localhost:8020/ --ipfs http://localhost:5001 <subgraph-name>
部署子图后,它将由 Graph节点索引。 您可以通过查询子图本身来检查其进度:
1{2 _meta {3 block {4 number5 }6 }7}
使用本地Graph节点索引 NEAR
运行索引 NEAR 的 Graph节点有以下操作要求:
- 带有 Firehose 工具的 NEAR 索引人框架
- NEAR Firehose 组件
- 配置了 Firehose 端点的Graph节点
我们将很快提供有关运行上述组件的更多信息。
查询 NEAR 子图
NEAR子图的GraphQL端点由模式定义和现有的API接口确定。有关更多信息,请访问GraphQL API文档 。
示例子图
以下是一些示例子图供参考:
常见问题
测试版是如何工作的?
NEAR 支持处于测试阶段,这意味着随着我们继续致力于改进集成,API 可能会发生变化。 请发送电子邮件至 [email protected],以便我们支持您构建 NEAR 子图,并让您了解最新进展!
子图可以同时索引 NEAR 和 EVM 链吗?
不,子图只能支持来自一个链/网络的数据源。
子图可以对更具体的触发器做出反应吗?
目前,仅支持 Block 和 Receipt 触发器。 我们正在调查对指定帐户的函数调用的触发器。 一旦 NEAR 拥有原生事件支持,我们也对支持事件触发器感兴趣。
接受处理程序会触发账户及其子账户吗?
如果指定了账户
,那么它将只与确切的账户名匹配。可以通过指定accounts
字段来匹配子账户,并指定后缀
和前缀
来匹配账户和子账户,例如,下面将匹配所有 mintbase1.near
子账户:
1accounts:2 suffixes:3 - mintbase1.near
NEAR 子图可以在映射期间对 NEAR 帐户进行视图调用吗?
这是不支持的。 我们正在评估索引是否需要此功能。
我可以在 NEAR 子图中使用数据源模板吗?
目前不支持此功能。 我们正在评估索引是否需要此功能。
以太坊子图支持“待定”和“当前”版本,如何部署 NEAR 子图的“待定”版本?
NEAR 子图尚不支持挂起的功能。 在此期间,您可以将新版本部署到不同的“命名”子图,然后当它与链头同步时,您可以重新部署到您的主“命名”子图,它将使用相同的底层部署 ID,所以 主子图将立即同步。
我的问题尚未得到解答,在哪里可以获得更多构建 NEAR 子图的帮助?
如果这是一个关于子图开发的一般性问题,那么在 开发者文档的其余部分中会有更多的信息。否则,请加入The Graph 协议的Discord ,并在 # near 频道或发邮件到 near@thegraph. com 询问。