jpskill.com
🛠️ 開発・MCP コミュニティ

solana-rpc

Solanaブロックチェーンと直接やり取りし、アカウント情報の検索、トークン残高の確認、トランザクションの送信、プログラムへの問い合わせなどをJSON-RPC経由で行うSkill。

📜 元の英語説明(参考)

Direct Solana blockchain interaction via JSON-RPC — account lookups, token balances, transaction submission, and program queries

🇯🇵 日本人クリエイター向け解説

一言でいうと

Solanaブロックチェーンと直接やり取りし、アカウント情報の検索、トークン残高の確認、トランザクションの送信、プログラムへの問い合わせなどをJSON-RPC経由で行うSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o solana-rpc.zip https://jpskill.com/download/10437.zip && unzip -o solana-rpc.zip && rm solana-rpc.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/10437.zip -OutFile "$d\solana-rpc.zip"; Expand-Archive "$d\solana-rpc.zip" -DestinationPath $d -Force; ri "$d\solana-rpc.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して solana-rpc.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → solana-rpc フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Solana RPC — 直接的なブロックチェーンとのやり取り

Solana JSON-RPC API は、ブロックチェーンへの直接的な読み書きアクセスを提供します。アカウントの状態のクエリ、トークン残高の検索、トランザクションの構築と送信、およびプログラムアカウントの列挙に使用します。これは、より高レベルの API (Birdeye、Helius、SolanaTracker) が必要なデータを持っていない場合の低レベルの基盤となります。

クイックスタート

import httpx

RPC = os.getenv("SOLANA_RPC_URL", "https://api.mainnet-beta.solana.com")

def rpc_call(method: str, params: list = None) -> dict:
    resp = httpx.post(RPC, json={
        "jsonrpc": "2.0", "id": 1,
        "method": method, "params": params or [],
    }, timeout=30.0)
    return resp.json()

# SOL 残高を取得
result = rpc_call("getBalance", ["WALLET_PUBKEY"])
sol_balance = result["result"]["value"] / 1e9

# 最新の blockhash を取得
result = rpc_call("getLatestBlockhash")
blockhash = result["result"]["value"]["blockhash"]

RPC プロバイダー

プロバイダー 無料枠 有料 注記
Helius 50K credits/day $49+/月 拡張 RPC、DAS API
QuickNode 制限あり $49+/月 マルチチェーン、WebSocket
Triton 無料枠なし ~$300+/月 Yellowstone gRPC バンドル
Shyft 制限あり $49+/月 Yellowstone gRPC バンドル
Alchemy 300M CU/月 スケーリング 優れた無料枠
Public (mainnet-beta) 無料 レート制限あり、不安定

推奨: 開発には Helius または QuickNode を使用してください。本番環境での取引には、パブリック RPC を絶対に使用しないでください。

コア読み取りメソッド

アカウントと残高

# SOL 残高 (lamports 単位、SOL に換算するには 1e9 で割る)
getBalance(pubkey, {commitment: "confirmed"})

# 完全なアカウント情報 (data, owner, lamports, executable)
getAccountInfo(pubkey, {encoding: "jsonParsed"})

# 複数のアカウントを 1 回の呼び出しで取得
getMultipleAccounts([pubkey1, pubkey2], {encoding: "jsonParsed"})

トークンアカウント

# ウォレットが所有するすべての SPL トークンアカウント
getTokenAccountsByOwner(wallet_pubkey, {
    "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
}, {"encoding": "jsonParsed"})

# 特定のトークンアカウントのトークン残高
getTokenAccountBalance(token_account_pubkey)

# 最大のトークンアカウント (上位保有者)
getTokenLargestAccounts(mint_pubkey)

# トークンの総供給量
getTokenSupply(mint_pubkey)

トランザクションデータ

# パースされたトランザクションを署名で取得
getTransaction(signature, {
    "encoding": "jsonParsed",
    "maxSupportedTransactionVersion": 0,
})

# アドレスの最近のトランザクション署名
getSignaturesForAddress(pubkey, {
    "limit": 20,
    "before": "optional_signature",  # ページネーションカーソル
})

# トランザクションステータス
getSignatureStatuses([sig1, sig2])

ブロックとスロット

# 現在のスロット
getSlot({commitment: "confirmed"})

# ブロックデータ
getBlock(slot, {
    "encoding": "jsonParsed",
    "transactionDetails": "full",
    "maxSupportedTransactionVersion": 0,
})

# 最新の blockhash (tx の構築に必要)
getLatestBlockhash({commitment: "confirmed"})

# スロットリーダーのスケジュール
getLeaderSchedule()

プログラムアカウント

# プログラムが所有するすべてのアカウント (フィルター付き)
getProgramAccounts(program_pubkey, {
    "encoding": "jsonParsed",
    "filters": [
        {"dataSize": 165},  # アカウントデータサイズでフィルタリング
        {"memcmp": {         # データコンテンツでフィルタリング
            "offset": 32,
            "bytes": "base58_encoded_value",
        }},
    ],
})

警告: フィルターなしで getProgramAccounts を使用すると、数百万件の結果が返され、タイムアウトする可能性があります。常に dataSize および/または memcmp フィルターを使用してください。

優先手数料

# 最近の優先手数料の見積もり
getRecentPrioritizationFees([account_pubkey])
# 最近のスロットの { slot, prioritizationFee } の配列を返します

# アカウントの最小レント
getMinimumBalanceForRentExemption(data_length)

書き込みメソッド

トランザクションの送信

# 署名されたシリアライズされたトランザクションを送信
sendTransaction(base64_tx, {
    "encoding": "base64",
    "skipPreflight": False,
    "preflightCommitment": "confirmed",
    "maxRetries": 3,
})

# 送信する前にシミュレート
simulateTransaction(base64_tx, {
    "encoding": "base64",
    "sigVerify": False,
    "commitment": "confirmed",
})

トランザクションの確認

import time

def confirm_transaction(rpc_url: str, signature: str, timeout: float = 30.0) -> bool:
    """トランザクションの確認をポーリングします。"""
    start = time.time()
    while time.time() - start < timeout:
        result = rpc_call("getSignatureStatuses", [[signature]])
        statuses = result.get("result", {}).get("value", [None])
        if statuses[0] is not None:
            status = statuses[0]
            if status.get("err"):
                return False
            if status.get("confirmationStatus") in ("confirmed", "finalized"):
                return True
        time.sleep(0.5)
    return False

コミットメントレベル

レベル 説明 使用場面
processed 単一ノードの確認 安全性よりも速度を優先
confirmed 超過半数 (2/3+) 取引のデフォルト
finalized 最大超過半数 + 31 スロット 重要な操作

常にコミットメントを明示的に指定してください。デフォルトはプロバイダーによって異なります。

一般的なパターン

ウォレットのすべてのトークン保有量を取得

def get_wallet_tokens(wallet: str) -> list[dict]:
    """メタデータを含むすべての SPL トークン保有量を取得します。"""
    result = rpc_call("getTokenAccountsByOwner", [
        wallet,
        {"programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},
        {"encoding": "jsonParsed"},
    ])
    tokens = []
    for acct in result["result"]["value"]:
        info = acct["account"]["data"]["parsed"]["info"]
        tokens.append({
            "mint": info["mint"],
            "amount": int(info["tokenAmount"]["amount"]),
            "decimals": info["tokenAmount"]["decimals"],
            "ui_amount": info["tokenAmount"]["uiAmount"],
        })
    return [t for t in tokens if t["amount"] > 0]
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Solana RPC — Direct Blockchain Interaction

The Solana JSON-RPC API provides direct read/write access to the blockchain. Use it for account state queries, token balance lookups, transaction building and submission, and program account enumeration. This is the low-level foundation when higher-level APIs (Birdeye, Helius, SolanaTracker) don't have the data you need.

Quick Start

import httpx

RPC = os.getenv("SOLANA_RPC_URL", "https://api.mainnet-beta.solana.com")

def rpc_call(method: str, params: list = None) -> dict:
    resp = httpx.post(RPC, json={
        "jsonrpc": "2.0", "id": 1,
        "method": method, "params": params or [],
    }, timeout=30.0)
    return resp.json()

# Get SOL balance
result = rpc_call("getBalance", ["WALLET_PUBKEY"])
sol_balance = result["result"]["value"] / 1e9

# Get latest blockhash
result = rpc_call("getLatestBlockhash")
blockhash = result["result"]["value"]["blockhash"]

RPC Providers

Provider Free Tier Paid Notes
Helius 50K credits/day $49+/mo Enhanced RPCs, DAS API
QuickNode Limited $49+/mo Multi-chain, WebSocket
Triton No free tier ~$300+/mo Yellowstone gRPC bundled
Shyft Limited $49+/mo Yellowstone gRPC bundled
Alchemy 300M CU/mo Scaling Good free tier
Public (mainnet-beta) Free Rate limited, unreliable

Recommendation: Use Helius or QuickNode for development. Never use public RPC for production trading.

Core Read Methods

Account & Balance

# SOL balance (in lamports, divide by 1e9 for SOL)
getBalance(pubkey, {commitment: "confirmed"})

# Full account info (data, owner, lamports, executable)
getAccountInfo(pubkey, {encoding: "jsonParsed"})

# Multiple accounts in one call
getMultipleAccounts([pubkey1, pubkey2], {encoding: "jsonParsed"})

Token Accounts

# All SPL token accounts owned by a wallet
getTokenAccountsByOwner(wallet_pubkey, {
    "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
}, {"encoding": "jsonParsed"})

# Token balance for a specific token account
getTokenAccountBalance(token_account_pubkey)

# Largest token accounts (top holders)
getTokenLargestAccounts(mint_pubkey)

# Total supply of a token
getTokenSupply(mint_pubkey)

Transaction Data

# Get parsed transaction by signature
getTransaction(signature, {
    "encoding": "jsonParsed",
    "maxSupportedTransactionVersion": 0,
})

# Recent transaction signatures for an address
getSignaturesForAddress(pubkey, {
    "limit": 20,
    "before": "optional_signature",  # pagination cursor
})

# Transaction status
getSignatureStatuses([sig1, sig2])

Block & Slot

# Current slot
getSlot({commitment: "confirmed"})

# Block data
getBlock(slot, {
    "encoding": "jsonParsed",
    "transactionDetails": "full",
    "maxSupportedTransactionVersion": 0,
})

# Latest blockhash (needed for tx building)
getLatestBlockhash({commitment: "confirmed"})

# Slot leader schedule
getLeaderSchedule()

Program Accounts

# All accounts owned by a program (with filters)
getProgramAccounts(program_pubkey, {
    "encoding": "jsonParsed",
    "filters": [
        {"dataSize": 165},  # Filter by account data size
        {"memcmp": {         # Filter by data content
            "offset": 32,
            "bytes": "base58_encoded_value",
        }},
    ],
})

Warning: getProgramAccounts without filters can return millions of results and timeout. Always use dataSize and/or memcmp filters.

Priority Fees

# Recent priority fee estimates
getRecentPrioritizationFees([account_pubkey])
# Returns array of { slot, prioritizationFee } for recent slots

# Minimum rent for account
getMinimumBalanceForRentExemption(data_length)

Write Methods

Send Transaction

# Send a signed, serialized transaction
sendTransaction(base64_tx, {
    "encoding": "base64",
    "skipPreflight": False,
    "preflightCommitment": "confirmed",
    "maxRetries": 3,
})

# Simulate before sending
simulateTransaction(base64_tx, {
    "encoding": "base64",
    "sigVerify": False,
    "commitment": "confirmed",
})

Transaction Confirmation

import time

def confirm_transaction(rpc_url: str, signature: str, timeout: float = 30.0) -> bool:
    """Poll for transaction confirmation."""
    start = time.time()
    while time.time() - start < timeout:
        result = rpc_call("getSignatureStatuses", [[signature]])
        statuses = result.get("result", {}).get("value", [None])
        if statuses[0] is not None:
            status = statuses[0]
            if status.get("err"):
                return False
            if status.get("confirmationStatus") in ("confirmed", "finalized"):
                return True
        time.sleep(0.5)
    return False

Commitment Levels

Level Description Use When
processed Single node confirmation Speed over safety
confirmed Supermajority (2/3+) Default for trading
finalized Maximum supermajority + 31 slots Critical operations

Always specify commitment explicitly. Default varies by provider.

Common Patterns

Get All Token Holdings for a Wallet

def get_wallet_tokens(wallet: str) -> list[dict]:
    """Get all SPL token holdings with metadata."""
    result = rpc_call("getTokenAccountsByOwner", [
        wallet,
        {"programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},
        {"encoding": "jsonParsed"},
    ])
    tokens = []
    for acct in result["result"]["value"]:
        info = acct["account"]["data"]["parsed"]["info"]
        tokens.append({
            "mint": info["mint"],
            "amount": int(info["tokenAmount"]["amount"]),
            "decimals": info["tokenAmount"]["decimals"],
            "ui_amount": info["tokenAmount"]["uiAmount"],
        })
    return [t for t in tokens if t["amount"] > 0]

Get Top Holders of a Token

def get_top_holders(mint: str) -> list[dict]:
    """Get the 20 largest holders of a token."""
    result = rpc_call("getTokenLargestAccounts", [mint])
    supply_result = rpc_call("getTokenSupply", [mint])
    total_supply = int(supply_result["result"]["value"]["amount"])

    holders = []
    for acct in result["result"]["value"]:
        amount = int(acct["amount"])
        holders.append({
            "address": acct["address"],
            "amount": amount,
            "decimals": acct["decimals"],
            "ui_amount": acct["uiAmount"],
            "percentage": amount / total_supply * 100 if total_supply > 0 else 0,
        })
    return holders

Batch RPC Calls

def rpc_batch(calls: list[tuple[str, list]]) -> list[dict]:
    """Execute multiple RPC calls in a single HTTP request."""
    payload = [
        {"jsonrpc": "2.0", "id": i, "method": method, "params": params}
        for i, (method, params) in enumerate(calls)
    ]
    resp = httpx.post(RPC, json=payload, timeout=30.0)
    results = resp.json()
    results.sort(key=lambda r: r["id"])
    return [r.get("result") for r in results]

Key Program IDs

Program ID
System 11111111111111111111111111111111
SPL Token TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Token-2022 TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
Associated Token ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL
Raydium AMM 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8
Raydium CLMM CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK
Orca Whirlpool whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc
Meteora DLMM LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo
PumpFun 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P
Jupiter v6 JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4
Compute Budget ComputeBudget111111111111111111111111111111

When to Use Direct RPC vs Higher-Level APIs

Need Use
Token balance check Direct RPC (getTokenAccountsByOwner)
Top 20 holders Direct RPC (getTokenLargestAccounts)
Historical OHLCV Birdeye or SolanaTracker
Parsed transaction history Helius Enhanced Transactions
Token metadata (name, image) Helius DAS API
Real-time streaming Yellowstone gRPC
Wallet PnL tracking SolanaTracker
Token risk scoring SolanaTracker
Cross-chain data DexScreener or CoinGecko

Files

References

  • references/methods.md — Complete RPC method reference with parameters and response schemas
  • references/error_handling.md — Error codes, rate limits, timeout handling, retry strategies
  • references/providers.md — RPC provider comparison with pricing and features

Scripts

  • scripts/wallet_scanner.py — Scan wallet for all token holdings with balances
  • scripts/token_holders.py — Get top holders and concentration metrics for any token