Solana Shreds Direct Feed: How It Cuts Trading Latency
Shred-level data arrives 200–400 ms before a block is confirmed — this guide explains how to subscribe to a shred feed, reconstruct partial slots, and act on order-book signals before competing bots see finalized state.
If you're running a Solana trading bot and reacting to confirmed blocks, you're trading yesterday's news. The Solana shreds direct feed is the mechanism that lets you see transaction data as the validator is still assembling the block — typically 200–400 ms before finalization — and for latency-sensitive strategies that gap is the whole game.
What Shreds Actually Are
Solana validators don't produce blocks in one shot. The leader breaks each block into shreds: fixed-size coded pieces (roughly 1,228 bytes each) that are broadcast over UDP using a turbine tree. A full slot contains ~25,600 shreds for a max-size block. The validator sends them as it produces them, not after.
Two shred types matter here:
- Data shreds — carry actual transaction payload (up to 1,051 bytes each)
- Coding shreds — Reed-Solomon parity pieces for reconstruction
You need ~50 % of the data shreds for a given FEC (forward error correction) set to reconstruct the transactions inside it. In practice, for transactions at the front of a block you can often reconstruct with the first few hundred shreds, which arrive well before the slot closes.
Subscribing to a Shred Feed
There are two practical approaches in production:
1. Co-locate and subscribe to the turbine tree directly. Run a node in the same datacenter as the validators (Equinix DA11 in Dallas is the main cluster). Configure it to receive shreds from the leader's turbine neighbors. This gives you raw UDP shred delivery before they're even gossip-propagated.
2. Use a shred-streaming service. Providers like Jito's ShredStream and a few private infra shops expose a gRPC or WebSocket endpoint that relays shreds from co-located nodes. You subscribe, receive a stream of ShredData messages, and handle reconstruction yourself — or use the callback they provide when an FEC set completes.
A minimal gRPC subscription in Rust looks roughly like this:
let mut client = ShredstreamClient::connect(endpoint).await?;
let request = SubscribeShredsRequest { slots: vec![] }; // all slots
let mut stream = client.subscribe_shreds(request).await?.into_inner();
while let Some(shred_msg) = stream.message().await? {
process_shred(shred_msg);
}
The hard part isn't subscribing — it's what happens next.
Reconstructing Partial Slots
Each FEC set covers 32 data shreds + 32 coding shreds. You can reconstruct the 32 data shreds from any 32 received pieces (data or coding). In practical network conditions with a co-located node you receive FEC sets in roughly 10–30 ms windows.
Your reconstruction pipeline needs to:
- Index incoming shreds by
(slot, fec_set_index, shred_index). Shreds arrive out of order over UDP. - Trigger Reed-Solomon recovery the moment you have 32 pieces in a set.
- Deserialize the transaction payload from the recovered data shreds. Solana's wire format: each entry is a
u64num_hashes +Hash+ a length-prefixed list ofTransaction. - Filter for your signal — a specific AMM instruction, a large swap, a liquidity deposit — before submitting your own transaction.
The key implementation detail: you don't need a complete slot. A swap on Raydium or Orca typically appears in an early batch of entries. If the signal is in FEC set 12 out of 400, you can be acting on it while sets 50–400 are still in flight.
Latency Numbers in Practice
From a co-located node in DA11 reacting to a leader on the same cluster:
| Stage | Typical delay |
|---|---|
| First shreds received after slot start | ~15 ms |
| FEC set 0–15 complete, early txns reconstructed | ~60–120 ms |
| Signal detected + your tx built and signed | +5–10 ms |
| Jito bundle submitted to block engine | +2–5 ms |
| Total: signal visible to your bot | ~80–140 ms |
RPC getBlock confirms slot |
~400–600 ms |
That 300–500 ms advantage is real and consistent on mainnet. For strategies like backrunning a large swap or reacting to a pool deposit, you're submitting your bundle before any non-shred-aware bot even knows the triggering transaction exists.
The Trade-Offs and Failure Modes
This isn't free. A few things to plan for:
Partial reconstruction failures. Network drops or turbine propagation hiccups mean you occasionally miss shreds and can't reconstruct an FEC set in time. Build a fallback: if you don't reconstruct within X ms, fall back to a Geyser account subscription or a fast RPC for that slot. Your hit rate on early reconstruction will be 90–95 %+ from a good co-location, not 100 %.
Leader rotation. Each slot has a different leader, and turbine paths shift accordingly. Your shred-feed provider needs to track the leader schedule and switch sources — handle this transparently or your feed goes dark every 400 ms.
False signals from failed transactions. Reconstructed transactions haven't been executed yet. A swap you detect in shreds might fail (slippage, insufficient funds, compute limit). You need to simulate the transaction or use a conservative reaction strategy that still profits even if your triggering tx reverts.
Jito bundle timing. If you're submitting a Jito bundle to follow the triggering tx in the same block, you need to win the leader's attention before the slot closes (~400 ms total). With 80–140 ms reaction time you typically have ~250 ms to build, sign and land your bundle — tight but workable.
For our Solana MEV and arbitrage bots we use shred feeds as the primary signal path, with Geyser account subscriptions as the hot fallback. The combo covers the edge cases without paying the latency penalty of going RPC-first.
When Shred Feeds Are Worth the Complexity
The infra cost is real: you need a co-location arrangement or a paid shred-stream subscription, a reconstruction library (write in Rust, not TypeScript — you need the throughput), and careful failure-mode handling. That's a few weeks of engineering for a team that hasn't done it before.
The payoff is clear for:
- Backrunning swaps — detect a large trade 300 ms early, land an arb bundle in the same block
- Sniper bots — see a pool creation in shreds, not confirmed state, and get an earlier queue position in the Jito block engine
- Copy-trading — mirror a target wallet with a 300 ms head start over bots watching confirmed blocks
For strategies that aren't competing on raw speed — funding harvesting, grid strategies, event-driven signals from external data — the complexity doesn't pay for itself and a Geyser-based infra pipeline is the right call.
If your edge depends on being first in the block, shred-level data is the correct input. Everything else is waiting in line.
If you want shred-feed integration built into your Solana bot, or you're evaluating whether the latency gain is worth it for your specific strategy, reach out and let's scope it.
Need a bot like this built?
We design, build and run trading bots on Solana, Hyperliquid and Polymarket.
Start a projectMore from the blog
Public vs Paid RPC: How to Run a Fair Benchmark
A fair comparison of public and paid RPC endpoints must account for quotas, workload, freshness and support guarantees.
Read articleRPC Benchmark Percentiles Explained: p50, p95 and p99
Why averages hide the latency spikes that break trading bots, wallets and production blockchain applications.
Read articleHyperliquid REST vs WebSocket Benchmark: What to Measure
A benchmark plan for Hyperliquid market data that separates request latency from streaming freshness and recovery.
Read article