x402 以及 MPP:它们的工作原理及区别
比较x402 和Tempo针对基于 HTTP 402 的 API 支付所提供的 MPP,内容涵盖协议设计、支付方式、按次计费与按会话计费、结算和收据,以及在何种情况下应配合Quicknode的x402 SDK 或其 MPPendpoint 用于机器对机器(M2M)和 RPC 工作流。

x402 每当有人想使用钱包(而非 API 密钥)来支付服务或 API 的费用时,这个名字总会被提及。
最近,Tempo 发布了 MPP(机器支付协议),如今又出现了一个设计理念不同的第二种方案。这两者经常被拿来比较。它们都基于 HTTP 构建 402 需付款,但它们在不同的层面上解决了不同的问题。
下面将介绍它们各自的工作原理、Quicknode 的工具在其中扮演的角色,以及在选择时真正需要权衡的利弊。
x402 在Quicknode 上,您只需一个钱包即可调用Quicknode 上的 RPC 端点。无需账户、API 密钥或订阅。使用 USDC(Base 、Polygon 、Solana )或 USDG(X Layer )支付,即可开始发起调用。
Tempo 开发的 MPP 是一种适用于任何 API 的机器间支付协议。它拥有自己的挑战/凭证/收据机制flow ,支持多种支付方式(Tempo 稳定币、Stripe 卡、闪电网络),并包含一种适用于 RPC 等高频计费场景的会话模型。
Quicknode 为以下两者均提供模具: @Quicknode/x402 和 @Quicknode/x402-solana 适用于x402 ,以及兼容 MPP 的endpoint ,地址为 https://mpp.quicknode.com/ 用于与……配合使用 mpp SDK。
x402 这是一个由 Coinbase 提出的开放标准,它提供了 HTTP 402 在“预留供将来使用”数十年后,终于有了具体的规格。
这个想法很简单:服务器返回 402 需付款,客户端查看支付要求,签署稳定币授权,重试该请求,服务器完成支付并返回资源。所有这些操作均在同一轮HTTP交互中完成。
Quicknode 该平台使用x402 ,通过钱包认证的方式提供对其RPC基础设施的访问权限。您无需创建Quicknode 账户。只需连接一个内含USDC的钱包,客户端库将自动处理其余所有事宜:身份验证、支付结算以及会话管理。
两个开源软件包:
@quicknode/x402 – 通过Quicknode x402 代理,支持 JSON-RPC、REST、gRPC-Web 和 WebSocket 的多链客户端
@quicknode/x402-solana – 专为Solana 设计的客户端,可与Solana 的Kit和Kite集成
该客户端支持以下支付模式:
按请求付费 – 每次调用 0.001 美元,无需授权,无需会话。这是最简单的方案。
信贷提款 – 通过 SIWX(Sign-In with X)进行一次身份验证,使用 USDC 购买一揽子积分,然后在每次请求时使用这些积分。对于长期使用而言,这种方式更具成本效益。
有一点值得注意:支付网络与RPC网络是解耦的。例如,您可以在Base Sepolia 上使用 USDC 进行支付,同时查询Ethereum 、mainnet 、Solana 、Aptos 、Flow 或任何其他 140 多个受支持的区块链网络。使用同一个钱包,相同的身份验证flow 。
一位使用 @quicknode/x402 首先向Quicknode x402 代理请求资源(例如 RPC、REST、gRPC-Web 或 WebSocket),并获得一个 402 需付款 响应。随后,客户端执行 SIWX 身份验证,获取一个 JWT 会话令牌,并提交支付凭证。代理将该凭证发送至x402 协调器以验证并结算支付,确认后充值。客户端使用该会话令牌重试原始请求。代理将其转发至上游的Quicknode 基础设施,接收响应,并向客户端返回 200 OK 状态码,同时消耗 1 个积分。
MPP(机器支付协议)采取了更广泛的方法。x402 最初旨在实现单个端点的货币化,而MPP则试图标准化任何机器通过HTTP向其他机器付款的方式。
该协议直接使用了 HTTP 身份验证框架:
WWW-Authenticate: 支付 402 响应中告知客户端需要进行何种支付
授权:付款 重试时附有付款凭证
付款收据 200状态码的响应证明服务器已接受付款
这是一份IETF互联网草案(由Tempo Labs和Stripe起草),这意味着他们正致力于将其发展为真正的标准,而不仅仅是SDK 会议上的惯例。
MPP 将支付方式与支付类型区分开来:
“支付方式”即支付通道: tempo (Tempo 区块链上的稳定币), 条纹 (卡片), 闪电 (Bitcoin),或自定义。
“意图”是指计费模式: 费用 (每次请求仅限一次)或 会话 (基于频道的按量付费模式)。
这一点很重要,因为你可以自由组合使用。一个 APIendpoint 既可以接受Tempo 稳定币,也可以接受 Stripe 卡。服务器会在 402 挑战中列出所有可用选项,客户端则选择其支持的任意一种。
就Tempo 而言,该 会话 “intent”这一概念颇为有趣。客户端不再是针对每个请求都进行链上交易结算,而是将资金存入托管合约,并在消耗资源时签署链下凭证。服务器通过单次验证来核验每张凭证, ecrecover 调用;不涉及 RPC,也不进行数据库查询,仅消耗 CPU 资源。结算在服务器决定关闭通道时以批处理方式进行。对于按代币计费的大型语言模型(LLM)等场景,这比为每个数据块进行链上支付要实用得多。
在MPP中 费用 flow, 一个 mppx 客户端向 MPP 服务请求一项资源,并收到一个 402 用一个……来回应 WWW-Authenticate: 支付 挑战。随后,客户端通过选定的后端完成支付(例如,签署一笔交易或支付一张发票),并使用 Authorization: Payment <credential>,该服务会向后端验证该凭据。验证成功后,该服务将返回资源,其中包含 200 OK 并包含一个 付款收据.
在MPP中 会话 flow 在Tempo 通道中,客户端首先通过向Tempo 托管合约存入资金来打开一个通道,然后请求服务访问权限。服务方会要求提供会话凭证,客户端则返回一个已签名的累积链下凭证。服务方使用 ecrecover 并在返回响应之前检查增量金额。在使用过程中,该凭证更新循环会高频次地重复进行;随后,服务会在链上通过批量结算关闭通道,此后任何未使用的押金将退还给客户端。
x402 | MPP | |
|---|---|---|
来源 | Coinbase,开源规范 | Tempo Labs + Stripe,IETF 互联网草案 |
电线规格 | 自定义标头(X-PAYMENT-*) | 标准 HTTP 身份验证方案(WWW-Authenticate: Payment、Authorization: Payment、Payment-Receipt) |
支付方式 | 稳定币 | 多种:Tempo 稳定币、Stripe卡、闪电网络比特币、自定义 |
多方法法endpoint | 每个请求仅限一个方案。 | 是的。服务器可以在单个 402 响应中提供多种处理方式,由客户端选择其中一种。 |
计费模式 | 仅在协议层级按请求处理 | 按请求计费和按会话计费作为两种不同的意图 |
会话/通道支持 | 协议中未定义。具体实现会添加自己的机制(例如积分系统)。 | Native. session intent 使用基于链下凭证并采用批量链上结算的支付渠道。 |
结算模式 | 中介方负责核对并结算客户端与服务器之间的每一笔付款 | 计费:按请求结算。会话:服务器根据自身安排关闭通道。 |
收据/凭证 | 主持人确认 | 付款收据的表头,其收据正文包含参考号、金额、资产和付款人 |
状态码含义 | 402 需付款 | 明确区分:402 = 需要付款,401 = 授权失败,403 = 策略拒绝 |
运输 | HTTP | HTTP、MCP(JSON-RPC 错误 -32042 + _meta 字段) |
链支持 | EVM,Solana | Tempo 区块链(用于tempo 方法),以及非区块链支付渠道(Stripe、Lightning) |
标准化专题 | 开源代码库,没有正式的标准制定机构 | IETF 互联网草案 |
在 按请求付费 mode,这里既没有 SIWX,也没有 JWT,更没有任何会话状态。每个请求都是自包含的。
代理仅在上游调用成功后才结算付款。如果 RPC 调用出现错误,您无需付款。
您可以设置 preAuth: true 在mode 的信用额度提取过程中,于创建客户端时进行身份验证,而非在首次收到402错误时进行。这样可以节省一次往返请求。
gRPC-Web和WebSocket均可正常工作,但它们需要采用信用扣减模式,因为它们依赖于JWT会话。更多详情请参阅
402 仅用于支付验证。如果客户端认证失败,服务器将返回 401 . 如果付款已成功,但某项政策阻止了访问,那便是 403 . 规范中明确规定了这种分离。
服务器可以返回多个 WWW-Authenticate: 支付 支持不同支付方式的支付头。一个endpoint 可以同时支持Tempo 、Stripe和Lightning。由客户端选择其中一种。
在mode 会话中,该 付款收据 其中包含的是通道 ID,而不是交易哈希。通道关闭后,您才能获得该链上交易哈希。
MPP 还通过 MCP(模型上下文协议)处理 AI 工具调用。在此传输协议下,402 状态码对应于 JSON-RPC 错误代码 32042 ,凭证/收据请放入 _meta 字段,而不是 HTTP 头。
有关Quicknode 的 MPP 代理、定价、路由、会话与计费意图、支持的网络以及客户端设置等有关endpoint 的完整详细信息,请参阅
Quicknode 两者都支持。两者都不需要账户。选择取决于你的agent/application 还与哪些其他服务进行交互。
如果您的主要需求是访问区块链数据,请使用x402 。该 @quicknode/x402 客户端支持 JSON-RPC、gRPC-Web 和 WebSocket 传输协议,提供信用包计费功能,并可通过以下方式集成Solana Kit: @quicknode/x402-solana. 这些是Quicknode 专为其x402 代理构建的第一方库。
如果您的agent 需要支付多项服务的费用,例如用于RPC的Quicknode 、用于推理的LLM提供商以及用于检索的搜索API,MPP可让您使用单一协议和钱包来处理所有这些服务。Quicknode 的MPPendpoint 位于 https://mpp.quicknode.com/ 与……相同 mppx 您用于调用任何其他支持 MPP 的服务的客户端。
没有理由不能两者兼用。将x402 用作基础设施层,将MPP用于其上构建的API。
import { createQuicknodeX402Client } from '@quicknode/x402'
// Initialize x402 client for Base Sepolia
// Wallet needs testnet USDC — get it via POST /auth (SIWE) then POST /drip
const client = await createQuicknodeX402Client({
baseUrl: 'https://x402.quicknode.com',
network: 'eip155:84532',
evmPrivateKey: process.env.PRIVATE_KEY as `0x${string}`,
preAuth: true,
})
// Make a paid RPC call — payment is handled automatically
const res = await client.fetch('https://x402.quicknode.com/base-sepolia', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'eth_blockNumber',
params: [],
}),
})
// Print the result
console.log(await res.json())import { createSolanaX402Clients } from "@Quicknode/x402-solana"
import { address } from "@solana/kit"
import { homedir } from "node:os"
const { rpc } = await createSolanaX402Clients(
"mainnet",
`${homedir()}/.config/solana/id.json`,
)
const balance = await rpc
.getBalance(address("dDCQNnDmNbFVi8cQhKAgXhyhXeJ625tvwsunRyRc7c8"))
.send()
console.log("Balance:", balance.value)mppx CLI# create a wallet (stored in keychain)
npx mppx account create
# charge intent — $0.001/request, one on-chain tx per request
npx mppx -X POST -H 'Content-Type: application/json' \\
-d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' \\
<https://mpp.quicknode.com/base-sepolia>
# session intent — $0.00001/request, off-chain vouchers
npx mppx -X POST -H 'Content-Type: application/json' \\
-d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}' \\
<https://mpp.quicknode.com/session/base-sepolia>import { Mppx, tempo } from 'mppx/client'
import { privateKeyToAccount } from 'viem/accounts'
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
// Polyfills globalThis.fetch — handles 402 challenges automatically
Mppx.create({
methods: [tempo({ account })],
})
// Charge intent ($0.001/req) — payment is transparent
const res = await fetch('https://mpp.quicknode.com/base-sepolia', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'eth_blockNumber',
params: [],
}),
})
const { result } = await res.json()
console.log('Block number:', BigInt(result))import { Mppx, tempo } from 'mppx/client'
import { privateKeyToAccount } from 'viem/accounts'
const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
// deposit 0.10 PathUSD into a payment channel
// first request opens the channel on-chain, subsequent ones use off-chain vouchers
Mppx.create({
methods: [tempo({ account, deposit: '0.10' })],
})
const res = await fetch('https://mpp.quicknode.com/session/base-sepolia', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'eth_blockNumber',
params: [],
}),
})
console.log(await res.json())x402 MPP 与之密切相关,且都解决了同一个核心问题:通过 HTTP 提供付费 API 访问服务。
对于Quicknode 的 RPC 代理,两种方式均可使用。实际上的区别在于实现方式。x402 依赖于协调器(facilitator)模型,而 MPP 则消除了这种依赖,并将flow 定义为一种正式的 HTTP 身份验证方案。
Quicknode 成立于 2017 年,为开发者和企业提供机构级区块链基础设施。凭借 99.99% 的运行时间以及对 77 条以上区块链的支持,团队能够毫无妥协地构建和扩展链上应用程序。
将最新的工程见解、产品更新和 Web3 资讯直接发送至您的收件箱。
📚 新书:《在……上构建金融软件》Solana免费电子书,内含10套完整的交易策略,涵盖期权到永续合约。
获取一份