SUI GraphQL 使用指北!

前言

SUI 推出了基于 GraphQL(下称gql) 的查询技术,试图取代传统的 FullNode-RPC, 以给 DAPP 带来更好的数据流体验:使用传统 RPC 查询链上数据需要发送多个请求才可以获取到相应的数据,gqp 可以一次性获取到 DAPP 所需的所有数据,而且可以根据需要自定义数据出现的字段,优化了开发者的查询体验,同时大幅减少节点的网络开销。

具体的说明 SUI 官方文档中已经给到,但是没有详细的使用例子,这里我们以官方的 ts-sdk 为例子,在享有 ts 自动补全的情况下,做一个简略的使用说明。

本文着重讲解使用 ts-sdk 查询的流程,如果你还不了解 gql, 关于 gql 查询的写法,可以看这些参考的资料

GQL 服务器

在官方文档中并没有给出公共的 GQL 服务器链接,其实就是鼓励我们自己跑一个全节点做查询端口,但是其实上面的在线编辑器也是可以公共使用的,但是如果你是自己做项目,推荐自己跑一个节点,延迟更低性能更好,可以突破公共服务器的限制。

使用 ts-sdk 查询

其实在 ts 中编写 gql 是可以享有代码补全的,包括 gql 查询文档,以及返回的数据类型,我们首先讲解在没有自动补全下的用法,这个方式最简单,但是可能需要你对返回的数据做一下解析,或者自己手动去定义一下返回数据的 interface

首先确保你已经安装了 ts-sdk

bash 复制代码
pnpm add @mysten/sui.js

随后我们在 query 中直接传入查询的模板字符串即可

typescript 复制代码
import { SuiGraphQLClient } from "@mysten/sui.js/graphql";
const client = new SuiGraphQLClient({
    url: "https://sui-mainnet.mystenlabs.com/",
})

async function queryBalances(addr: string) {
    return (await client.query({
        query: `
            query($addr: SuiAddress!){
                address(address: $addr){
                balance(type: "0x2::sui::SUI"){
                    coinType{
                    repr
                    }
                    coinObjectCount,
                    totalBalance
                }
                },
            }
        `,
        variables: {
            addr
        }
    })).data
}

这个就是最简单的使用方法,但是你会发现编写模板时没有补全提示,返回的数据也没有补全提示

所以接下来我们讲解如何让 ts 的补全功能可以生效

完美使用方法

首先我们扒开这个 ts-sdk 的源码,发现他用了三个库

但是经过我的研究,我们在这里只需要用到 gql.tada 就可以享受 ts 自动补全的功能

首先安装 gql.tada,还有一个用于给 gql 做补全的 ts 插件 @0no-co/graphqlsp

bash 复制代码
pnpm add gql.tada
pnpm add -D @0no-co/graphqlsp

然后需要到我们的 tsconfig.json 中对 plugins 字段做配置

json 复制代码
{
    ...,
    "compilerOptions": {
        ...,
        "plugins": [
            {
                "name": "@0no-co/graphqlsp",
                "schema": "./src/graphql/schema.graphql",
                "tadaOutputLocation": "./src/graphql/tada-env.d.ts",
                "trackFieldUsage": false,
                "shouldCheckForColocatedFragments": false
            }
        ]
    },
}

这一段配置来自于 ts-sdk 的源码,我们在这里需要注意两个地方,一个是 "schema",还有 "tadaOutputLocation"

schema 文件用于对我们的 gql 文档做补全,tadaOutputLocation 指定了 tada 导出的 ts 声明文件的存放路径,更多的内容可以去看 tada 的官方文档, 你也可以按照你的需要修改这里的路径

配置完成之后我们需要去 sui 的 repo 下载这个 schema 文件,地址在这里:

github.com/MystenLabs/...

我们需要下载其中 current_progress_schema.graphql 这个文件,然后命名为 schema.graphql 放到上面配置所指的目录中

接下来我们创建 graphql/index.ts 文件

现在你的目录结构应该看起来像这样

bash 复制代码
src/
    graphql/
        index.ts
        schema.graphql
        tada-env.d.ts  # 这个文件在你启动 vscode 之后会自动生成

按照 gql.tada 的文档,我们只需要在 index.ts 中做一点配置,就可以享受自动补全的快乐啦~

typescript 复制代码
// index.ts

import { initGraphQLTada } from 'gql.tada';
import type { introspection } from './graphql-env.d.ts';
export const graphql = initGraphQLTada<{
    introspection: introspection;
}>();

export type { FragmentOf, ResultOf, VariablesOf } from 'gql.tada';
export { readFragment } from 'gql.tada';

然后我们将一开始直接传入模板字符串的方法改成使用 graphql 来进行调用,就可以享受爽快的类型补全了!

gql 文档内的补全:

返回数据的补全:

至此,开启你的愉悦 SUI-GQL 之旅!

相关推荐
cmes_love1 天前
期货Level2与股票逐笔行情数据有什么,如何下载
数据库·区块链
小果因子实验室2 天前
量化研究--编写第一个回测算法策略研究
大数据·区块链
IvorySQL3 天前
PG 日报|SQL/PGQ 图查询基于联接重写机制实现
数据库·人工智能·sql·postgresql·区块链·ivorysql
磐链科技4 天前
技术服务:交易所从流量竞争到生态竞争的核心变量
区块链
木西4 天前
深度拆解 DeSci 龙头 OriginTrail:从核心架构到智能合约复刻与全链路测试
web3·智能合约·solidity
Web3李李4 天前
DApp核心安全漏洞与项目方全方位防护指南
web3·区块链·智能合约·软件开发·dapp开发·安全审计
双缝观察者5 天前
消费场景中,多层级资金流转异常模式识别与溯源方法
区块链
磐链科技5 天前
从性能到智能:区块链交易所前沿技术全景洞察
区块链
汇策研习社5 天前
改良版ADX指标实战指南:告别传统ADX滞后、震荡误判难题
大数据·经验分享·金融·区块链·fastbull
酿情师5 天前
区块链共识算法深度拆解:PoW、PoS、PBFT、Raft 原理解析
算法·区块链·共识算法