mcpField
Y
yellowstone-grpc

yellowstone-grpc

github.com/agiprolabs数据与数据库456437 次安装8 周前更新
代码仓库

关于 yellowstone-grpc

使用 Yellowstone gRPC 构建 Solana 数据消费程序的技能,通过推送式流获取验证器数据。内容涵盖过滤订阅、更新解析,以及面向交易和监控系统的连接管理。

主要功能

  1. 01流式接收交易、账户、slot 和区块
  2. 02按数据类型与地址过滤订阅
  3. 03解析交易更新
  4. 04断线重连并恢复数据流

适用场景

  1. 01监控 DEX 兑换和钱包活动
  2. 02跟踪账户变更时的池储备
  3. 03构建对延迟敏感的 Solana 交易系统

安装

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

$npx skills add https://github.com/agiprolabs/claude-trading-skills --skill yellowstone-grpc

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

包含的文件

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

references/
performance.md
proto_reference.md
providers.md
subscription_filters.md
scripts/
monitor_wallets.py
subscribe_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/moYellowstone 的创建者,延迟最低
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发生变更时的账户数据池储备追踪、代币供应量
slotsSlot 推进事件区块计时、确认追踪
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

程序地址功能
PumpFun6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P代币发行、绑定曲线交易
PumpSwapPSwapMdSai8tjrEXcxFeQth87xC4rRsa4VA5mhGhXkPPumpFun 毕业代币兑换
Raydium AMM675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8旧版 AMM 兑换
Raydium CLMMCAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK集中流动性
Raydium CPMMCPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C恒定乘积做市
Orca WhirlpoolwhirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc集中流动性
Meteora DLMMLBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo动态流动性做市
Jupiter V6JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4兑换聚合器
Token ProgramTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DASPL 代币操作

文件

参考资料
  • 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