本文介绍了如何在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 | ^2.0.0 |
| @solana-program/system | ^0.5.0 |
| solana cli | 1.18.8 |
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 库将旧的 Connection 类及其方法拆分为两个主要组件:API 和 Transport。简而言之,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();
现在,让我们深入了解每个组件:
Solana Kit 中的 API 负责定义你可以调用的 RPC 方法的结构和类型。可以使用 createSolanaRpcApi 函数轻松创建默认 Solana RPC 方法的 API。要定义自定义 API 方法,你可以使用 createJsonRpcApi 函数(或自定义自己的函数),该函数接受一个泛型类型参数,定义 API 的方法、参数和返回类型。
API 的主要特性:
RpcApi 类型确保你定义的方法符合预期的结构,为你的 RPC 调用提供编译时检查。以下是一个示例,展示了它的样子:
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:
PriorityFeeApi 类型中的方法定义parametersTransformer 函数用于在发送到 RPC 之前修改参数(本例中是将参数从数组中取出)responseTransformer 函数用于在接收响应后修改响应(本例中,它返回响应的 result 属性)。如果你想要响应中的特定元素,这会特别有用。Solana Kit 中的 Transport 顾名思义:负责将请求传输到 RPC 提供者。它定义了与网络通信的方式。
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 提供者发送请求并处理响应/错误即可。
这种 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 插件响应定义类型开始。我们可以从 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 插件。
打开你的 example.ts 文件,导入我们刚刚创建的类型以及 @solana/kit 包中的几个依赖项:
import {
Rpc,
RpcApiMethods,
createDefaultRpcTransport,
createRpc,
RpcTransport,
createJsonRpcApi,
RpcRequest
} from "@solana/kit";
import {
EstimatePriorityFeesResponse,
EstimatePriorityFeesParams
} from "./types";
接下来,让我们为 Priority Fees API 定义一个类型:将以下代码添加到你的 example.ts 文件中:
type PriorityFeeApi = {
qn_estimatePriorityFees(params: EstimatePriorityFeesParams): EstimatePriorityFeesResponse;
// 在这里添加其他方法
}
在这里,我们创建了一个新类型 PriorityFeeApi,包含一个 qn_estimatePriorityFees 方法。注意,我们指定了方法的参数和返回类型——这对于在我们的实现中保持类型安全很重要。这是 Priority Fees API 中唯一的方法,但如果你要使用包含许多方法的其他插件,你将在这里逐个定义每个方法。
现在,让我们创建一个函数来创建我们的自定义 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。将以下代码添加到你的 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 类的一个实例,它是 RpcApi 和 RpcTransport 实例的包装器。正如我们之前讨论的,我们可以使用 requestTransformer 和 responseTransformer 选项来转换 RPC 方法的参数和响应。在这个例子中,我们使用 requestTransformer 从数组中提取 params 属性,并使用 responseTransformer 仅捕获 qn_estimatePriorityFees 方法的 result 属性。
现在我们已经设置好了自定义 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:

要运行我们的脚本,请使用以下命令:
ts-node example.ts
你应该会看到输出,其中包含不同级别(极速、高、中、低)和百分位数的预估优先费用。
在本指南中,我们探讨了如何将 Quicknode 插件与 Solana Kit 集成。我们创建了自定义 RPC 方法来使用 Priority Fees 插件,演示了如何扩展 Solana Kit API 以包含 Quicknode 特定的功能。
一些关键要点:
在本指南的下一部分中,我们将探讨更高级的用例和额外的 Quicknode 插件:
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!
作者暂未设置收款二维码