RPC Infrastructure

Yellowstone gRPC nodes for Solana, on bare metal and without a per-event meter

Yellowstone is the gRPC interface most serious Solana data products are built on. The proto lives in Triton's rpcpool/yellowstone-grpc repo, the SDKs are stable across Rust, Python, and TypeScript, and every credible provider (Triton, Helius LaserStream, QuickNode, Chainstack, us) wraps the same wire format. The differences are which filters work the way you'd expect, what the default max_receive_message_length is, whether the provider runs a replay buffer for reorg recovery, and how the bill scales when mainnet has a memecoin Tuesday. NoLimitNodes runs Yellowstone on the same bare-metal fleet as RPC and WebSocket. Endpoint is grpc.nln.clr3.org:443. Auth is x-api-key sent as gRPC metadata. We default 64MB payloads, support every filter the proto exposes, and don't bill per event.

Yellowstone-compatible64MB payloadsSub-50ms p99No per-event meterBare-metal routingRust + Python + TS SDKs
On-chain programs
  • Yellowstone gRPC (Geyser plugin)rpcpool/yellowstone-grpc, The reference Geyser plugin and protobuf spec. We run a fork pinned to upstream HEAD with a replay-aware patch.
  • Solana System Program11111111111111111111111111111111, The on-chain anchor every transaction lands against. Useful as the canonical accountInclude target while smoke-testing a stream.
  • Vote ProgramVote111111111111111111111111111111111111111, Vote=false is the single most important filter on any production stream. About 70% of mainnet transactions are vote txs.

The Yellowstone gRPC messages and filters you'll use

every protobuf you write into the stream and every update the server pushes back

EventTypeDescriptionFrequencyLatency
SubscribeRequesteventThe top-level request you write into the bidirectional stream. Carries every filter for accounts, txs, slots, and blocks.Low0ms
SubscribeRequestFilterAccountseventFilter accounts by pubkey, owner program, or memcmp/dataSize predicates. The cleanest replacement for accountSubscribe.High8ms
SubscribeRequestFilterTransactionseventFilter transactions by vote/failed flags plus accountInclude, accountExclude, and accountRequired arrays. The workhorse.Very high10ms
SubscribeRequestFilterSlotseventSlot stream with optional commitment-level scoping. The grpc cousin of slotUpdatesSubscribe.Very high6ms
SubscribeRequestFilterBlockseventFull-block stream with optional account-set scoping. Heavy; use blockMeta if you only need headers.Medium30ms
SubscribeRequestFilterBlocksMetaeventBlock metadata only: slot, blockhash, parent, transaction count, rewards. Cheap; ideal for chain walkers.High8ms
SubscribeUpdateAccounteventServer push: account write_version, owner, lamports, data, slot. Every account change matching your filter.Very high8ms
SubscribeUpdateTransactioneventServer push: full transaction with meta, instructions, inner instructions, balances, and log messages.Very high10ms
SubscribeUpdatePingeventHeartbeat from the server every 10 seconds. Silence is your reconnect signal.Medium0ms
CommitmentLevel.PROCESSEDeventThe earliest commitment, typically 200-400ms after the originating slot. Reorg risk exists; reconcile at confirmed.Very high8ms

gRPC streaming performance at a glance

last reviewed 2026-04-28

p50 stream latency
12ms
Slot landing to client receipt at PROCESSED commitment, US-East
Verified 2026-04-28
Sustained throughput
~5,000 msg/s
Per single connection without backpressure on a Token-2022 program filter
Verified 2026-04-28
Default max payload
64MB
Up from the upstream 4MB; needed for full-block subscriptions
Verified 2026-04-28
Stream uptime SLO
99.95%
Pro and Ultra plans, monthly rolling

Yellowstone gRPC, explained without the marketing

Yellowstone is two things stacked on each other. There's a Geyser plugin that runs inside the Agave validator and listens to the runtime as accounts get written, transactions get packed into slots, and slots get rooted. There's a gRPC server in front of that plugin which serializes those events into Protocol Buffers and ships them out over HTTP/2. The combined thing is what the ecosystem calls Yellowstone, and the source of truth for both halves is github.com/rpcpool/yellowstone-grpc.

Triton built it. They open-sourced the proto and the plugin, then everyone else (Helius for LaserStream, QuickNode for their Yellowstone offering, Chainstack, us) built our own deployments on top. The wire format is identical across vendors. A subscriber written against Triton's SDK works against ours, against QuickNode's, against Chainstack's. The SDK is published for Rust (yellowstone-grpc-client), Python (yellowstone-grpc-proto), and TypeScript (@triton-one/yellowstone-grpc). Go has community ports.

The mental model: you open a single bidirectional stream with Subscribe, you write one or more SubscribeRequest messages describing what you want, and the server pushes back SubscribeUpdate messages forever. You can update the request mid-stream to change filters without disconnecting. That's the entire protocol. Any provider that ships something different on top is layering it.

The four data layers: Geyser, gRPC, LaserStream, decoded streams

The Solana data stack has more layers than the marketing pages admit. Knowing which one you're actually buying makes the provider comparison easier.

LayerWhat it isWho runs it
GeyserValidator plugin interfaceAnza / Solana core
Yellowstone gRPCOpen-source streaming plugin + protoTriton (rpcpool/yellowstone-grpc)
Replay tiersgRPC + persistent replay buffer for reorgsHelius LaserStream, Triton Dragon's Mouth
Decoded streamsParsed events typed against program IDLsNoLimitNodes, Helius enhanced, Bitquery

Layer one (Geyser) is part of the validator. You don't consume it directly unless you're running your own node and writing a plugin. We do that on Geyser plugin hosting; the rest of the time you consume layer two and up.

Layer two (Yellowstone gRPC) is what every provider on this page ships. Same proto, same SDK, same wire format. The differences are deployment quality (how close to leader, how many regions), defaults (max payload, ping cadence), and pricing model.

Layer three (replay tiers) is the LaserStream and Dragon's Mouth angle. They keep N slots of history in a buffer and let you replay from a slot you missed. Genuinely useful if you're an indexer where missing a slot means a permanent gap. Less useful for real-time work where you care about now.

Layer four (decoded streams) is where we ship parsed events for Raydium AMM v4 / CLMM / CPMM, Pump.fun, Orca, Meteora, Jupiter, and a growing list. You skip the IDL load and the discriminator routing. That product line is on Enhanced Streams; this page is the layer-two transport that powers it.

How to pick a gRPC provider (Triton vs Helius vs QuickNode vs us)

Four providers will show up in your shortlist. We'll be direct about where each one wins.

Triton

They built Yellowstone. SLA and proto-version freshness are best-in-class. Pricing is at the top of the market. If you're a fund that buys on reputation and replay guarantees, Triton is rarely the wrong call. Their Dragon's Mouth Replay tier is the only commercial alternative to LaserStream for reorg recovery.

Helius LaserStream

Wins on replay. The buffer holds enough slots to recover from any normal-sized reconnect or reorg, which is the right answer for an indexer that genuinely cannot lose data. Per-event metering can spike on busy days; the parsed enhancements are good if you're building inside the Helius ecosystem.

QuickNode

Strongest global edge presence. Flat pricing on most plans. The Yellowstone proto sometimes lags upstream by a release, which matters if you're relying on a brand-new field. Their support is fast and their dashboard is the cleanest in the category.

NoLimitNodes

Bare-metal close to the validator set, 64MB default payloads, no per-event meter, and the decoded stream layer on top for the major DeFi programs. We don't run a replay buffer today; if that's your blocker, LaserStream is the right call and we'll say so.

The decision tree is short. If you need replay, LaserStream or Triton Dragon's Mouth. If you need flat pricing on real-time gRPC plus parsed DeFi events, us. If you need a single-vendor stack that covers RPC, WS, gRPC, and NFT APIs, Helius or QuickNode. If you need the highest SLA on a single contract, Triton.

Production patterns: filtering, multiplexing, backpressure

Yellowstone gives you a lot of rope. The default-everything stream (no filters, all commitments) is roughly 100MB/s of mainnet data. Three patterns separate teams that ship from teams that wonder why their indexer keeps falling behind.

Filter at the server, always. The proto exposes accountInclude, accountExclude, accountRequired, plus vote and failed flags. Use all of them. A sniper bot that filters accountInclude=[Raydium AMM v4], vote=false, failed=false at PROCESSED commitment receives roughly 0.5% of the firehose. Same data, 200x less wire traffic, 200x less parsing in your client.

Multiplex multiple filters on one stream. A single SubscribeRequest can carry several named transactions filters and several named accounts filters. Each named filter produces tagged updates so you know which logical stream the message belongs to. This is better than opening four separate connections; HTTP/2 stream multiplexing handles the rest. We watch teams open one connection per program and saturate their socket budget unnecessarily.

Handle backpressure explicitly. If your client is slower than the message rate, the server will eventually drop you. The fix is to consume fast and offload to a queue (Redis, NATS, an in-memory channel) rather than doing real work in the gRPC handler. The Rust client gives you a tokio mpsc channel by default; the Python and TS clients leave it to you. A 4096-slot bounded channel between gRPC ingest and your business logic is the cheapest insurance you can buy.

One more pattern that earns its keep: ping-pong tracking. The server pushes an UpdatePing every 10 seconds. Track the timestamp of the last ping. If you go 30 seconds without one, force a reconnect. A silent gRPC connection isn't a healthy gRPC connection; it's a TCP connection where the kernel has given up and forgotten to tell you.

Migrating from logsSubscribe to gRPC

Most teams arrive at gRPC after their logsSubscribe pipeline starts dropping messages. The migration is mechanical once you know the field map.

WebSocketYellowstone gRPC
logsSubscribe mentions:[X]SubscribeRequestFilterTransactions { accountInclude: [X], vote: false, failed: false }
accountSubscribe(pubkey)SubscribeRequestFilterAccounts { account: [pubkey] }
programSubscribe + filtersSubscribeRequestFilterAccounts { owner: [program], filters: [...] }
slotSubscribeSubscribeRequestFilterSlots { filterByCommitment: true }
blockSubscribeSubscribeRequestFilterBlocks (or BlocksMeta if you only need headers)
signatureSubscribe(stays on RPC; gRPC has no signature ack analog)

The biggest win is usually parsing. With logsSubscribe you received an array of program log lines and decoded the bincode payload by hand. With gRPC the SubscribeUpdateTransaction carries the full transaction including the structured instruction list, the inner instructions, the loaded addresses, and the meta including pre/post balances and the log array if you still want the strings. You can decode against a program's IDL using the discriminator from the instruction data field directly, no log string parsing required.

The other practical win is filter precision. The mentions filter on logsSubscribe matches transactions that touched the program at all, including via inner instruction. The gRPC accountInclude plus accountRequired combo lets you scope to txs where the program is in the required-signers set, which cuts noise on Jupiter routes and other composed transactions where eight programs touch the same signature.

One last note. If you previously parsed program logs to extract custom event data emitted via msg!, those log strings are still in tx.meta.logMessages on the gRPC update. You don't lose that channel. You just finally get the structured fields next to it.

Frequently asked questions

Yellowstone is a Geyser plugin and a gRPC service that exposes Solana validator state as a streaming API. Triton built it; the canonical repo is github.com/rpcpool/yellowstone-grpc. The plugin runs inside the validator and forwards account writes, transactions, slots, and blocks out over a gRPC server. The wire format is Protocol Buffers; the SDK is published in Rust, Python, and TypeScript. Every credible streaming provider on Solana wraps the same proto, so the client code is portable across us, Triton, Helius LaserStream, QuickNode, and Chainstack.

Stream Solana over Yellowstone gRPC in under 60 seconds

Pro at $49/mo includes 5 concurrent gRPC streams with 64MB payloads. Ultra at $199/mo lifts the cap to 100 streams, 100MB payloads, and adds 30 hours of custom dev time plus priority support.

Ready to get started?

Get your free API key and start building in under 30 seconds.

Talk to Sales