如何使用 Solana Web3.js 2.0 的 QuickNode 插件(第一部分)

  • QuickNode
  • 发布于 2024-12-28 21:35
  • 阅读 25

本文介绍了如何将QuickNode的Marketplace Add-ons集成到Solana Web3.js 2.0应用程序中,重点讲解了如何创建自定义RPC方法以调用QuickNode的Priority Fees API Add-on。

概述

Solana 最近发布了 Solana Web3.js 2.0 的发布候选版,这是他们与 Solana 区块链交互的 JavaScript 库的重大更新。新 SDK 中最令人兴奋的新特性之一是能够通过扩展 API 自定义库的默认行为。本指南将介绍如何将 QuickNode 的 Marketplace Add-ons 集成到你的 Solana Web3.js 2.0 应用程序中,以便你可以与本地 Solana 方法并行调用 Add-ons。

让我们开始吧!

你将要做的事情

在本指南中,你将:

  • 讨论 Solana Web3.js 2.0 如何支持自定义方法和传输
  • 设置一个 Solana Web3.js 2.0 项目
  • 为 QuickNode 的优先费用 API Add-on 创建自定义 RPC 方法

你将需要的东西

  • Solana 基础知识( 指南:Solana 简介)
  • 已安装 Node.js(版本 19 或更高)
  • TypeScript 经验及已安装 ts-node
  • 一个具有 优先费用 Add-on 的 Solana 端点 的 QuickNode 账户。如果你还没有 QuickNode 账户,可以在 这里 免费创建一个。

本指南中使用的依赖项

依赖项 版本
@solana/web3.js ^2.0.0
@solana-program/system ^0.5.0
solana cli 1.18.8

什么是 QuickNode Add-ons?

QuickNode Marketplace 是一个平台,允许开发者发现、使用和创建用于其 Web3 应用程序的第三方 Add-ons。这些 Add-ons 可用于增强你的应用程序的功能,提供额外的特性和能力,而这些是链的本地 RPC 方法无法自带的。例如:

Marketplace 包括数十个覆盖广泛功能和用例的 Add-ons。通常要在你的 Solana 应用程序中使用 Add-on,你将使用一些工具向 Add-on 的 API 端点发送 HTTP 请求(例如:fetch, axios 等)。然而,使用 Solana Web3.js 2.0,你可以通过自定义方法扩展原生 Solana RPC 方法,让 Add-ons 无缝集成到你的 Solana 应用程序中,例如:

async function main() {
    const quickNodeRpc = createPriorityFeeApi('https://example.solana-mainnet.quiknode.pro/123456/');

    const priorityFees = await quickNodeRpc.qn_estimatePriorityFees({
        account: 'JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4',
        last_n_blocks: 100,
        api_version: 2
    }).send();

    console.log(priorityFees);
}

本指南将重点关注优先费用 API,但相同的方法可用于其他 RPC Add-ons。

Solana Web3.js 2.0 中的请求

Solana Web3.js 2.0 库将传统的 Connection 类及其方法分解为两个主要组件:APITransport。简而言之,API 负责定义可以调用的方法,而 Transport 负责实现请求的方式。

让我们看一个简单的例子来说明这种分离:

import { createSolanaRpcApi, createDefaultRpcTransport, createRpc } from '@solana/web3.js';

// 定义 API(使用 Solana 的默认 RPC 方法)
const api = createSolanaRpcApi();

// 创建 Transport
const transport = createDefaultRpcTransport({ url: 'https://example.solana-mainnet.quiknode.pro/123456/' });

// 组合 API 和 Transport
const rpc = createRpc({ api, transport });

// 使用 RPC
const balance = await rpc.getLatestBlockhash().send();

现在,让我们深入了解每个组件:

API

Solana Web3.js 2.0 中的 API 负责定义可以调用的 RPC 方法的结构和类型。可以使用 createSolanaRpcApi 函数轻松创建默认 Solana RPC 方法的 API。要定义自定义 API 方法,可以使用 createJsonRpcApi 函数(或自定义定义),该函数采用一个通用类型参数来定义 API 的方法、参数和返回类型。

API 的主要特性:

  1. 类型安全:API 使用 TypeScript 强大的类型系统以确保方法调用是类型安全的。RpcApi 类型确保你定义的方法与预期结构匹配,并在编译时为 RPC 调用提供检查。
  2. 方法定义:你定义 RPC 中可用的方法,包括它们的参数和返回类型。
  3. 参数和响应转换:API 可以包括可选的转换器,用于参数和响应,允许你在发送数据之前或接收数据之后进行修改。

以下是这一过程的示例:

import { createJsonRpcApi, RpcApiMethods, RpcRequest } from '@solana/web3.js';

type PriorityFeeApi = {
    qn_estimatePriorityFees(params: EstimatePriorityFeesParams): EstimatePriorityFeesResponse;
}

const priorityFeeApi = createJsonRpcApi<PriorityFeeApi>({
    requestTransformer: (request: RpcRequest<any>) => request.params[0],
    responseTransformer: (response: any) => response.result,
});

在这个例子中,我们为优先费用 API 定义了一个自定义 API:

  • API 是通过 PriorityFeeApi 类型中的方法进行定义的
  • parametersTransformer 函数用于在发送请求之前修改参数(在本例中是将参数从数组中取出)
  • responseTransformer 函数用于在收到响应后修改响应(在本例中,它返回响应的 result 属性)。这在你想从响应中提取特定元素时尤其有用。

Transport

Solana Web3.js 2.0 中的 Transport 负责正如其名称所暗示的那样:将请求传输到 RPC 提供者。它定义了与网络的通信过程。

Transport 的主要特性:

  1. 抽象化:Transport 抽象出请求如何发送的细节,使你能够轻松切换不同的传输机制(例如:HTTP、WebSocket 等)。
  2. 定制化:你可以创建自定义传输以处理特定需求,例如重试、速率限制、故障转移等。
  3. 错误处理:Transport 负责处理网络级错误并将其转换为你的应用程序可以理解的格式。

以下是创建自定义传输的示例:

import { RpcTransport } from '@solana/web3.js';

const customTransport: RpcTransport = async ({ payload, signal }) => {
  const response = await fetch('https://example.solana-mainnet.quiknode.pro/123456/', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(payload),
    signal,
  });
  if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
  return await response.json();
};

这只是一个非常基本的示例,使用 fetch 函数向远程端点发送请求。你可以想象添加自定义中间件或逻辑来处理不同类型的身份验证、请求或响应。我们将在后面探索更高级的传输。现在只需了解 Transport 负责将请求发送到 RPC 提供商并处理响应/错误。

这种 APITransport 之间的关注点分离提供了几个好处:

  1. 灵活性:你可以在不更改 API 调用的情况下,轻松切换传输机制。
  2. 可测试性:你可以为测试目的模拟 API 或 Transport。
  3. 可扩展性:为 API 添加新方法或为特定用例创建自定义传输很简单。

让我们看看这一理念在实际应用中如何运作。

创建新项目

首先,设置项目:

mkdir quicknode-addons-demo && cd quicknode-addons-demo

接下来,将项目初始化为 Node.js 项目:

npm init -y

安装依赖项:

npm install @solana/web3.js@2 && npm install --save-dev @types/node

为你的项目添加 tsconfig.json 文件:

tsc --init

在你的项目目录中创建一个名为 example.ts 的新文件:

echo > example.ts

在你的项目目录中创建一个名为 types.ts 的新文件:

echo > types.ts

为优先费用 Add-on 定义类型

首先,我们来定义优先费用 Add-on 响应的类型。我们可以从 API 参考文档 获取这些类型。将以下代码添加到你的 types.ts 文件中:

interface FeeEstimates {
    extreme: number;
    high: number;
    low: number;
    medium: number;
    percentiles: {
        [key: string]: number;
    };
}

interface EstimatePriorityFeesResponse {
    context: {
        slot: number;
    };
    per_compute_unit: FeeEstimates;
    per_transaction: FeeEstimates;
    recommended: number;
}

interface EstimatePriorityFeesParams {
    last_n_blocks?: number;
    account?: string;
    api_version?: number;
}

export type { FeeEstimates, EstimatePriorityFeesResponse, EstimatePriorityFeesParams };

这些类型将帮助我们以安全的方式使用优先费用 Add-on。

创建自定义 RPC 方法

打开你的 example.ts 文件并导入刚刚创建的类型以及一些来自 @solana/web3.js 包的依赖项:

import {
    Rpc,
    RpcApiMethods,
    createDefaultRpcTransport,
    createRpc,
    RpcTransport,
    createJsonRpcApi,
    RpcRequest
} from "@solana/web3.js";
import {
    EstimatePriorityFeesResponse,
    EstimatePriorityFeesParams
} from "./types";

定义 API 类型

接下来,我们定义一个优先费用 API 的类型:将以下代码添加到你的 example.ts 文件中:

type PriorityFeeApi = {
    qn_estimatePriorityFees(params: EstimatePriorityFeesParams): EstimatePriorityFeesResponse;
    // 此处添加其他方法
}

在这里,我们正在创建一个名为 PriorityFeeApi 的新类型,包括一个 qn_estimatePriorityFees 方法。请注意,我们指定了方法参数和返回值的类型——这是在实现过程中保持类型安全的重要部分。这个方法是优先费用 API 中的唯一方法,但如果你使用的是具有多个方法的其他 add-on,这里会为每个方法单独定义。

创建传输函数

现在,让我们创建一个函数来创建我们的自定义传输。将以下代码添加到你的 example.ts 文件中:

interface createQuickNodeTransportParams {
    endpoint: string;
}

function createQuickNodeTransport({ endpoint }: createQuickNodeTransportParams): RpcTransport {
    const jsonRpcTransport = createDefaultRpcTransport({ url: endpoint });

    return async <TResponse>(...args: Parameters<RpcTransport>): Promise<TResponse> => {
        return await jsonRpcTransport(...args);
    };
}

这个函数为优先费用 API 创建自定义传输。它接受一个参数 endpoint,即 QuickNode 端点的 URL。该函数返回一个可以用于向 RPC 提供者发送请求的 RpcTransport。由于 qn_estimatePriorityFees 方法遵循 JSON RPC 2.0 规范,我们可以使用 createDefaultRpcTransport 函数创建一个使用默认 JSON RPC 传输的传输。我们在该函数上添加了一个包装,以便将来能够更轻松地进行定制。

创建 RPC 函数

现在,让我们创建一个函数来创建我们的自定义 RPC。将以下代码添加到你的 example.ts 文件中:

export function createPriorityFeeApi(endpoint: string): Rpc<PriorityFeeApi> {
    const api = createJsonRpcApi<PriorityFeeApi>({
        requestTransformer: (request: RpcRequest<any>) => request.params[0],
        responseTransformer: (response: any) => response.result,
    });
    const transport = createQuickNodeTransport({
        endpoint,
    });
    return createRpc({ api, transport });
}

这段代码为 QuickNode 的优先费用 API 定义了一个自定义 RPC 实例。它接受一个参数 endpoint,即 QuickNode 端点的 URL。该函数返回一个 Rpc 类的实例,后者是 RpcApiRpcTransport 实例的封装。正如我们之前讨论的那样,我们可以使用 parametersTransformerresponseTransformer 选项来转换 RPC 方法的参数和响应。在这种情况下,我们使用 parametersTransformer 从数组中提取出 params 属性,并使用 responseTransformer 仅捕获 qn_estimatePriorityFees 方法的 result 属性。

使用自定义 RPC 方法

现在我们已经设置好了自定义 RPC 方法,让我们在应用中使用它们:

async function main() {
    const quickNodeRpc = createPriorityFeeApi('https://example.solana-mainnet.quiknode.pro/123456/'); // 👈 替换为你的 QuickNode 端点

    const priorityFees = await quickNodeRpc.qn_estimatePriorityFees({
        account: 'JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4',
        last_n_blocks: 100,
        api_version: 2
    }).send();

    console.log(priorityFees);
}

main();

随意使用不同的参数查询 API,并确保用来自你的 QuickNode 仪表板的 Solana HTTP 提供者 URL 替换端点 URL:

QuickNode 端点

运行脚本

要运行我们的脚本,请使用以下命令:

ts-node example.ts

你应该会看到输出,包括不同级别(极端、高、中、低)和分位数的估计优先费用。

总结

在本指南中,我们探讨了如何将 QuickNode Add-ons 与 Solana Web3.js 2.0 集成。我们创建了自定义 RPC 方法,以便与优先费用 Add-on 一起使用,展示了如何通过 QuickNode 特定的功能扩展 Solana Web3.js 2.0 API。

一些要点:

  1. Solana Web3.js 2.0 允许通过扩展灵活的接口轻松而占用空间小地扩展其 API。
  2. QuickNode Add-ons 可以无缝集成到你的 Solana 应用程序中。
  3. 通过使用自定义 RPC 方法,你可以在本地 Solana 方法旁边调用 QuickNode Add-ons。

在本指南的下一部分,我们将探讨更高级的用例和其他 QuickNode Add-ons:

  • 集成多个 QuickNode Add-ons
  • 集成 REST APIs

资源

  • 原文链接: quicknode.com/guides/sol...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
QuickNode
QuickNode
江湖只有他的大名,没有他的介绍。