mcpField
S
solana-rpc

solana-rpc

github.com/agiprolabs开发456457 次安装8 周前更新
代码仓库

关于 solana-rpc

solana-rpc 是面向 Solana 开发者的数据与交易操作指南,介绍如何通过 JSON-RPC 直接读写链上数据,并提供方法参考和钱包扫描脚本。

主要功能

  1. 01查询账户、余额与代币账户
  2. 02读取交易、区块和程序账户
  3. 03发送交易并轮询确认状态
  4. 04批量执行 RPC 调用
  5. 05提供钱包扫描与持仓脚本

适用场景

  1. 01检查钱包 SOL 与 SPL 代币余额
  2. 02按条件枚举程序账户
  3. 03提交已签名交易并确认
  4. 04扫描钱包代币持仓或查询大户

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/agiprolabs/claude-trading-skills --skill solana-rpc

安装后在 Claude Code 中输入/solana-rpc确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
error_handling.md
methods.md
providers.md
scripts/
token_holders.py
wallet_scanner.py

详细介绍

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()

# 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 服务提供商

服务提供商免费套餐付费套餐备注
Helius每天 50K credits$49+/mo增强型 RPC、DAS API
QuickNode有限$49+/mo多链、WebSocket
Triton无免费套餐~$300+/mo捆绑 Yellowstone gRPC
Shyft有限$49+/mo捆绑 Yellowstone gRPC
Alchemy300M CU/mo按量扩展免费套餐不错
公共(mainnet-beta)免费—有速率限制,不可靠

建议:开发时使用 Helius 或 QuickNode。生产交易绝不要使用公共 RPC。

核心读取方法

账户与余额
# 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"})
代币账户
# 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)
交易数据
# 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])
区块与 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()
程序账户
# 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",
        }},
    ],
})

警告:不带筛选条件的 getProgramAccounts 可能返回数百万条结果并超时。务必使用 dataSize 和/或 memcmp 筛选条件。

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

# Minimum rent for account
getMinimumBalanceForRentExemption(data_length)

写入方法

发送交易
# 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",
})
交易确认
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 级别

级别说明适用场景
processed单节点确认优先速度而非安全性
confirmed超级多数(2/3+)交易的默认级别
finalized最大超级多数 + 31 个 Slot关键操作

务必明确指定 commitment。默认值因服务提供商而异。

常见模式

获取钱包的所有代币持仓
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]
获取某种代币的顶级持有者
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
批量 RPC 调用
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]

重要程序 ID

程序ID
System11111111111111111111111111111111
SPL TokenTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Token-2022TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
Associated TokenATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL
Raydium AMM675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8
Raydium CLMMCAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK
Orca WhirlpoolwhirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc
Meteora DLMMLBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo
PumpFun6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P
Jupiter v6JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4
Compute BudgetComputeBudget111111111111111111111111111111

何时使用直接 RPC,何时使用更高级的 API

需求使用方式
检查代币余额直接 RPC(getTokenAccountsByOwner)
顶级 20 位持有者直接 RPC(getTokenLargestAccounts)
历史 OHLCVBirdeye 或 SolanaTracker
已解析的交易历史Helius Enhanced Transactions
代币元数据(名称、图片)Helius DAS API
实时流Yellowstone gRPC
钱包 PnL 跟踪SolanaTracker
代币风险评分SolanaTracker
跨链数据DexScreener 或 CoinGecko

文件

参考资料
  • references/methods.md — 完整的 RPC 方法参考,包含参数和响应架构
  • references/error_handling.md — 错误代码、速率限制、超时处理和重试策略
  • references/providers.md — RPC 服务提供商比较,包含定价和功能
脚本
  • scripts/wallet_scanner.py — 扫描钱包中的所有代币持仓及余额
  • scripts/token_holders.py — 获取任意代币的顶级持有者和持仓集中度指标

评论

支持 Markdown