このサイトはコミュニティが運営する非公式の日本語リソースです。公式ドキュメントはdocs.x402.orgをご参照ください。

Sign in with X

CAIP-122によるウォレット認証エクステンションです。支払いとウォレット所有証明を同時に行います。

Sign in with X(SIWx)は、x402の支払いフローにウォレット認証を統合します。バイヤーは支払いと同時にウォレットの所有を証明でき、サーバーは「誰が支払ったか」を暗号学的に検証できます。

解決する問題

x402の基本フローでは、誰がトランザクションを送ったかをオフチェーンで証明する仕組みがありません。SIWxを使うことで:

  • 支払者がウォレットの秘密鍵を保有していることを証明できる
  • 同じウォレットで再購入せずにリソースへの継続アクセスが可能
  • セッション管理・アクセス制御への活用

仕組み

  1. 1サーバーが402レスポンスにsiwxエクステンションのチャレンジ(ノンス・ドメイン・有効期限)を含める
  2. 2クライアントがCAIP-122仕様に従ってチャレンジメッセージに署名
  3. 3署名をX-PAYMENTヘッダーに含めてリクエストを送信
  4. 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の標準支払いフローに影響はありません。認証が必要なリソースにのみ適用することを推奨します。