Sign in with X
CAIP-122によるウォレット認証エクステンションです。支払いとウォレット所有証明を同時に行います。
Sign in with X(SIWx)は、x402の支払いフローにウォレット認証を統合します。バイヤーは支払いと同時にウォレットの所有を証明でき、サーバーは「誰が支払ったか」を暗号学的に検証できます。
解決する問題
x402の基本フローでは、誰がトランザクションを送ったかをオフチェーンで証明する仕組みがありません。SIWxを使うことで:
- 支払者がウォレットの秘密鍵を保有していることを証明できる
- 同じウォレットで再購入せずにリソースへの継続アクセスが可能
- セッション管理・アクセス制御への活用
仕組み
- 1サーバーが402レスポンスに
siwxエクステンションのチャレンジ(ノンス・ドメイン・有効期限)を含める - 2クライアントがCAIP-122仕様に従ってチャレンジメッセージに署名
- 3署名を
X-PAYMENTヘッダーに含めてリクエストを送信 - 4サーバーが署名を検証し、ウォレット所有を確認してリソースを提供
実装
サーバー側
import {
siwxResourceServerExtension,
createSIWxSettleHook,
createSIWxRequestHook,
} from "x402/extensions";
server.registerExtension(siwxResourceServerExtension({
domain: "api.example.com",
onVerified: async ({ address, chainId }) => {
// 認証済みウォレットアドレスの処理
},
}));
// ルート設定でSIWxを有効化
const routes = {
"GET /premium": {
accepts: [{ scheme: "exact", price: "$0.10", ... }],
extensions: {
siwx: { enabled: true },
},
hooks: {
onProtectedRequest: createSIWxRequestHook(),
onSettlement: createSIWxSettleHook(),
},
},
};クライアント側
import { wrapFetchWithPayment } from "x402-fetch";
import { createSIWxClientHook } from "x402/extensions";
const paymentClient = wrapFetchWithPayment(fetch, signer, {
hooks: {
onPaymentRequired: createSIWxClientHook(signer),
},
});
const res = await paymentClient("https://api.example.com/premium");対応チェーン
EVM(eip155:*)
- EIP-4361(Sign-In with Ethereum)準拠
- Base・Ethereum・その他EVM互換チェーン
- MetaMask・Coinbase Wallet等
Solana(solana:*)
- CAIP-122 Solana署名
- Mainnet・Devnet
- Phantom・Solflare等
セキュリティ機能
- ドメインバインディング:署名はサーバーのドメインに紐付けられ、他のドメインへの転用を防止
- ノンス:リプレイ攻撃を防ぐために各チャレンジは一意のノンスを含む
- 有効期限:署名には有効期限が設定され、古い署名の悪用を防止
- チェーン検証:署名者のチェーンIDが支払いのネットワークと一致することを確認
SIWxはオプションのエクステンションです。有効化しない場合、x402の標準支払いフローに影響はありません。認証が必要なリソースにのみ適用することを推奨します。