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本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
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
$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. 下の青いボタンを押して
solana-rpc.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
solana-rpcフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
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 schemasreferences/error_handling.md— Error codes, rate limits, timeout handling, retry strategiesreferences/providers.md— RPC provider comparison with pricing and features
Scripts
scripts/wallet_scanner.py— Scan wallet for all token holdings with balancesscripts/token_holders.py— Get top holders and concentration metrics for any token