Guide · Yellowstone gRPC

Solana gRPC Guide

A practical walkthrough of Yellowstone gRPC — what it is, how it compares to WebSocket and RPC polling, what you can subscribe to, and how to wire it up in under 20 lines of code.

Last updated April 2026 · ~8 min read

What is Solana gRPC?

Yellowstone gRPC is the streaming protocol the Solana ecosystem has converged on for real-time blockchain data. It ships as a Geyser plugin on validators, exposing account, transaction, slot, and block updates over a bidirectional gRPC stream. Payloads are protobuf-encoded, subscriptions are server-side filtered, and the connection is bidirectional with explicit flow control.

If you are building a trading bot, an indexer, a wallet, or a block explorer — and you need to see what's happening on Solana as it happens — Yellowstone gRPC is what you use. Standard JSON-RPC and WebSocket pubsub still work, but they are strictly slower and strictly less efficient at scale.

gRPC vs WebSocket vs RPC polling

AspectHTTP RPC pollingWebSocket pubsubYellowstone gRPC
Delivery modelPull (request/response)Push (per-account subscribe)Push (filter-based subscribe)
Wire formatJSONJSONProtobuf (binary)
Filter granularityNone (client polls)Per-account subscribeComplex server-side filters
Flow controlN/ATCP-level onlyBuilt-in gRPC flow control
Typical latencyPoll cadence + 20–200ms50–250ms after block0–100ms after block
Best forOccasional lookups, batch analyticsLow-volume wallet/UI updatesMEV, indexing, HFT, orderbooks

What you can subscribe to

The Yellowstone protobuf surface exposes seven subscription types:

  • subscribeAccounts — account data changes by owner program, address, or lamport filter
  • subscribeTransactions — transactions filtered by account, by program, with or without votes, with or without failed
  • subscribeBlocks — full blocks with optional transaction payload
  • subscribeBlockMeta — lightweight block headers only
  • subscribeSlots — slot status (processed / confirmed / finalized / first-shred-received)
  • subscribeEntry — individual entries (shred groups) as they assemble into a block
  • ping — bidirectional keepalive

Filters combine with logical AND semantics. A subscription like "all successful transactions touching program X and account Y, with account updates for Y" is a single stream, not two.

Quick start — TypeScript

Minimal working subscription that streams new raw transactions touching the pump.fun program:

import Client, {
  CommitmentLevel,
  SubscribeRequest,
} from "@triton-one/yellowstone-grpc";

const client = new Client(
  "https://grpc.allenhark.com",
  "YOUR_API_TOKEN",
  { "grpc.max_receive_message_length": 64 * 1024 * 1024 }
);

const req: SubscribeRequest = {
  accounts: {},
  slots: {},
  transactions: {
    pumpfun: {
      accountInclude: ["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"],
      accountExclude: [],
      accountRequired: [],
      vote: false,
      failed: false,
    },
  },
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.PROCESSED,
};

const stream = await client.subscribe();
stream.on("data", (data) => console.log(data.transaction));
stream.write(req);

Quick start — Rust

use yellowstone_grpc_client::GeyserGrpcClient;
use yellowstone_grpc_proto::prelude::*;

let mut client = GeyserGrpcClient::build_from_shared("https://grpc.allenhark.com")?
    .x_token(Some("YOUR_API_TOKEN"))?
    .connect()
    .await?;

let (mut tx, mut rx) = client.subscribe().await?;

tx.send(SubscribeRequest {
    transactions: [("pumpfun".into(), SubscribeRequestFilterTransactions {
        account_include: vec!["6EF8...".into()],
        vote: Some(false),
        failed: Some(false),
        ..Default::default()
    })].into_iter().collect(),
    commitment: Some(CommitmentLevel::Processed as i32),
    ..Default::default()
}).await?;

while let Some(update) = rx.next().await {
    println!("{:?}", update?);
}

Who provides Yellowstone gRPC?

Every serious Solana infrastructure vendor now offers a gRPC endpoint. Pick on geographic proximity to your workload, filter-quality (many providers leak extra data through loose filters), and billing model:

  • Helius — strong developer docs, per-connection pricing, multi-region
  • Triton One — project of record for the Yellowstone plugin itself
  • QuickNode — multi-chain, broader feature set, higher entry pricing
  • Chainstack — enterprise-focused, SLA-backed
  • Shyft — data-platform-first, gRPC alongside indexed APIs
  • AllenHarkSlipstream bundles gRPC with transaction submission and runs from Frankfurt, Amsterdam, Chicago, and beyond — useful when your bot both reads and writes the chain from the same process

Latency optimizations

Four levers to pull in order of impact:

  1. Co-locate the consumer near the gRPC endpoint. Frankfurt sits at the center of the European Solana validator set — 0-3ms RTT to most EU leaders. AllenHark co-location in Frankfurt is the cleanest way to remove hops.
  2. Tune server-side filters. Every byte the server sends you is a byte of backpressure risk. Most slow gRPC clients are slow because they asked for everything.
  3. Use commitment: processed when you can tolerate microscopic rollback risk. You save 400ms over confirmed and ~10s over finalized.
  4. Go one layer lower with shred streams. Yellowstone gRPC is still block-boundary limited — you see data after the validator assembles the block. ShredStream surfaces data as shreds arrive, which is the absolute floor for Solana latency.

When not to use gRPC

Counter to common advice: don't default to gRPC for every workload. If you are running a batch indexer that catches up overnight, RPC getSignaturesForAddress is simpler and cheaper. If you are building a wallet that shows a balance, WebSocket pubsub is fine. gRPC's value scales with real-time requirements and subscribed-entity count. A bot that watches 20,000 accounts and must react within one slot — that is the gRPC sweet spot.

Further reading

Frequently asked questions

What is Yellowstone gRPC on Solana?

Yellowstone gRPC is a streaming protocol for Solana data, exposed by validators via a Geyser plugin. It pushes real-time account updates, transactions, and block metadata over a bidirectional gRPC stream with protobuf-encoded payloads, filter-based subscriptions, and flow control. It was originally developed by Triton One and has become the de-facto streaming standard across Solana infrastructure providers including Helius, QuickNode, Shyft, and AllenHark.

How is gRPC different from Solana WebSocket subscriptions?

WebSocket (rpc.methods pubsub) is limited by JSON overhead, uses a separate subscription per account, and provides no built-in filtering at the server. gRPC pushes binary protobuf, lets you subscribe to thousands of accounts or transactions by a single server-side filter, and has bidirectional flow control. Real-world latency difference: gRPC typically delivers new block data 50-200ms faster than the WebSocket pubsub equivalent, and scales to tens of thousands of subscribed keys per connection.

How is gRPC different from standard RPC polling?

Standard RPC (HTTP JSON) is request-response — you poll, you wait for a block, you poll again. That adds a round-trip of 20-200ms per poll plus polling cadence. gRPC is push: the server emits updates the moment the validator sees them. For account watching, MEV detection, or orderbook state replication, gRPC is an order of magnitude more efficient and dramatically lower latency.

What can I subscribe to on a Solana gRPC stream?

The Yellowstone protobuf exposes: `subscribeAccounts` (account changes by owner or address), `subscribeTransactions` (by account, by program, with/without votes, with/without failed), `subscribeBlocks` (full or header-only), `subscribeBlockMeta`, `subscribeSlots`, and `subscribeEntry` (shred entries as they assemble). You can combine filters in a single subscribe request — for example: all successful transactions touching program `TOKEN...` AND account `USDC...`, streamed with account updates.

What languages can I use for Solana gRPC?

Any language with a gRPC client. Officially supported: Rust (yellowstone-grpc-client), TypeScript (@triton-one/yellowstone-grpc), Python (via generated protobuf bindings), Go, and Java. The protobuf definitions are open-source — you can generate bindings for any target language gRPC supports.

Who provides Yellowstone gRPC endpoints?

Helius, QuickNode, Triton, Shyft, Chainstack, and AllenHark all offer Yellowstone gRPC endpoints. Differentiators: geographic region (Frankfurt matters for European validator proximity), number of subscribed keys per connection, commitment levels supported, backpressure behavior, and price per GB transferred. AllenHark's gRPC runs through Slipstream with leader-proximity routing across 4 global regions.

What does Solana gRPC cost?

Providers price gRPC differently: per-connection flat fee (Helius, QuickNode tiers), per-GB egress (Triton, Shyft), or bundled into a multi-product infrastructure plan (AllenHark — see the pricing page). For high-throughput MEV or orderbook workloads, per-GB pricing usually dominates the bill; audit your subscription filters carefully to avoid subscribing to the full mainnet transaction firehose when you only need one program.

How do I minimize latency on a Solana gRPC subscription?

Four levers. First, co-locate your consumer near the gRPC endpoint — Frankfurt is the center of gravity for EU validators. Second, tune server-side filters aggressively; the less you ship, the less backpressure you hit. Third, use commitment=processed, not confirmed or finalized, if you need lowest-latency data (at the cost of rollback risk). Fourth, prefer shred streams (AllenHark ShredStream, Jito ShredStream) for use cases where sub-block latency matters — gRPC is still block-boundary limited.

Ready to ship on Solana gRPC?

Slipstream combines Yellowstone gRPC with sender-agnostic transaction routing and 0-slot landing. Start on the free tier — 100 tokens a day, no deposit.