メインコンテンツへスキップ
Sign-In with X (SIWX) を使用すると、各 API リクエストでウォレットによるメッセージ署名で ChainStream に認証できます — API Key や OAuth トークンは不要です。x402 支払いでサブスクリプションを購入したオンチェーンウォレットを持つ AI エージェント向けに設計されています。
SIWX は API Key を置き換えます。X-API-KEY を渡す代わりに、各リクエストで Authorization: SIWX <token> を渡します。ゲートウェイが署名を検証し、有効な x402 サブスクリプションの存在をリアルタイムでチェックします。

仕組み

従来のチャレンジ/レスポンスフローとは異なり、SIWX はステートレスかつ自己完結型です。クライアントがメッセージをローカルで構築・署名し、各リクエストに添付します。

ステップバイステップ

  1. ウォレットアドレス、ドメイン、ナンス、有効期限を含む EIP-4361 メッセージを構築
  2. ウォレットの秘密鍵でメッセージに署名
  3. SIWX トークンとしてエンコード: base64(message).signature
  4. 各 API リクエストに添付: Authorization: SIWX <token>
  5. ゲートウェイが署名を検証し、ウォレットにアクティブな x402 サブスクリプションがあることを確認
  6. 有効であれば、リクエストは通常通り処理される(API Key 認証と同様)

トークンフォーマット

Authorization: SIWX base64(message).signature
メッセージは EIP-4361 標準に準拠:
api.chainstream.io wants you to sign in with your Ethereum account:
0xYourWalletAddress

Sign in to ChainStream API

URI: https://api.chainstream.io
Version: 1
Chain ID: 8453
Nonce: abc123def456
Issued At: 2026-03-26T10:00:00Z
Expiration Time: 2026-03-27T10:00:00Z

必須フィールド

フィールド説明
Domainapi.chainstream.io であること
Addressウォレットアドレス(EVM の 0x... または Solana の base58)
URIhttps://api.chainstream.io
Version1
Nonceランダム文字列(クライアント生成、リプレイ保護用)
Issued AtISO 8601 タイムスタンプ
Expiration TimeISO 8601 タイムスタンプ(この時刻を過ぎるとトークンは拒否される)
有効期限はクライアントが設定します。数分、数時間、数日間有効なメッセージに署名できます。有効期限が長いほど再署名の頻度が減りますが、短い方がより安全です。

対応チェーン

チェーンアドレス形式署名検証
EVM (Base, Ethereum)0x プレフィックス、40 文字の 16 進数EIP-191 personal_sign リカバリ
SolanaBase58 エンコード、32-44 文字Ed25519 署名検証

前提条件

SIWX 認証には、ウォレットアドレスにリンクされたアクティブな x402 サブスクリプションが必要です。サブスクリプションがない場合、ゲートウェイはエラーでリクエストを拒否します。 サブスクリプションの取得:
# CLI 経由(自動)
chainstream login
chainstream token info --chain sol --address So11111111111111111111111111111111111111112
# → 402 でプラン選択をトリガー → x402 支払い → API Key 保存

# または直接 x402 購入
curl https://api.chainstream.io/x402/purchase?plan=nano
# → x402 支払いフローに従う
詳細は x402 支払いを参照してください。

使用例

cURL

# 1. メッセージを構築して署名(お好みのツールを使用)
# 2. メッセージを Base64 エンコードし、署名を付加
TOKEN="base64EncodedMessage.signatureHex"

# 3. 任意の API 呼び出しで使用
curl https://api.chainstream.io/v2/token/sol/So11111111111111111111111111111111111111112 \
  -H "Authorization: SIWX $TOKEN"

SDK

import { ChainStreamClient } from "@chainstream-io/sdk";

const cs = new ChainStreamClient({
  auth: {
    type: "siwx",
    address: "0xYourWalletAddress",
    signMessage: async (message: string) => {
      return await wallet.signMessage(message);
    },
  },
});

const token = await cs.token.getToken("So11111111111111111111111111111111111111112", "sol");

CLI

CLI はウォレットでログインすると自動的に SIWX を使用します:
chainstream login
chainstream token info --chain sol --address So11111111111111111111111111111111111111112

SIWX vs API Key

SIWXAPI Key
ヘッダーAuthorization: SIWX <token>X-API-KEY: <key>
認証情報の管理キーの保管不要 — オンデマンドで署名キーの保管と保護が必要
前提条件ウォレット + x402 サブスクリプションDashboard アカウント
最適な用途ウォレットを持つ AI エージェントアプリケーション、スクリプト、MCP
トークン有効期限クライアントが設定(メッセージごと)Dashboard で設定(または無期限)

セキュリティに関する考慮事項

  • ステートレス: サーバー側のセッションなし。各リクエストが独立して検証されます。
  • 有効期限: クライアントが Expiration Time フィールドでトークンの有効期間を制御します。期限切れのトークンは拒否されます。
  • ドメインバインディング: メッセージにはドメインとして api.chainstream.io が含まれます。他のドメインの署名は拒否されます。
  • 秘密鍵の非露出: ウォレットはプレーンテキストメッセージに署名するだけです — 秘密鍵は決して送信されません。
  • サブスクリプションチェック: 有効な署名があっても、ウォレットにアクティブな x402 サブスクリプションがない場合、リクエストは拒否されます。