本文介绍了如何将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.0 |
@solana-program/system | ^0.5.0 |
solana cli | 1.18.8 |
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 库将传统的 Connection 类及其方法分解为两个主要组件:API 和 Transport。简而言之,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();
现在,让我们深入了解每个组件:
Solana Web3.js 2.0 中的 API 负责定义可以调用的 RPC 方法的结构和类型。可以使用 createSolanaRpcApi
函数轻松创建默认 Solana RPC 方法的 API。要定义自定义 API 方法,可以使用 createJsonRpcApi
函数(或自定义定义),该函数采用一个通用类型参数来定义 API 的方法、参数和返回类型。
API 的主要特性:
RpcApi
类型确保你定义的方法与预期结构匹配,并在编译时为 RPC 调用提供检查。以下是这一过程的示例:
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:
PriorityFeeApi
类型中的方法进行定义的parametersTransformer
函数用于在发送请求之前修改参数(在本例中是将参数从数组中取出)responseTransformer
函数用于在收到响应后修改响应(在本例中,它返回响应的 result
属性)。这在你想从响应中提取特定元素时尤其有用。Solana Web3.js 2.0 中的 Transport 负责正如其名称所暗示的那样:将请求传输到 RPC 提供者。它定义了与网络的通信过程。
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 提供商并处理响应/错误。
这种 API 和 Transport 之间的关注点分离提供了几个好处:
让我们看看这一理念在实际应用中如何运作。
首先,设置项目:
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 响应的类型。我们可以从 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。
打开你的 example.ts
文件并导入刚刚创建的类型以及一些来自 @solana/web3.js
包的依赖项:
import {
Rpc,
RpcApiMethods,
createDefaultRpcTransport,
createRpc,
RpcTransport,
createJsonRpcApi,
RpcRequest
} from "@solana/web3.js";
import {
EstimatePriorityFeesResponse,
EstimatePriorityFeesParams
} from "./types";
接下来,我们定义一个优先费用 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。将以下代码添加到你的 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
类的实例,后者是 RpcApi
和 RpcTransport
实例的封装。正如我们之前讨论的那样,我们可以使用 parametersTransformer
和 responseTransformer
选项来转换 RPC 方法的参数和响应。在这种情况下,我们使用 parametersTransformer
从数组中提取出 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,并确保用来自你的 QuickNode 仪表板的 Solana HTTP 提供者 URL 替换端点 URL:
要运行我们的脚本,请使用以下命令:
ts-node example.ts
你应该会看到输出,包括不同级别(极端、高、中、低)和分位数的估计优先费用。
在本指南中,我们探讨了如何将 QuickNode Add-ons 与 Solana Web3.js 2.0 集成。我们创建了自定义 RPC 方法,以便与优先费用 Add-on 一起使用,展示了如何通过 QuickNode 特定的功能扩展 Solana Web3.js 2.0 API。
一些要点:
在本指南的下一部分,我们将探讨更高级的用例和其他 QuickNode Add-ons:
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!