ファシリテーター
x402プロトコルにおけるファシリテーターの役割を説明します。
ファシリテーターはオプションですが推奨されるサービスで、クライアント(バイヤー)とサーバー(セラー)間の支払い検証・決済プロセスを簡略化します。
ファシリテーターとは
ファシリテーターは以下を担うサービスです:
- クライアントが送信した支払いペイロードを検証する
- サーバーに代わってブロックチェーン上で支払いを決済する
ファシリテーターを使うことで、サーバーはブロックチェーンへの直接接続や支払い検証ロジックの実装が不要になります。これにより運用の複雑さが軽減され、トランザクションの正確なリアルタイム検証が保証されます。
ファシリテーターの責務
- 支払いの検証:クライアントの支払いペイロードがサーバーの宣言した支払い要件を満たしているか確認する
- 支払いの決済:検証済みの支払いをブロックチェーンに送信し、確認を監視する
- レスポンスの提供:検証・決済結果をサーバーに返し、サーバーがクライアントのリクエストを受け入れるかどうかを判断できるようにする
ファシリテーターは資金を保管したり、カストディアンとして機能したりすることはありません。クライアントが提供した署名済みペイロードに基づいて、オンチェーントランザクションの検証と実行のみを行います。
ファシリテーターを使う理由
- 運用の複雑さを軽減:サーバーはブロックチェーンノードと直接やり取りする必要がありません
- プロトコルの一貫性:サービス間で標準化された検証・決済フローを実現
- 迅速な統合:ブロックチェーン固有の開発を最小限に抑えて支払い受付を開始できる
ローカルで検証・決済を実装することも可能ですが、ファシリテーターを使うことで導入が加速し、正しいプロトコル動作が保証されます。
稼働中のファシリテーター
Base・Solana・Polygon・Avalancheなど複数のネットワークに対応したファシリテーターが本番環境で稼働中です。最新の一覧はx402エコシステムをご確認ください。
インタラクションフロー
- 1クライアントがリソースサーバーにHTTPリクエストを送信
- 2リソースサーバーが
402 Payment RequiredステータスとPAYMENT-REQUIREDヘッダー(Base64エンコードされた支払い要件)を返す - 3クライアントがサーバーレスポンスの
acceptsフィールドから支払い詳細を選択し、支払いペイロードを作成 - 4クライアントが
PAYMENT-SIGNATUREヘッダー(Base64エンコードされた支払いペイロード)を付けてリクエストを再送 - 5リソースサーバーがローカルまたはファシリテーターの
/verifyエンドポイントへのPOSTで支払いペイロードを検証 - 6ファシリテーターがペイロードのスキームとネットワークIDに基づいて検証を実行し、検証レスポンスを返す
- 7検証が有効な場合、リソースサーバーがリクエストを処理。無効な場合は402を返す
- 8リソースサーバーがブロックチェーンに直接決済するか、ファシリテーターの
/settleエンドポイントにPOSTして決済 - 9ファシリテーターがスキームとネットワークIDに基づいてブロックチェーンに支払いを送信
- 10ファシリテーターがオンチェーンでの支払い確認を待機
- 11ファシリテーターが支払い実行レスポンスをリソースサーバーに返す
- 12リソースサーバーが
PAYMENT-RESPONSEヘッダーを含むレスポンスをクライアントに返す。成功時は200 OKとリソース、失敗時は402とエラー詳細
Solanaの二重決済について
注意
Solanaでは、最初の送信がオンチェーンで確認される前に同じ支払いトランザクションがファシリテーターの /settle エンドポイントに複数回送信されるレースコンディションが発生する可能性があります。SolanaのRPCは重複送信に対して「成功」を返すため(コンセンサスレベルでネットワークが重複排除)、ファシリテーターは各呼び出しに対して成功の決済レスポンスを返す可能性があります。悪意のあるクライアントがこれを悪用し、1回分の支払いで複数のリソースにアクセスする可能性があります。
これを防ぐため、x402のSVMメカニズムパッケージには SettlementCache(同じトランザクションペイロードの重複決済試行を検出・拒否する短命なインメモリキャッシュ)が組み込まれています。外部ストレージは不要で、エントリは120秒後に自動削除されます(Solanaのブロックハッシュ有効期間の約2倍)。
この保護はTypeScriptとPythonの標準SVMファシリテーター登録ヘルパー使用時にデフォルトで有効です。Goでは、V1・V2両方のSVMファシリテータースキーム登録時に共有の SettlementCache インスタンスを渡す必要があります。
ファシリテーターを使わずに直接支払いを決済する場合は、同等の重複検出を自分で実装する必要があります。
まとめ
ファシリテーターはx402プロトコル内で独立した検証・決済レイヤーとして機能します。サーバーが直接ブロックチェーンインフラを持たなくても、支払いの確認とオンチェーントランザクションの送信を支援します。