如何使用Solana Kit集成Quicknode插件(第一部分)

  • QuickNode
  • 发布于 2026-05-11 22:24
  • 阅读 31

本文介绍了如何在Solana Kit(前身为Solana Web3.js 2.0)中集成Quicknode的Priority Fees API Add-on。文章详细解释了Solana Kit中API和Transport的概念,展示了如何通过定义自定义RPC方法和类型,将Quicknode Add-on作为原生RPC方法使用。步骤包括创建项目、定义类型、创建传输函数和RPC函数,最后运行脚本获取优先费用估算。该方法利用了Solana Kit的扩展性,使第三方Add-on与原生方法无缝协同。

🛠️ 更新通知

本指南已更新,以反映 Solana Web3.js 2.0 的新名称 —— Solana Kit。我们遵循最新的最佳实践,助你保持前沿。在此了解更多关于 Solana Kit 的信息

概述

Solana 最近发布了 Solana Kit,这是其与 Solana 区块链交互的 JavaScript 库的一次重大更新。新 SDK 最令人兴奋的功能之一,是能够通过自定义函数来扩展 API,从而定制库的默认行为。本指南将引导你将 Quicknode 的 Marketplace 插件集成到 Solana Kit 应用程序中,让你能够与原生 Solana 方法一起调用插件。

让我们开始吧!

你将完成的任务

在本指南中,你将:

  • 探讨 Solana Kit 如何支持自定义方法和 Transport
  • 搭建一个 Solana Kit 项目
  • 为 Quicknode 的 Priority Fees API 插件创建自定义 RPC 方法

你需要准备

  • 了解 Solana 基础(指南:Solana 入门
  • 已安装 Node.js(版本 19 或更高)
  • 具备 TypeScript 经验,并已安装 ts-node
  • 拥有一个 Quicknode 账户,并能访问 启用了 Priority Fees 插件的 Solana 端点。如果你还没有 Quicknode 账户,可以在此免费创建一个。

本指南使用的依赖项

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

什么是 Quicknode 插件?

Quicknode Marketplace 是一个平台,允许开发者发现、使用和创建用于其 Web3 应用程序的第三方插件。这些插件可用于增强应用程序的功能,提供链的原生 RPC 方法无法开箱即用的额外特性和能力。例如:

Marketplace 包含数十种插件,覆盖广泛的功能和用例。通常,要在你的 Solana 应用程序中使用插件,你需要使用某种工具(例如 fetch、axios 等)向插件的 API 端点发送 HTTP 请求。但是,使用 Solana Kit,你可以用自定义方法扩展原生 Solana RPC 方法,从而将插件无缝集成到你的 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);
}

本指南将专注于 Priority Fees API,但同样的方法也可用于其他 RPC 插件。

Solana Kit 中的请求

Solana Kit 库将旧的 Connection 类及其方法拆分为两个主要组件:APITransport。简而言之,API 负责定义可以调用的方法,而 Transport 负责如何执行调用。

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

import { createSolanaRpcApi, createDefaultRpcTransport, createRpc } from '@solana/kit';

// 定义 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 Kit 中的 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/kit';

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

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

在这个例子中,我们为 Priority Fees API 定义了一个自定义 API:

  • API 由 PriorityFeeApi 类型中的方法定义
  • parametersTransformer 函数用于在发送到 RPC 之前修改参数(本例中是将参数从数组中取出)
  • responseTransformer 函数用于在接收响应后修改响应(本例中,它返回响应的 result 属性)。如果你想要响应中的特定元素,这会特别有用。

Transport

Solana Kit 中的 Transport 顾名思义:负责将请求传输到 RPC 提供者。它定义了与网络通信的方式。

Transport 的主要特性:

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

以下是一个创建自定义 Transport 的示例:

import { RpcTransport } from '@solana/kit';

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();
};

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

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

  1. 灵活性:你可以轻松切换传输机制,而无需更改 API 调用。
  2. 可测试性:你可以为测试目的模拟 API 或 Transport。
  3. 可扩展性:很容易向 API 添加新方法或为特殊用例创建自定义 Transport。

让我们看看这在真实世界的应用程序中是如何工作的。

创建新项目

首先,让我们设置项目:

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

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

npm init -y

安装依赖项:

npm install @solana/kit && npm install --save-dev @types/node

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

tsc --init

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

echo > example.ts

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

echo > types.ts

为 Priority Fees 插件定义类型

让我们从为 Priority Fees 插件响应定义类型开始。我们可以从 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 };

这些类型将帮助我们以类型安全的方式使用 Priority Fees 插件。

创建自定义 RPC 方法

打开你的 example.ts 文件,导入我们刚刚创建的类型以及 @solana/kit 包中的几个依赖项:

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

定义 API 类型

接下来,让我们为 Priority Fees API 定义一个类型:将以下代码添加到你的 example.ts 文件中:

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

在这里,我们创建了一个新类型 PriorityFeeApi,包含一个 qn_estimatePriorityFees 方法。注意,我们指定了方法的参数和返回类型——这对于在我们的实现中保持类型安全很重要。这是 Priority Fees API 中唯一的方法,但如果你要使用包含许多方法的其他插件,你将在这里逐个定义每个方法。

创建 Transport 函数

现在,让我们创建一个函数来创建我们的自定义 Transport。将以下代码添加到你的 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);
    };
}

这个函数为 Priority Fees API 创建了一个自定义 Transport。它接受一个参数 endpoint,即 Quicknode 端点的 URL。该函数返回一个 RpcTransport,可用于向 RPC 提供者发送请求。因为 qn_estimatePriorityFees 方法遵循 JSON RPC 2.0 规范,我们可以使用 createDefaultRpcTransport 函数来创建一个使用默认 JSON RPC Transport 的 Transport。我们对该函数进行了包装,以便将来更容易定制。

创建 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 的 Priority Fees API 定义了一个自定义 RPC 实例。它接受一个参数 endpoint,即 Quicknode 端点的 URL。该函数返回 Rpc 类的一个实例,它是 RpcApiRpcTransport 实例的包装器。正如我们之前讨论的,我们可以使用 requestTransformerresponseTransformer 选项来转换 RPC 方法的参数和响应。在这个例子中,我们使用 requestTransformer 从数组中提取 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,并确保将端点 URL 替换为你的 Quicknode 仪表板中的 Solana HTTP 提供者 URL:

Quicknode 端点

运行脚本

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

ts-node example.ts

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

总结

在本指南中,我们探讨了如何将 Quicknode 插件与 Solana Kit 集成。我们创建了自定义 RPC 方法来使用 Priority Fees 插件,演示了如何扩展 Solana Kit API 以包含 Quicknode 特定的功能。

一些关键要点:

  1. Solana Kit 允许通过扩展灵活的接口轻松且低空间地扩展其 API。
  2. Quicknode 插件可以无缝集成到你的 Solana 应用程序中。
  3. 通过使用自定义 RPC 方法,你可以将 Quicknode 插件与原生 Solana 方法一起调用。

在本指南的下一部分中,我们将探讨更高级的用例和额外的 Quicknode 插件:

  • 集成多个 Quicknode 插件
  • 集成 REST API

资源

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

0 条评论

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