查 Solana 钱包交易:Solscan API vs 原生 RPC

Solana 生态里,Solscan 是最常用的区块浏览器(类似以太坊的 Etherscan)。除了网页查询,它也有 API——加上 Solana 原生 RPC,就够做钱包监控 / 交易分析 / DeFi 数据抓取了。

Solscan 网页能查什么

  • 交易:交易 hash → 转账明细、手续费、状态
  • 钱包地址:余额、SPL Token、NFT、历史交易
  • 区块:高度、出块时间、确认数
  • 代币:合约详情、持币地址、24h 交易量
  • NFT:铸造、转移
  • DeFi:部分 DEX / 质押 / 借贷协议数据

日常查东西直接搜地址或 hash 就行。要批量、定时、集成到自己系统里就得走 API。

Solscan Pro API

老公共 API public-api.solscan.io 现在已经不推荐了,改用 Pro API pro-api.solscan.io(免费额度也有)。

账户交易列表

GET https://pro-api.solscan.io/v2.0/account/transactions?address=<WALLET>&limit=10
Header: token: <API_KEY>

账户详情(余额、类型):

GET https://pro-api.solscan.io/v2.0/account/detail?address=<WALLET>

代币持仓

GET https://pro-api.solscan.io/v2.0/account/token-accounts?address=<WALLET>

pro-api.solscan.io 申请免费 API Key。速率限制看套餐,免费大概 60 次/分钟。

Solana 原生 RPC(更灵活)

不想被限流、想拿完整交易数据,走 JSON-RPC。任何 Solana 节点都支持。

列钱包最近交易签名

POST https://api.mainnet-beta.solana.com
Content-Type: application/json

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getSignaturesForAddress",
  "params": [
    "<WALLET>",
    { "limit": 20, "commitment": "finalized" }
  ]
}

查单笔交易详情

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransaction",
  "params": [
    "<SIGNATURE>",
    { "encoding": "jsonParsed", "maxSupportedTransactionVersion": 0 }
  ]
}

jsonParsed 编码会把系统程序、Token 程序的指令解析成人可读的 JSON,比 base58 好读多了。

Python 版本:定时监控新交易

import time
import requests

RPC = "https://api.mainnet-beta.solana.com"
WALLET = "<你的钱包地址>"

seen = set()

def rpc(method, params):
    r = requests.post(RPC, json={
        "jsonrpc": "2.0", "id": 1,
        "method": method, "params": params,
    }, timeout=10)
    return r.json().get("result")

def poll():
    sigs = rpc("getSignaturesForAddress", [WALLET, {"limit": 20}]) or []
    for s in reversed(sigs):
        sig = s["signature"]
        if sig in seen:
            continue
        seen.add(sig)

        tx = rpc("getTransaction", [
            sig,
            {"encoding": "jsonParsed", "maxSupportedTransactionVersion": 0},
        ])
        if not tx:
            continue

        block_time = tx.get("blockTime")
        err = tx["meta"]["err"]
        print(f"新交易 {sig[:16]}...  block_time={block_time}  err={err}")
        # 这里根据业务解析 innerInstructions 判断是转账 / swap / mint

while True:
    try:
        poll()
    except Exception as e:
        print("poll error:", e)
    time.sleep(15)

要点:

  • seen 记忆已处理签名,避免重复
  • reversed() 让最老的先出,保持时间顺序
  • 生产上把 seen 落地到 Redis / SQLite,重启不丢

免费 RPC 的坑

api.mainnet-beta.solana.com 是 Solana Labs 的公共节点,速率限制很紧,高频请求会 429。生产环境走托管 RPC:

免费额度足够个人项目。

拿 SPL Token 余额

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTokenAccountsByOwner",
  "params": [
    "<WALLET>",
    { "programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" },
    { "encoding": "jsonParsed" }
  ]
}

programId 是 SPL Token 程序的地址,返回该钱包持有的所有 SPL Token 账户,包含 mint 地址、余额、decimals。

一句话总结

Solscan API 好用但有限流,Solana 原生 RPC 更自由。核心组合 getSignaturesForAddress + getTransaction,生产环境别用免费公共节点,走 Helius / QuickNode。