本文介绍了 @quicknode/x402-solana 库,该工具允许开发者通过 x402 协议使用 USDC 支付 Solana RPC 请求费用,无需 QuickNode 账号或 API 密钥。文章详细讲解了安装配置、信用额度与按需付费两种模式的区别,以及在 AI 代理、无服务器环境和 CI/CD 中的具体应用场景。
@quicknode/x402-solana 是一个 npm 库,它使用 @solana/kit 创建 Solana RPC 和 WebSocket 订阅客户端,通过 Quicknode 使用 USDC 经由 x402 支付协议为每个请求付费。它不需要 API Key,不需要账户,也不需要订阅,只需要一个包含 USDC 的 Solana 钱包文件。
该库导出一个函数 createSolanaX402Clients(),该函数返回标准的 Solana Kit rpc 和 rpcSubscriptions 对象。
TL;DR
@quicknode/x402-solana 构建经过身份验证的 Solana RPC 和 WebSocket 客户端,无需 API Key 或账户本指南涵盖了安装和配置该库、在 credit-drawdown 和 pay-per-request 支付模式之间进行选择、在开发过程中使用 devnet USDC 支付 mainnet RPC 访问费用,以及了解 x402 协议在底层如何与 Solana Kit 集成。到最后,你将拥有可以自动使用 USDC 支付的可用 RPC 客户端。
solana-keygen new 生成,通常位于 ~/.config/solana/id.json(一个包含 64 个数字的 JSON 数组,代表私钥字节)credit-drawdown 模式至少需要 $10 USDC,或者在 devnet 上至少 $0.01。对于 pay-per-request 模式,任何金额均可。| 依赖 | 版本 |
|---|---|
| Node.js | 22+ |
| @quicknode/x402-solana | 0.1.0 |
| @solana/kit | 6.6.0 |
| @quicknode/x402 | 0.1.2 |
如果你没有 Solana 密钥对文件,请使用 Solana CLI 创建一个:
solana-keygen new
这将在 ~/.config/solana/id.json 创建一个密钥对。如果你计划使用 devnet 进行支付,你将需要 devnet USDC。你可以从 Circle Faucet 获取一些。
安装软件包并用三行代码创建经过身份验证的 Solana 客户端。
npm install @quicknode/x402-solana
// Solana Kit
import { createSolanaX402Clients } from "@quicknode/x402-solana";
import { address } from "@solana/kit";
import { homedir } from "node:os";
const keyPairFile = `${homedir()}/.config/solana/id.json`;
const { rpc, rpcSubscriptions } = await createSolanaX402Clients(
"mainnet",
keyPairFile,
);
// 发起 RPC 调用以测试连接
const balance = await rpc
.getBalance(address("dDCQNnDmNbFVi8cQhKAgXhyhXeJ625tvwsunRyRc7c8"))
.send();
console.log("Balance:", balance.value);
Kite 使用更简单的 API 封装了 Solana Kit:
// Kite
import { createSolanaX402Clients } from "@quicknode/x402-solana";
import { connect, loadWalletFromFile } from "solana-kite";
import { homedir } from "node:os";
const keyPairFile = `${homedir()}/.config/solana/id.json`;
const { rpc, rpcSubscriptions } = await createSolanaX402Clients(
"mainnet",
keyPairFile,
);
const connection = connect(rpc, rpcSubscriptions);
const wallet = await loadWalletFromFile(keyPairFile);
const balance = await connection.getBalance(wallet.address);
console.log("Balance:", balance);
传统的 Solana RPC 提供商需要创建账户、管理 API Key 以及订阅计划。@quicknode/x402-solana 用一个 Solana 钱包替代了所有这些。
以下是两种方法的并排对比:
| @quicknode/x402-solana | Quicknode 平台 | |
|---|---|---|
| 账户设置 | 无 — 仅需钱包 | 需要(电子邮件、注册、验证) |
| API Key 管理 | 无 | 创建、存储、轮换并保护 Key |
| 计费 | 使用 USDC 按需付费 | 订阅计划或预付费额度 |
| 速率限制 | 每个网络 1,000 req / 10s | 基于层级 |
| CI/CD 凭证 | 仅需钱包密钥对 | 需要机密管理 |
| AI Agent 兼容性 | 是(原生支持钱包) | 部分(使用 Quicknode MCP) |
| 身份验证模型 | 链上 USDC 支付 | Header 中的 API Key |
| 产品套件 | 仅限 API(无 Streams, Webhooks 等) | 全面访问(Streams, Webhooks 等) |
| 最佳适用场景 | Agent、无服务器、原型设计、CI | 大规模生产系统、已有账户的团队 |
该库使用了 x402 协议,这是一个开放标准,服务器在其中响应 HTTP 402 Payment Required 以及支付指令。支持 x402 的客户端会自动使用 USDC 完成支付并完成请求,所有操作都在一次往返中完成。
这对于 AI Agent 特别有用。自主 Agent 无法注册账户、管理订阅或轮换 API Key。然而,它们可以持有一个带有 USDC 的钱包,这使得基于钱包的身份验证成为 Agent 驱动的区块链访问的自然选择。
@quicknode/x402-solana 导出一个异步函数:
const { rpc, rpcSubscriptions } = await createSolanaX402Clients(
network,
keyPairFile,
options?,
);
参数:
| 参数 | 类型 | 是否必填 | 默认值 | 描述 |
|---|---|---|---|---|
network |
"mainnet" | "testnet" | "devnet" |
是 | - | 要连接的 Solana 网络 |
keyPairFile |
string |
是 | - | Solana 密钥对 JSON 文件的路径 |
options.paymentNetwork |
"mainnet" | "testnet" | "devnet" |
否 | 与 network 相同 |
用于 USDC 支付的网络 |
options.paymentModel |
"credit-drawdown" | "pay-per-request" |
否 | "credit-drawdown" |
要使用的支付模式 |
返回值:
返回 { rpc, rpcSubscriptions },它们是标准的 @solana/kit Rpc 和 RpcSubscriptions 对象,可以与任何 Solana Kit 或 Kite API 一起使用。
@quicknode/x402-solana 支持两种支付模式:credit-drawdown(默认)进行一次身份验证并批量购买额度,而 pay-per-request 为每个 RPC 调用单独付费。
| 维度 | credit-drawdown (默认) | pay-per-request |
|---|---|---|
| 身份验证 | SIWX (Sign-In With X) 一次性验证 | 无,支付附加在每个请求中 |
| 最低余额 | mainnet $10 USDC,devnet $0.01 | 无最低要求 |
| 会话管理 | 带有自动重新认证的自动 JWT | 无 |
| 预付费用 | 购买额度包 | 无 |
| 最佳适用场景 | 持续使用、高访问量应用 | 低访问量、零星使用、无服务器 |
import { createSolanaX402Clients } from "@quicknode/x402-solana";
import { homedir } from "node:os";
const keyPairFile = `${homedir()}/.config/solana/id.json`;
// credit-drawdown 是默认设置,不需要选项
const { rpc, rpcSubscriptions } = await createSolanaX402Clients(
"mainnet",
keyPairFile,
);
import { createSolanaX402Clients } from "@quicknode/x402-solana";
import { homedir } from "node:os";
const keyPairFile = `${homedir()}/.config/solana/id.json`;
const { rpc, rpcSubscriptions } = await createSolanaX402Clients(
"mainnet",
keyPairFile,
{ paymentModel: "pay-per-request" },
);
对于大多数应用,请使用 credit-drawdown(默认值)。当你需要零预付承诺、在运行周期较短的无服务器函数中运行,或者每个会话的请求少于 50 个左右时,请使用 pay-per-request。
通过在选项中设置 paymentNetwork: "devnet",你可以使用 devnet USDC 支付 mainnet 或 testnet 的 RPC 访问费用。这对于在不花费真钱的情况下针对真实的 mainnet 数据进行开发和测试非常有用。
| 配置 | network | paymentNetwork | 最低 USDC | 使用场景 |
|---|---|---|---|---|
| Mainnet RPC, mainnet 支付 | "mainnet" |
"mainnet" (默认) |
$10 | 生产环境 |
| Mainnet RPC, devnet 支付 | "mainnet" |
"devnet" |
$0.01 | 针对真实 mainnet 数据进行开发 |
| Devnet RPC, devnet 支付 | "devnet" |
"devnet" (默认) |
$0.01 | 完整的开发/测试 |
| Testnet RPC, devnet 支付 | "testnet" |
"devnet" |
$0.01 | Testnet 开发 |
| 任何网络 + pay-per-request | 任意 | 任意 | 无 | 低访问量或零星使用 |
import { createSolanaX402Clients } from "@quicknode/x402-solana";
import { homedir } from "node:os";
const keyPairFile = `${homedir()}/.config/solana/id.json`;
// 连接到 mainnet RPC,使用 devnet USDC 支付
const { rpc, rpcSubscriptions } = await createSolanaX402Clients(
"mainnet",
keyPairFile,
{ paymentNetwork: "devnet" },
);
在底层,该库构建了一个支持 x402 协议 的标准 Kit RpcTransport。当请求到达需要支付的端点时,服务器会响应 HTTP 402 和机器可读的支付要求。传输层拦截该响应,使用你钱包中的 USDC 完成支付,并重试原始请求。
QuickNode RPCSolana Chain (USDC)x402-solanaYour AppQuickNode RPCSolana Chain (USDC)x402-solanaYour AppInitialization (credit-drawdown mode)Normal RPC requestCredit bundle exhaustedcreateSolanaX402Clients(network, keypairFile)Read keypair, derive signing keySIWX auth + purchase credit bundle (USDC)JWT session tokenrpc.getLatestBlockhash()HTTP request + JWTRPC responseResultrpc.getTransaction(...)HTTP request + JWT402 lifetime_limit_reachedPurchase new credit bundle (USDC)ConfirmedSIWX re-auth → new JWTRetry original requestRPC responseResult
在初始化时,该库读取你的 Solana 密钥对文件并将私钥转换为 base58 格式,以便签署支付交易。然后,它通过 @quicknode/x402 创建一个经过 x402 验证的 HTTP 客户端,并将其封装为 Solana Kit 传输层。
在 credit-drawdown 模式下,这包括一个一次性的 SIWX (Sign-In With X) 身份验证步骤,该步骤会预先购买 USDC 额度包。单个 RPC 调用不会每次都产生单独的链上交易。如果额度包在会话中间耗尽,该库会检测到 lifetime_limit_reached 错误,重新进行身份验证,购买新的额度包,并自动重试请求。
在 pay-per-request 模式下,没有会话或预先购买。每次调用都单独结算。
createSolanaX402Clients() 返回的客户端是标准的 @solana/kit v6+ 对象,与任何接受 Solana Kit 客户端的库或工具兼容。
| 库 / 工具 | 是否兼容 | 备注 |
|---|---|---|
| Solana Kit (v6+) | 是 | 返回原生的 Kit Rpc 和 RpcSubscriptions 类型 |
| Kite | 是 | 将 rpc 和 rpcSubscriptions 传递给 connect() |
| web3.js (旧版) | 否 | API 不同;需要 @solana/kit v6+ |
| 浏览器环境 | 否 | 使用 Node.js fs 读取密钥对文件 |
以下是一些真实的用例,在这些用例中,基于钱包的 RPC 访问释放了传统 API Key 模型不支持的新机会。
AI Agent 可以使用 @quicknode/x402-solana 自主访问 Solana RPC,而无需人工提供的 API Key,仅需一个带有 USDC 的钱包。由于 Agent 无法注册账户或管理订阅,通过 x402 进行基于钱包的身份验证是 Agent 驱动的区块链交互的自然选择。
无服务器函数、Lambda 和容器可以在不预先配置账户的情况下,仅使用密钥对文件获得 Solana RPC 访问权限。pay-per-request 模式在这里非常理想,因为无需管理会话,无需预付额度包,且在函数空闲时成本缩减为零。
CI 流水线可以通过将密钥对存储为仓库机密(SOLANA_KEYPAIR)来访问实时 Solana RPC,而无需管理单独的 RPC 提供商凭证。该库自身的测试套件就使用了这种模式。
你可以在不到一分钟的时间内获得一个可用的 Solana RPC 连接:npm install @quicknode/x402-solana,指向一个密钥对文件,然后开始进行 RPC 调用。
构建适用于任何拥有标准 Solana 密钥对文件(~/.config/solana/id.json)的人的 Solana CLI 工具,除了 Solana 开发者已经拥有的配置外,无需任何额外配置。
对于定期检查链上状态(余额、Token 账户、程序数据)的脚本,使用 pay-per-request 模式。成本与实际使用情况成正比,没有最低承诺。
对于每个 Solana 应用程序来说,这个库并不总是正确的选择。在某些情况下,带有专用端点和 API Key 的传统 RPC 提供商更合适。例如:
fs 从磁盘读取密钥对文件,因此它只能在 Node.js 服务端环境中运行。它不能在浏览器中运行。将你的 Solana 密钥对 JSON 存储为 SOLANA_KEYPAIR 仓库机密,测试套件将自动检测到它。
- name: Run tests
env:
SOLANA_KEYPAIR: ${{ secrets.SOLANA_KEYPAIR }}
run: npm test
在本地,测试会自动检测 ~/.config/solana/id.json,如果文件缺失则优雅地跳过。在 CI 中,SOLANA_KEYPAIR 环境变量被写入一个临时文件,并在测试运行后清理。所有测试都是针对实时 RPC 端点的集成测试,没有任何模拟(mocked)内容。
错误:"lifetime_limit_reached"
这意味着你的额度包已耗尽。在 credit-drawdown 模式下,库会通过重新认证并购买新额度包来自动处理此问题。如果此错误传播到你的应用程序,请确保你的钱包有足够的 USDC(mainnet 最低 $10,devnet 最低 $0.01)。
读取密钥对文件错误
确保 keyPairFile 路径指向一个有效的 Solana 密钥对 JSON 文件,即一个包含 64 个数字(字节)的 JSON 数组。标准位置是 ~/.config/solana/id.json。如果需要,使用 solana-keygen new 生成一个。
USDC 余额不足
credit-drawdown 模型在 mainnet 上至少需要 $10 USDC,在 devnet 上需要 $0.01。pay-per-request 模型没有最低限额,但每次单独调用都需要足够的 USDC。
WebSocket 订阅无法连接
WebSocket 身份验证使用作为查询参数附加的 JWT Token。该 Token 来自 credit-drawdown 模式下的 SIWX 身份验证流。如果使用 pay-per-request,WebSocket 连接可能没有有效的 Token。对于需要 WebSocket 订阅的应用程序,请使用 credit-drawdown。
使用 @quicknode/x402-solana 是否需要 Quicknode 账户或 API Key?
不需要。@quicknode/x402-solana 不需要 Quicknode 账户,不需要 API Key,也不需要订阅。你只需要一个包含 USDC 的 Solana 钱包文件。支付通过 x402 协议自动处理。
@quicknode/x402-solana 的成本是多少?
成本取决于支付模式。使用 credit-drawdown(默认),你购买一个额度包,mainnet 最低 $10 USDC,devnet $0.01 起。使用 pay-per-request,每个 RPC 调用单独支付,没有最低限额。
我可以使用 devnet USDC 支付 mainnet Solana RPC 访问费用吗?
可以。在选项中设置 paymentNetwork: "devnet",即可在连接到 mainnet 或 testnet RPC 端点时使用 devnet USDC 支付。这对于在不花费真钱的情况下针对真实的 mainnet 数据进行开发和测试非常有用。
当我的额度用完时会发生什么?
在 credit-drawdown 模式下,库会自动检测到 lifetime_limit_reached 错误,重新认证,购买新的额度包,并重试请求。只要钱包有足够的 USDC,就不需要人工干预。
什么是 x402 协议?
x402 是一个基于 HTTP 402 Payment Required 状态码的开放支付协议。当服务器需要支付时,它会返回 402 状态和支付指令。支持 x402 的客户端会自动完成支付(在这种情况下,使用 Solana 上的 USDC)并重试请求。
你现在已经掌握了在没有账户、API Key 或订阅的情况下,通过 Quicknode 访问 Solana RPC 所需的一切。使用 @quicknode/x402-solana,你可以仅使用带有 USDC 的钱包连接到任何 Solana 网络,根据你的用例在 credit-drawdown 和 pay-per-request 模式之间进行选择,甚至在开发期间使用 devnet USDC 支付。无论你是在构建 AI Agent、无服务器函数、CLI 工具还是快速原型,通过 x402 协议进行的基于钱包的 RPC 访问都消除了传统提供商入驻的摩擦。
如果你有任何反馈或对新主题的需求,请告知我们。我们很乐意听取你的意见。
- 原文链接: quicknode.com/guides/sol...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!