
Surfpool入門 - solana-test-validatorの上位互換ツールでSolana開発を効率化
Surfpoolはsolana-test-validatorのdrop-in replacementとして動作するSolanaローカル開発ツールです。MainnetのUSDCやJupiterなどのアカウントをオンデマンドで取得でき、実際のトークンを使った統合テストが可能です。
公開日2026.01.27
更新日2026.01.27
はじめに
Solana開発のローカル環境といえば solana-test-validator が定番です。しかし、Mainnetのデータが必要な場面や、リソース消費が気になる場面で不便を感じることがあります。
この記事では、solana-test-validator の上位互換として動作する Surfpool を紹介します。同じポート(8899/8900)を使用するため、既存のコードを変更せずにそのまま利用できます。
目次
Surfpoolとは
Surfpoolは txtx が開発しているSolanaローカル開発ツールです。solana-test-validator のdrop-in replacement(そのまま置き換え可能な代替)として設計されています。
Solana公式ドキュメントでも紹介されており、ローカル開発のツールとして認知されています。
対象読者
- Solanaのローカル開発環境を構築したい方
solana-test-validatorをすでに使用している方- Mainnetのデータをローカルで使いたい方
前提知識
- Solana CLIの基本的な操作
- ローカルバリデータの概念
solana-test-validatorとSurfpoolの違い
| 項目 | solana-test-validator | Surfpool |
|---|---|---|
Mainnetアカウント | なし(空の状態から開始) | オンデマンドで取得 |
起動速度 | 普通 | 高速 |
リソース消費 | 重め | 軽量(Raspberry Piでも動作) |
Web UI | なし | Surfpool Studio |
追加機能 | なし | タイムトラベル、アカウント注入、MCP対応 |
Mainnetアカウントとは
Solana上のデータはすべて「アカウント」として保存されています。具体的には以下のようなものです。
- Mintアカウント: トークンの設定情報(decimals、supply、authorityなど)
- トークンアカウント: 各ウォレットが保有するトークン残高
- プログラムアカウント: デプロイ済みのスマートコントラクト(USDCのToken Program、Jupiter Aggregatorなど)
- メタデータアカウント: NFTの名前、画像URL、属性情報
solana-test-validator は空の状態から始まるため、これらのデータは存在しません。MainnetのUSDCをローカルでテストしたい場合、モックを作成するか、事前にアカウントをコピーする必要があります。
Surfpoolはこれらのアカウントをオンデマンドで取得するため、Mainnetに存在するトークンやプログラムをそのままローカルで使えます。
Surfpoolの特徴
Surfpoolの主な特徴は以下の通りです。
Lazy Fork(オンデマンドフォーク)
従来のフォークツールはMainnetの全アカウントをコピーするため時間がかかります。Surfpoolは必要なアカウントだけをMainnetからオンデマンドで取得します。
# 従来のフォーク
Mainnet全アカウントをコピー → 起動に時間がかかる
# Surfpoolの Lazy Fork
トランザクション実行時に必要なアカウントだけ取得 → 即座に起動Cheatcodes(状態操作)
surfpool_setAccount などの専用RPCメソッドで、アカウントの状態を自由に操作できます。特定の条件をシミュレートしたテストに便利です。
Surfpool Studio
http://127.0.0.1:18488 でWeb UIが利用できます。SOLのairdropやアカウント状態の確認がブラウザから行えます。
インストール方法
macOSの場合、Homebrewを使うのが簡単です。
# Homebrew (macOS)
brew install txtx/taps/surfpool
# インストール確認
surfpool --versionその他のOSではクイックインストーラーが利用できます。
# クイックインストーラー
curl -sL https://run.surfpool.run/ | bash基本的な使い方
起動
surfpool startAnchorプロジェクトのディレクトリで実行すると、プログラムも自動的にデプロイされます。
接続情報
Surfpoolは solana-test-validator と同じポートを使用します。
| 種類 | URL |
|---|---|
HTTP RPC | http://127.0.0.1:8899 |
WebSocket | ws://127.0.0.1:8900 |
Surfpool Studio | http://127.0.0.1:18488 |
Solana CLIでの接続
# localhostに切り替え
solana config set --url localhost
# 残高確認
solana balance
# SOL取得
solana airdrop 10Surfpool Studioの画面からもairdropが可能です。
既存コードでの利用
solana-test-validator と同じポートを使用するため、既存のコードはそのまま動作します。
import { createSolanaRpc, createSolanaRpcSubscriptions } from '@solana/kit'
// localhost接続(solana-test-validatorでもSurfpoolでも同じ)
const rpc = createSolanaRpc('http://127.0.0.1:8899')
const rpcSubscriptions = createSolanaRpcSubscriptions('ws://127.0.0.1:8900')接続先を環境変数で切り替える実装にしておけば、開発・テスト・本番で同じコードが使えます。
const HTTP_URL = process.env.SOLANA_RPC_URL ?? 'http://127.0.0.1:8899'
const WS_URL = process.env.SOLANA_WS_URL ?? 'ws://127.0.0.1:8900'Mainnetアカウントを使った開発
Surfpoolの最大の特徴は、Mainnetのアカウントをオンデマンドで取得できる点です。
実際のユースケース
例えば、MainnetのUSDC(Token-2022)を使ったスワップ機能をテストしたい場合を考えます。
// USDC Mint (Mainnet)
const USDC_MINT = address('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v')
// Surfpoolなら、このアドレスにアクセスした瞬間に
// MainnetからUSDCのMintアカウントが自動取得される
const usdcMintInfo = await rpc.getAccountInfo(USDC_MINT).send()
// → decimals: 6, supply, mintAuthority などの情報が取得できるsolana-test-validator では空の状態から始まるため、USDCは存在しません。テストするには以下のような準備が必要でした。
- モックのUSDC Mintを自分で作成する
solana accountコマンドでMainnetからアカウントをダンプしてロードする- テスト用のトークンで代用する
Surfpoolでは、MainnetのUSDC、Jupiter、Raydiumなど実在するプログラムやトークンをそのままローカルで使えます。
Cheatcodesによる状態操作
テスト用にアカウントの状態を変更したい場合、Surfpool独自のCheatcodes RPCメソッドが使えます。
# surfpool_setAccountで任意のアカウント状態を設定可能
# 例: 特定のウォレットにUSDC残高を付与してテストこれにより、「100万USDC保有している状態でスワップしたらどうなるか」といった特殊なケースのテストが容易になります。
solana-test-validatorとの関係
同時起動はできない
Surfpoolとsolana-test-validatorはデフォルトで同じポートを使用します。
| ポート | 用途 |
|---|---|
8899 | HTTP RPC |
8900 | WebSocket |
そのため、両方を同時に起動するとポート競合が発生します。どちらか一方を停止してから、もう一方を起動する必要があります。
# solana-test-validatorが起動中の場合
# → Ctrl+C で停止してから surfpool start
# surfpoolが起動中の場合
# → Ctrl+C で停止してから solana-test-validatorポートを変更して同時起動する場合
どうしても同時に起動したい場合は、Surfpoolのポートを変更できます。
# Surfpoolを別ポートで起動
surfpool start --port 8999 --ws-port 9000 --studio-port 18588ただし、solana CLIは localhost で 8899 に接続するため、接続先の切り替えが必要になります。
コマンドの競合はない
surfpool コマンドと solana コマンドは別のバイナリです。Surfpoolをインストールしても、既存の solana CLI には影響しません。
surfpool: Surfpoolの起動・管理solana: Solana CLIツール(キーペア管理、残高確認、トランザクション送信など)
両方をインストールしても問題なく共存できます。
使い分けの指針
どちらを使うかは用途で選びます。
Surfpoolを選ぶ場面
- MainnetのUSDC、Jupiter等を使った統合テスト
- リソース消費を抑えたい場合
- Web UIでの操作・確認が必要な場合
- 高速な起動・再起動を繰り返す開発
solana-test-validatorを選ぶ場面
- 完全に隔離された環境が必要な場合
- 公式ツールのみを使用するポリシーがある場合
- Mainnetデータが不要なシンプルなテスト
まとめ
Surfpoolは solana-test-validator のdrop-in replacementとして、以下のメリットを提供します。
- Mainnetアカウント(USDC、Jupiter等)のオンデマンド取得(Lazy Fork)
- 軽量で高速な起動
- Web UI(Surfpool Studio)による操作
- 既存コードの変更不要
ローカル開発環境の選択肢として、ぜひ試してみてください。
参考リンク
お問い合わせはこちらから
ご希望に応じて職務経歴書や過去のポートフォリオを提出可能ですので、必要な方はお申し付けください。
また内容とによっては返信ができない場合や、お時間をいただく場合がございます。あらかじめご了承ください。
