本文へ移動
hanzochang

技術と実践のノート

Surfpool入門 - solana-test-validatorの上位互換ツールでSolana開発を効率化

公開

著者:株式会社hanzochang

Surfpoolはsolana-test-validatorのdrop-in replacementとして動作するSolanaローカル開発ツールです。MainnetのUSDCやJupiterなどのアカウントをオンデマンドで取得でき、実際のトークンを使った統合テストが可能です。

はじめに

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対応
項目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からオンデマンドで取得します。

text
# 従来のフォーク
Mainnet全アカウントをコピー → 起動に時間がかかる

# Surfpoolの Lazy Fork
トランザクション実行時に必要なアカウントだけ取得 → 即座に起動
text
# 従来のフォーク
Mainnet全アカウントをコピー → 起動に時間がかかる

# Surfpoolの Lazy Fork
トランザクション実行時に必要なアカウントだけ取得 → 即座に起動
Cheatcodes(状態操作)

surfpool_setAccount などの専用RPCメソッドで、アカウントの状態を自由に操作できます。特定の条件をシミュレートしたテストに便利です。

Surfpool Studio

http://127.0.0.1:18488 でWeb UIが利用できます。SOLのairdropやアカウント状態の確認がブラウザから行えます。

インストール方法

macOSの場合、Homebrewを使うのが簡単です。

bash
# Homebrew (macOS)
brew install txtx/taps/surfpool

# インストール確認
surfpool --version
bash
# Homebrew (macOS)
brew install txtx/taps/surfpool

# インストール確認
surfpool --version

その他のOSではクイックインストーラーが利用できます。

bash
# クイックインストーラー
curl -sL https://run.surfpool.run/ | bash
bash
# クイックインストーラー
curl -sL https://run.surfpool.run/ | bash
基本的な使い方

起動

bash
surfpool start
bash
surfpool start

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

接続情報

Surfpoolは solana-test-validator と同じポートを使用します。

種類URL
HTTP RPChttp://127.0.0.1:8899
WebSocketws://127.0.0.1:8900
Surfpool Studiohttp://127.0.0.1:18488
種類URL
HTTP RPChttp://127.0.0.1:8899
WebSocketws://127.0.0.1:8900
Surfpool Studiohttp://127.0.0.1:18488
Solana CLIでの接続
bash
# localhostに切り替え
solana config set --url localhost

# 残高確認
solana balance

# SOL取得
solana airdrop 10
bash
# localhostに切り替え
solana config set --url localhost

# 残高確認
solana balance

# SOL取得
solana airdrop 10

Surfpool Studioの画面からもairdropが可能です。

既存コードでの利用

solana-test-validator と同じポートを使用するため、既存のコードはそのまま動作します。

typescript
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')
typescript
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')

接続先を環境変数で切り替える実装にしておけば、開発・テスト・本番で同じコードが使えます。

typescript
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'
typescript
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)を使ったスワップ機能をテストしたい場合を考えます。

typescript
// USDC Mint (Mainnet)
const USDC_MINT = address('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v')

// Surfpoolなら、このアドレスにアクセスした瞬間に
// MainnetからUSDCのMintアカウントが自動取得される
const usdcMintInfo = await rpc.getAccountInfo(USDC_MINT).send()
// → decimals: 6, supply, mintAuthority などの情報が取得できる
typescript
// 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メソッドが使えます。

bash
# surfpool_setAccountで任意のアカウント状態を設定可能
# 例: 特定のウォレットにUSDC残高を付与してテスト
bash
# surfpool_setAccountで任意のアカウント状態を設定可能
# 例: 特定のウォレットにUSDC残高を付与してテスト

これにより、「100万USDC保有している状態でスワップしたらどうなるか」といった特殊なケースのテストが容易になります。

solana-test-validatorとの関係

同時起動はできない

Surfpoolとsolana-test-validatorはデフォルトで同じポートを使用します。

ポート用途
8899HTTP RPC
8900WebSocket
ポート用途
8899HTTP RPC
8900WebSocket

そのため、両方を同時に起動するとポート競合が発生します。どちらか一方を停止してから、もう一方を起動する必要があります。

bash
# solana-test-validatorが起動中の場合
# → Ctrl+C で停止してから surfpool start

# surfpoolが起動中の場合
# → Ctrl+C で停止してから solana-test-validator
bash
# solana-test-validatorが起動中の場合
# → Ctrl+C で停止してから surfpool start

# surfpoolが起動中の場合
# → Ctrl+C で停止してから solana-test-validator
ポートを変更して同時起動する場合

どうしても同時に起動したい場合は、Surfpoolのポートを変更できます。

bash
# Surfpoolを別ポートで起動
surfpool start --port 8999 --ws-port 9000 --studio-port 18588
bash
# 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)による操作
  • 既存コードの変更不要

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

参考リンク

この記事が参考になったら

この記事が役に立ったと思いましたら、よろしければフォローをお願いします。

Xでフォローする

Solanaアプリケーションの開発環境構築やテスト戦略でお困りでしたら、お気軽にご連絡ください。

お問い合わせ

この記事を書いた人

Webプランナー、開発会社の創業メンバーを経て、Fintech・DX・Web3の企画・開発に従事。2021年に独立し、2023年に株式会社hanzochangを設立。現在はAIを活用した業務改善と、自社サービス「指定管理者制度AI」の開発・運用に取り組んでいます。

半澤勇大のXアカウント(新しいタブで開く)

この記事の株式会社hanzochangについて
少し紹介させてください!

この記事に関連する当社のサービス

Web3アプリ開発受託サービス

ウォレット連携やNFTを、使いやすいアプリに。

Solanaなどのブロックチェーンを使ったアプリを、企画・検証から開発・運用まで支援します。ウォレット連携やコントラクトだけでなく、利用者が操作する画面までまとめて設計します。

サービスの詳細を見る
Jくんが接続されたアプリを組み立て、鉛筆で原稿を作るイラスト。Web3サービス開発とコンテンツ作成を表す。
  • 企画・技術検証

    事業の目的に合わせ、必要な機能と技術を検討。

  • アプリ・連携開発

    ウォレットやコントラクトと画面を一体で開発。

  • 公開・運用支援

    公開後の保守や機能改善まで継続して対応。

Web3アプリの開発について、お気軽にご相談ください。