Solana のリクエストを 1 つ例に、x402 で料金を確かめ、払い、RPC の結果と決済結果を受け取るまでを順に追います。他の 15 のチェーンも、それぞれのパスで同じ手順です。
用意するのは、Solana 上の USDC、または Base 上の USDC か EURC が入ったウォレットと、x402 のクライアントです。x402 のクライアントは、402 のレスポンスを読み、ウォレットで支払いに署名して、リクエストを送り直すソフトウェアです。クライアントについては、
x402.org のドキュメントをご覧ください。
1. リクエストを送る
まず、支払いペイロードを付けずに RPC のリクエストを送ります。
curl -i https://x402.erpc.global/v1/solana-mainnet \
--header 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
curl -i https://x402.erpc.global/v1/solana-mainnet \
--header 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
402 Payment Required が返ります。ヘッダーには、メソッドと料金が入っています。
HTTP/2 402
x-payment-required: eyJ4NDAyVmVyc2lvbiI6Mi…
x-rpc-methods: getSlot
x-rpc-weight: 1000
x-rpc-price-usd: 0.001
HTTP/2 402
x-payment-required: eyJ4NDAyVmVyc2lvbiI6Mi…
x-rpc-methods: getSlot
x-rpc-weight: 1000
x-rpc-price-usd: 0.001
レスポンスボディの accepts には、支払いに使えるステーブルコインごとに支払い方法が並びます。amount はステーブルコインの最小単位で数えた額で、1000 は 0.001 USDC(EURC なら 0.001 EURC)です。
{
"error": { "code": "payment_required", "message": "Payment required", "request_id": "…" },
"x402Version": 2,
"accepts": [
{ "scheme": "exact", "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "amount": "1000", "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", … },
{ "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", … },
{ "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42", … }
],
"pricing": { "methods": ["getSlot"], …, "weight": 1000, "rawWeight": 42, …, "price": "$0.001", … },
…
}
{
"error": { "code": "payment_required", "message": "Payment required", "request_id": "…" },
"x402Version": 2,
"accepts": [
{ "scheme": "exact", "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "amount": "1000", "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", … },
{ "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", … },
{ "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42", … }
],
"pricing": { "methods": ["getSlot"], …, "weight": 1000, "rawWeight": 42, …, "price": "$0.001", … },
…
}
2. x402 のクライアントで払う
402 のレスポンスを x402 のクライアントに渡します。クライアントは、ウォレットで払える支払い方法を選んで、その金額の支払いに署名し、X-Payment ヘッダーに入れる値にエンコードします。ネットワーク手数料のための SOL や ETH は要りません。
3. 支払いペイロードを付けて、もう一度送る
同じリクエストボディを、X-Payment ヘッダーに支払いペイロードを入れて、もう一度送ります。
curl -i https://x402.erpc.global/v1/solana-mainnet \
--header 'Content-Type: application/json' \
--header 'X-Payment: <PAYMENT_PAYLOAD>' \
--data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
curl -i https://x402.erpc.global/v1/solana-mainnet \
--header 'Content-Type: application/json' \
--header 'X-Payment: <PAYMENT_PAYLOAD>' \
--data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
リクエストボディは変えずに送ってください。料金はリクエストボディで決まるので、変えたことで料金が変わると、支払いの金額と合わずに price_mismatch が返ります。
支払いの検証と決済が済むと、RPC の結果が返ります。決済結果は X-Payment-Response ヘッダーに入ります。
HTTP/2 200
x-payment-response: <RECEIPT>
HTTP/2 200
x-payment-response: <RECEIPT>
{ "jsonrpc": "2.0", "id": 1, "result": … }
{ "jsonrpc": "2.0", "id": 1, "result": … }
1 つの支払いペイロードで払えるのは、1 つのリクエストだけです。同じ支払いペイロードをもう一度送ると、402 payment_invalid か 409 duplicate_payment が返り、リクエストがもう一度チェーンへ送られることはありません。
レスポンス
支払いを求める前にエラーを返したリクエストには、料金はかかりません。
Solana では、読み取る範囲が広すぎる呼び出し(大きなプログラムに絞り込みなしで送る getProgramAccounts など)には、支払いを求める前に HTTP 200 と JSON-RPC のエラーを返します。料金はかかりません。
次のステップ