本文介绍了 Machine Payments Protocol(MPP)如何通过 HTTP 402 机制让机器在请求 API 时直接完成支付,并以 Tempo 钱包和 Foundry 的 cast 工具为例,演示了如何访问 Quicknode 的 MPP 区块链 RPC 接口。文章重点说明了 charge 与 session 两种支付模式、环境配置步骤以及常见错误和使用场景。
Machine Payments Protocol(MPP)允许你通过 HTTP 请求内联支付 API 访问费用。无需账户、无需 API keys,只需要一个钱包和稳定币余额。支付作为请求本身的一部分完成,响应会连同收据一起返回。
这对于访问区块链数据尤其有用。支持 MPP 的 RPC 提供商会暴露标准的 JSON-RPC 端点,任何钱包都可以调用。你使用 Tempo 区块链上的稳定币按请求付费,提供商在返回数据前验证支付。Agent、脚本和应用可以立即开始查询区块链状态,而无需经过注册流程。
Tempo 在这里扮演两个角色:它是结算 MPP 交易的支付通道,同时它维护着一个 Foundry 的 fork,为 cast 提供原生 MPP 支持。cast 是 Foundry 用于发起 RPC 调用、发送交易以及与智能合约交互的命令行工具。安装 Tempo fork 之后,cast 会自动处理 402 支付挑战。
本指南将带你完成 Foundry 与 Tempo 的设置,并使用 cast 发起付费 RPC 调用。示例中我们将始终使用 Quicknode 的 MPP endpoints 作为提供商。
cast 通过 charge 和 session intents 发起付费 RPC 调用Machine Payments Protocol 是一个 向 IETF 提议的开放标准,它为任何 HTTP endpoint 添加内联支付。它由 Tempo 和 Stripe 设计,用来解决一个特定问题:程序化客户端(Agent、脚本、机器人)没有一种好的方式在没有人类先行设置计费的情况下为 API 访问付费。
传统支付流程依赖结账表单、浏览器会话和可视化 CAPTCHA,这些都专为人类设计。MPP 用一种机器可读的支付协商来替代它们,该协商建立在 HTTP 402 Payment Required 之上。这个状态码自 HTTP/1.1 以来就已存在,但直到现在才被正式标准化。
该协议遵循一种基于标准 HTTP headers 的挑战-响应模式:
402 Payment Required 和一个 WWW-Authenticate: Payment header。该 header 描述价格、接受的货币、收款地址以及可用的支付方式。Authorization: Payment header 重新发送原始请求。Payment-Receipt header 的响应。像 mppx 和 Foundry 的 Tempo fork 这样的客户端库会自动处理第 2-4 步。从你的代码视角来看,请求就是能正常工作。
MPP 定义了两种控制计费方式的 payment intent:
| Charge | Session | |
|---|---|---|
| Pattern | 每个请求一次性支付 | 通过 payment channel 按使用量付费 |
| Settlement | 立即进行链上交易 | 链下 vouchers,定期链上结算 |
| Best for | 偶发查询、简单集成 | 高频请求、Agent、计量计费 |
Sessions 的工作方式是先开启一个带有初始存款的链上 payment channel。后续每个请求都会带上一个签名 voucher(“我目前已消费至 X 总额”),服务器只需通过一次 ecrecover(EVM 链中使用的密码学签名恢复函数)即可验证,无需每个请求都进行链上交易。会话结束时,服务器会在链上结算最终余额,并退还未使用的存款。
本指南使用两个客户端工具:
cast 是它用于发起链上 RPC 调用的命令行工具。Tempo fork 为 cast 添加了原生 MPP 支持。它从 Tempo CLI 读取 wallet 凭证,因此需要先设置 Tempo wallet。有关完整参考,请参阅 Tempo CLI docs 和 Tempo Foundry SDK docs。
在你能够发起付费 RPC 调用之前,你需要两样东西:一个 Tempo wallet(用于签名支付)和 Foundry 的 Tempo fork(为 cast 提供 MPP 支持)。Foundry fork 会从 Tempo CLI 读取 wallet 凭证,因此必须先设置 Tempo wallet。
curl -fsSL https://tempo.xyz/install | bash
之后如需更新,运行 tempoup。使用 tempo --version 验证。
info
tempo wallet login 的初始身份验证需要浏览器。对于 Agent 和自动化脚本,你可以在初始登录后使用 tempo wallet keys 创建作用域 access keys。这些 key 具有独立的消费限额,且使用时不需要浏览器交互。
tempo wallet login
这会打开一个浏览器流程来创建或连接一个 Tempo Wallet。如果你还没有,它会创建一个。登录后,验证一切已准备就绪:
tempo wallet whoami
你应该会看到你的 wallet 地址、余额、access key 和消费限额:
Wallet: 0xb9eb3aa4bd212928fb92def7f17318e0149bfc10
Balance: 1.000000 USDC.e
Key: 0x1697b73624b7515f4e1464415d86b83b3956cae2
Chain: tempo
Expires: 29d 23h
Limit: 0.000000 / 100.000000 USDC.e (100.000000 remaining)
如果你看到了 wallet 地址和 key,说明 wallet 已设置完成,cast 可以用它进行 MPP 支付。
tempo wallet fund
这会打开你 wallet 的充值选项。对于主网,你需要 Tempo 上的 pathUSD 或 USDC.e(Chain ID: 4217)。你也可以将 USDC 跨链到 Tempo,或者在 Tempo DEX 上进行兑换。
info
Quicknode 的 MPP endpoints 允许你使用 Tempo Moderato 上的测试网稳定币,按 每个 intent 最多 10,000 次免费 RPC 请求 的额度使用(charge 和 session 分开计算)。
你可以通过运行此命令获取测试网资金
curl -X POST https://docs.tempo.xyz/api/faucet \
-H "Content-Type: application/json" \
-d '{"address": "<YOUR_ADDRESS>"}'
随时查看你的余额:
tempo wallet whoami
如果你还没有 foundryup,先安装它:
curl -L https://foundry.paradigm.xyz | bash
然后安装 Tempo fork:
foundryup -n tempo
这会安装兼容 Tempo 的 forge、cast、anvil 和 chisel 版本。验证安装:
forge -V
输出应在版本字符串中包含 -tempo(例如 forge 1.6.0-nightly-tempo)。如果包含,说明你已经在正确的 fork 上。
Quicknode 运行 MPP endpoints,让你无需创建账户即可访问 140+ blockchain networks。本指南中的所有示例都将使用这些 MPP endpoints。
| Intent | URL pattern | Cost per request |
|---|---|---|
| Charge | https://mpp.quicknode.com/<network> |
$0.001 |
| Session | https://mpp.quicknode.com/session/<network> |
$0.00001 |
将 <network> 替换为受支持的 network slug。Quicknode MPP 支持与 Quicknode x402 相同的 140+ networks,包括所有 testnets。你可以通过以下方式动态获取完整的支持 slug 列表:
curl https://x402.quicknode.com/networks
常见 slug:tempo-mainnet、ethereum-mainnet、base-mainnet、polygon-mainnet、solana-mainnet、arbitrum-mainnet。
Sessions 的单次请求成本比 charge 便宜 100 倍。如果你要进行多于少量的调用,sessions 是更好的选择。
Quicknode 在以下地址发布了其 MPP service 的机器可读描述:
https://mpp.quicknode.com/llms.txt
该文件遵循 llms.txt convention,并包含支持的支付方式、endpoint patterns、client setup code、定价、速率限制、错误代码,以及适用于 Tempo 和 Solana 的 wallet 生成片段。如果你正在构建一个需要自行发现并支付 RPC 访问费用的 Agent,请将其指向该 URL。读取该文件的 Agent 已经拥有从零开始到发起付费 RPC 调用所需的全部信息,而无需人工帮助。
当客户端命中 charge endpoint 时,服务器会返回一个列出所有接受支付方式的 402 challenge。然后客户端会根据你的 wallet 实际持有什么来支付:
| Endpoint | Limit |
|---|---|
/:network (charge) |
每个 IP:network 对每 10 秒 1,000 次请求 |
/session/:network (session) |
每个 IP:session:network 对每 10 秒 1,000 次请求 |
常见错误响应:
| Status | Error code | What it means |
|---|---|---|
| 402 | (MPP challenge) | 需要支付 -- WWW-Authenticate header 包含 challenge |
| 403 | lifetime_limit_reached |
达到测试网上限(1 万次请求)。切换到主网 wallet |
| 404 | unsupported_network |
未识别的 network slug |
| 429 | rate_limit_exceeded |
请求过多。退避并重试 |
| 503 | mpp_not_configured |
此环境未配置 MPP |
在设置好 Tempo wallet(tempo wallet login)并安装 Foundry 的 Tempo fork(foundryup -n tempo)之后,你就可以通过 MPP endpoints 查询区块链数据了。cast 会从 Tempo CLI 读取你的 wallet,并自动处理 402 challenge-response 流程。
charge endpoint 会对每个请求处理一次性支付:
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_blockNumber
cast 接收 402 challenge,使用 Tempo 签名一笔稳定币转账,并携带 payment credential 重试。响应会像普通 RPC 调用一样返回:
0x...
你可以使用任何标准 JSON-RPC 方法:
## 获取最新区块
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_getBlockByNumber "latest" false
## 获取账户余额
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_getBalance "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" "latest"
## 获取当前 gas price
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_gasPrice
对于重复请求,请使用 session endpoint。第一次请求时,你的 wallet 会向链上 escrow contract 存入 0.1 USDC.e 以开启 payment channel。后续请求使用链下签名 vouchers 支付,延迟接近零,每次请求无需链上交易。
cast rpc -r https://mpp.quicknode.com/session/tempo-mainnet eth_blockNumber
按每次请求 $0.00001 计算,0.1 USDC.e 的存款最多可覆盖 10,000 次请求。对于会连续发出大量 RPC 调用的脚本或应用,sessions 更合理。
在 Tempo block explorer 上检查你的支付交易:
搜索你的 wallet 地址即可查看每次 RPC 请求对应的稳定币转账。
既然你现在已经可以使用 cast 发起付费 RPC 调用,下面是一些借助 Quicknode 的 MPP endpoints 可以做的实用事情。
查询任意受支持 network 上的账户余额、合约状态和交易历史:
## 查询 Tempo 主网上的地址余额
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_getBalance "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" "latest"
## 读取合约的 storage slot
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_getStorageAt "0xCONTRACT_ADDRESS" "0x0" "latest"
## 获取交易收据
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_getTransactionReceipt "0xTX_HASH"
适用于仪表盘、告警或费用估算:
## 最新区块号
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_blockNumber
## 带交易的完整区块
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_getBlockByNumber "latest" true
## 当前 gas price
cast rpc -r https://mpp.quicknode.com/tempo-mainnet eth_gasPrice
由于 cast 会自动处理 MPP,因此你可以在 Foundry 工作流中任何需要传入 --rpc-url 的地方使用 Quicknode MPP endpoints:
## 通过 MPP 在真实网络上运行 forge script
forge script script/Deploy.s.sol \
--rpc-url https://mpp.quicknode.com/tempo-mainnet \
--broadcast
## 通过 MPP 在 fork 上运行测试
forge test --fork-url https://mpp.quicknode.com/tempo-mainnet
注意:
--broadcast标志会向网络提交真实交易。如果你只是测试脚本,请省略--broadcast,这样可以在不花费 gas 或不在链上部署任何内容的情况下模拟部署。
Machine Payments Protocol 是一个(向 IETF 提议的)开放标准,它为 HTTP endpoints 添加内联支付。客户端使用 402 Payment Required 状态码和标准 HTTP headers 将支付作为请求的一部分完成。它支持多种支付方式,包括 Tempo 稳定币、Solana USDC 和 Stripe。
不需要。MPP 替代了基于账户的访问。你只需要一个持有稳定币的钱包。无需注册、无需 API keys、也无需计费 dashboard。
charge 每个请求处理一次性链上支付(约 500ms 开销)。session 会先用初始存款开启一个 payment channel,然后在后续请求中使用链下 vouchers,以实现接近零延迟。偶发调用使用 charge;任何会重复请求的场景使用 session。
charge 请求每次 $0.001。session 请求每次 $0.00001(每百万请求 $10)。sessions 便宜 100 倍,因为它们将链上结算摊销到多次请求中。
可以。Quicknode 的 MPP endpoints 接受 Tempo Moderato 上的测试网 pathUSD,提供每个 intent 10,000 次免费请求(charge 和 session 分开计算)。不需要真实资金。
这取决于服务提供商。Quicknode 接受 Tempo 上的 pathUSD 和 USDC.e(桥接 USDC)。服务器会在 402 challenge 中列出其接受的货币。
服务提供商可以发布一个机器可读的 llms.txt 文件来描述其 MPP service。Quicknode 的文件位于 https://mpp.quicknode.com/llms.txt,其中包含 endpoint patterns、定价、client setup code,以及适用于 Tempo 和 Solana 的启动说明。
服务器会返回 HTTP 403,内容为 { "error": "lifetime_limit_reached" },并且不会扣款。切换到有主网资金的钱包即可获得无限访问。
如果你已经读到这里,那么你现在已经了解了 Machine Payments Protocol 是什么、如何设置 Tempo wallet,以及如何使用 Foundry Tempo fork 通过 cast 发起付费 RPC 调用。你可以使用 charge 处理一次性请求,或者在需要高频访问且成本更低时使用 sessions,通过 Quicknode 的 MPP endpoints 查询区块链数据。
要进一步了解 MPP、Tempo 和 Quicknode,请查看以下资源:
告诉我们 如果你有任何反馈或新的主题需求。我们很乐意听到你的声音。
- 原文链接: quicknode.com/guides/age...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!