关于 yellowstone-grpc
使用 Yellowstone gRPC 构建 Solana 数据消费程序的技能,通过推送式流获取验证器数据。内容涵盖过滤订阅、更新解析,以及面向交易和监控系统的连接管理。
主要功能
- 01流式接收交易、账户、slot 和区块
- 02按数据类型与地址过滤订阅
- 03解析交易更新
- 04断线重连并恢复数据流
适用场景
- 01监控 DEX 兑换和钱包活动
- 02跟踪账户变更时的池储备
- 03构建对延迟敏感的 Solana 交易系统
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill yellowstone-grpc安装后在 Claude Code 中输入/yellowstone-grpc确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/performance.mdproto_reference.mdproviders.mdsubscription_filters.mdscripts/monitor_wallets.pysubscribe_transactions.py详细介绍
Yellowstone gRPC — Solana 实时数据流
使用 Yellowstone gRPC 实时流式传输 Solana 上的每笔交易、账户更新、slot 和区块。这是任何对延迟敏感的 Solana 交易系统的基础——用推送式数据流取代 REST 轮询,实现约 5ms 的 slot 延迟。
为什么选择 Yellowstone gRPC
| 方式 | Slot 延迟(p90) | 适用场景 |
|---|---|---|
REST 轮询(getTransaction) | ~150ms+ | 历史查询 |
WebSocket(onLogs) | ~10ms | 简单通知 |
| Yellowstone gRPC | ~5ms | 生产级交易系统 |
Yellowstone 是一个 Geyser 插件,可通过 gRPC 提供 Solana 验证器数据。所有主要 RPC 提供商都在运行它。你可以订阅经过筛选的交易、账户变更、slot、区块和 entry 数据流,数据会主动推送给你。
快速开始
1. 获取访问权限
你需要一个支持 gRPC 的 RPC 提供商。完整对比请参阅 references/providers.md。
| 提供商 | gRPC 入门价格 | 备注 |
|---|---|---|
| Shyft | $199/mo | 性价比最高,7 个区域,无限带宽 |
| Helius | $999/mo | 包含 LaserStream 和 DAS API |
| Triton One | ~$2,900/mo | Yellowstone 的创建者,延迟最低 |
| QuickNode | 视套餐而定 | Marketplace 附加组件 |
| Chainstack | $49/mo(1 个数据流) | 经济型选项,筛选条件有限 |
| Alchemy | 提供免费套餐 | 按计算单元计量 |
2. 安装依赖项
# Python
uv pip install grpcio grpcio-tools protobuf base58 solders python-dotenv
# Generate Python stubs from proto files
git clone https://github.com/rpcpool/yellowstone-grpc.git
python -m grpc_tools.protoc \
-I./yellowstone-grpc/yellowstone-grpc-proto/proto/ \
--python_out=./generated \
--pyi_out=./generated \
--grpc_python_out=./generated \
./yellowstone-grpc/yellowstone-grpc-proto/proto/*.proto
# Rust — Cargo.toml
[dependencies]
yellowstone-grpc-client = "6.0.0"
yellowstone-grpc-proto = "6.0.0"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
futures = "0.3"
bs58 = "0.5"
# TypeScript
npm install @triton-one/yellowstone-grpc @solana/web3.js
3. 环境配置
export GRPC_ENDPOINT="https://grpc.ny.shyft.to" # your provider endpoint
export GRPC_TOKEN="your-x-token-here" # from provider dashboard
4. 连接并订阅
import grpc
import os
from generated import geyser_pb2, geyser_pb2_grpc
endpoint = os.environ["GRPC_ENDPOINT"].replace("https://", "")
token = os.environ["GRPC_TOKEN"]
# Authenticated TLS channel
auth_creds = grpc.metadata_call_credentials(
lambda ctx, cb: cb((("x-token", token),), None)
)
channel = grpc.secure_channel(
endpoint,
grpc.composite_channel_credentials(
grpc.ssl_channel_credentials(), auth_creds
),
options=[("grpc.max_receive_message_length", 64 * 1024 * 1024)],
)
stub = geyser_pb2_grpc.GeyserStub(channel)
核心概念
订阅类型
| 类型 | 获取的数据 | 适用场景 |
|---|---|---|
transactions | 包含元数据的完整交易 | DEX 兑换监控、跟单交易 |
accounts | 发生变更时的账户数据 | 池储备追踪、代币供应量 |
slots | Slot 推进事件 | 区块计时、确认追踪 |
blocks | 完整区块内容 | 区块级分析 |
blocks_meta | 仅区块元数据 | 轻量级区块追踪 |
entry | 区块 entry(shred 组) | 底层验证器数据 |
transactions_status | 不含完整数据的交易状态 | 轻量级确认 |
筛选逻辑
- 多种筛选类型(transactions + accounts)= AND — 你会收到匹配任意类型的更新
- 数组中的值(
account_include中的多个地址)= OR - 命名筛选条件可让你在响应中区分匹配的是哪个筛选条件
- 发送新的
SubscribeRequest会替换所有之前的筛选条件
Commitment 级别
| 级别 | 速度 | 安全性 | 适用场景 |
|---|---|---|---|
PROCESSED | 最快 | 可能被回滚 | 时间敏感型信号 |
CONFIRMED | 慢约 400ms | 超级多数已投票 | 大多数交易场景 |
FINALIZED | 慢约 6-12s | 不可逆 | 结算验证 |
常见订阅模式
监控 DEX 程序上的所有兑换
# Filter: all non-vote, non-failed transactions involving PumpFun
request = geyser_pb2.SubscribeRequest(
transactions={
"pumpfun": geyser_pb2.SubscribeRequestFilterTransactions(
account_include=["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"],
vote=False,
failed=False,
)
},
commitment=geyser_pb2.CommitmentLevel.PROCESSED,
)
追踪指定钱包
request = geyser_pb2.SubscribeRequest(
transactions={
"whales": geyser_pb2.SubscribeRequestFilterTransactions(
account_include=[
"WalletAddress1...",
"WalletAddress2...",
],
vote=False,
failed=False,
)
},
commitment=geyser_pb2.CommitmentLevel.CONFIRMED,
)
监控池储备(账户订阅)
request = geyser_pb2.SubscribeRequest(
accounts={
"raydium_pools": geyser_pb2.SubscribeRequestFilterAccounts(
account=["PoolAddress1...", "PoolAddress2..."],
)
},
commitment=geyser_pb2.CommitmentLevel.PROCESSED,
)
使用数据切片降低带宽占用
# Only get the first 40 bytes of account data (e.g., just the discriminator + key fields)
request = geyser_pb2.SubscribeRequest(
accounts={
"token_accounts": geyser_pb2.SubscribeRequestFilterAccounts(
owner=["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],
filters=[
geyser_pb2.SubscribeRequestFilterAccountsFilter(
token_account_state=True
)
],
)
},
accounts_data_slice=[
geyser_pb2.SubscribeRequestAccountsDataSlice(offset=0, length=40)
],
)
解析交易更新
收到 SubscribeUpdateTransaction 后,提取以下内容:
for update in stream:
if update.HasField("transaction"):
tx = update.transaction
info = tx.transaction
sig = base58.b58encode(info.signature).decode()
slot = tx.slot
msg = info.transaction.message
account_keys = [base58.b58encode(k).decode() for k in msg.account_keys]
# Instructions
for ix in msg.instructions:
program = account_keys[ix.program_id_index]
accounts = [account_keys[i] for i in ix.accounts]
data = ix.data # bytes — decode per program IDL
# Token balance changes (post-execution)
meta = info.meta
for tb in meta.post_token_balances:
mint = tb.mint
owner = tb.owner
amount = tb.ui_token_amount.ui_amount
完整字段文档请参阅 references/proto_reference.md。
生产环境架构
[gRPC Stream] → [Bounded Channel] → [Processing Workers]
(1K-100K cap) ├─ Parse instructions
├─ Update state / DB
└─ Trigger actions
关键模式:
- 将 I/O 与处理解耦——绝不要阻塞 gRPC 数据流
- 使用指数退避重连(100ms → 上限 60s)
- 断开连接后使用
from_slot恢复(为确保重组安全,向前回退约 32 个 slot) - 每隔 15-30 秒发送一次 ping,以保持连接
- 始终筛选
vote: false——投票交易约占所有流量的 70% - 将
max_receive_message_length设为 64MB 或更大(默认的 4MB 太小)
完整的生产环境检查清单请参阅 references/performance.md。
交易的关键程序 ID
| 程序 | 地址 | 功能 |
|---|---|---|
| PumpFun | 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P | 代币发行、绑定曲线交易 |
| PumpSwap | PSwapMdSai8tjrEXcxFeQth87xC4rRsa4VA5mhGhXkP | PumpFun 毕业代币兑换 |
| Raydium AMM | 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 | 旧版 AMM 兑换 |
| Raydium CLMM | CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK | 集中流动性 |
| Raydium CPMM | CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C | 恒定乘积做市 |
| Orca Whirlpool | whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc | 集中流动性 |
| Meteora DLMM | LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo | 动态流动性做市 |
| Jupiter V6 | JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 | 兑换聚合器 |
| Token Program | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | SPL 代币操作 |
文件
参考资料
references/providers.md— 服务提供商对比:端点、定价、身份验证、功能references/subscription_filters.md— 完整的筛选器参考,包含每种筛选器类型的示例references/proto_reference.md— 关键 protobuf 消息定义和字段文档references/performance.md— 连接管理、重新连接、背压、生产环境检查清单
脚本
scripts/subscribe_transactions.py— 按程序 ID 筛选并串流、解析交易scripts/monitor_wallets.py— 监控特定钱包的链上活动
评论
支持 Markdown