hanzochang
hanzochang
はじめに
Surfpoolとは
対象読者
前提知識
solana-test-validatorとSurfpoolの違い
Mainnetアカウントとは
Surfpoolの特徴
Lazy Fork(オンデマンドフォーク)
従来のフォーク
Surfpoolの Lazy Fork
Cheatcodes(状態操作)
Surfpool Studio
インストール方法
Homebrew (macOS)
インストール確認
クイックインストーラー
基本的な使い方
起動
接続情報
Solana CLIでの接続
localhostに切り替え
残高確認
SOL取得
既存コードでの利用
Mainnetアカウントを使った開発
実際のユースケース
Cheatcodesによる状態操作
surfpool_setAccountで任意のアカウント状態を設定可能
例: 特定のウォレットにUSDC残高を付与してテスト
solana-test-validatorとの関係
同時起動はできない
solana-test-validatorが起動中の場合
→ Ctrl+C で停止してから surfpool start
surfpoolが起動中の場合
→ Ctrl+C で停止してから solana-test-validator
ポートを変更して同時起動する場合
Surfpoolを別ポートで起動
コマンドの競合はない
使い分けの指針
まとめ
参考リンク
https://s3.ap-northeast-1.amazonaws.com/hanzochang.com/_v2/1769608880500_i05i4judtnm.png

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-validatorSurfpool
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 start

Anchorプロジェクトのディレクトリで実行すると、プログラムも自動的にデプロイされます。

接続情報

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 10

Surfpool 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)による操作
  • 既存コードの変更不要

ローカル開発環境の選択肢として、ぜひ試してみてください。

参考リンク

picture
hanzochang - 半澤勇大
慶應義塾大学卒業後、Webプランナーとして勤務。 ナショナルクライアントのキャンペーンサイトの企画・演出を担当。 その後開発会社に創業メンバーとして参加。 Fintech案件や大手企業のDXプロジェクトに関わり、その後個人事業主として独立し、 2023年にWeb3に特化した開発会社として法人化しました。 現在はWeb3アプリ開発を中心にAI開発フローの整備を行っています。
また、趣味で2017年ごろより匿名アカウントでCryptoの調査等を行い、 ブロックチェーンメディアやSNSでビットコイン論文等の図解等を発信していました。
X (Twitter)

お問い合わせはこちらから

ご希望に応じて職務経歴書や過去のポートフォリオを提出可能ですので、必要な方はお申し付けください。
また内容とによっては返信ができない場合や、お時間をいただく場合がございます。あらかじめご了承ください。