Solana ShredStream SDK/Decoder for Rust, enabling ultra-low latency Solana transaction streaming via UDP shreds from ShredStream.com
Part of the ShredStream.com ecosystem โ ultra-low latency Solana shred streaming via UDP.
- Create an account on ShredStream.com
- Launch a Shred Stream and pick your region (Frankfurt, Amsterdam, Singapore, Chicago, and more)
- Enter your server's IP address and the UDP port where you want to receive shreds
- Open your firewall for inbound UDP traffic on that port (e.g. configure your cloud provider's security group)
- Install Rust and Cargo:
# Linux / macOS curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env
๐ Want to try before you buy? Open a ticket on our Discord to request a free trial.
# Initialize your project (skip if you already have a Cargo.toml)
cargo init myproject
cd myprojectAdd shredstream to your Cargo.toml:
[dependencies]
shredstream = "2.0"Edit src/main.rs:
use shredstream::ShredListener;
fn main() {
let port: u16 = std::env::var("SHREDSTREAM_PORT")
.ok().and_then(|v| v.parse().ok()).unwrap_or(8001);
let mut listener = ShredListener::bind(port).expect("bind");
// Decoded transactions โ ready-to-use Solana transactions
for (slot, transactions) in listener.transactions() {
for tx in &transactions {
println!("slot {}: {}", slot, tx.signatures[0]);
}
}
}Run it:
cargo runShredListener::bind(port: u16) -> io::Result<Self>โ Bind with defaults (64 MB recv buf, 3 slot window, FEC enabled)ShredListener::bind_with_options(port, opts) -> io::Result<Self>โ Custom configurationShredListener::from_socket(socket, opts) -> io::Result<Self>โ Adopt an existingUdpSocketlistener.transactions() -> TransactionIterโ Blocking iterator yielding(slot, Vec<VersionedTransaction>)listener.shreds() -> ShredIterโ Blocking iterator yieldingRawShredheaders (no decode)listener.handle_packet(&[u8]) -> Option<(u64, Vec<VersionedTransaction>)>โ Inject an externally-received UDP datagramlistener.local_addr() -> io::Result<SocketAddr>โ Bound socket addresslistener.slot_count() -> usizeโ Number of slots currently active in the window
| Field | Type | Default | Description |
|---|---|---|---|
recv_buf |
usize |
64 * 1024 * 1024 |
SO_RCVBUF size |
max_age |
u64 |
3 |
Slot retention window |
busy_poll_us |
Option<u32> |
Some(200) |
Linux SO_BUSY_POLL ยตs (None disables) |
pool_size |
usize |
4096 |
Number of 2 KiB buffers in the zero-copy pool |
enable_fec |
bool |
true |
Reed-Solomon recovery on dropped data shreds |
disable_salvage_delivery |
bool |
false |
Drop salvaged tail txs for lowest p99 |
accumulator |
AccumulatorConfig |
defaults | FEC and stuck-batch tuning |
| Field | Type | Default | Description |
|---|---|---|---|
max_fec_sets_per_slot |
usize |
32 |
Per-slot FEC buffer cap |
stuck_batch_timeout |
Duration |
50ms |
Force-finalize a stuck batch after this delay |
Read-only counters on &ShredListener:
| Group | Methods |
|---|---|
| Throughput | data_shred_count_total, code_shred_count_total, bytes_received, slot_count |
| Decoder | batches_decoded_streaming_total, batches_decoded_fallback_total, batches_skipped_total, decode_errors_total |
| FEC | fec_recoveries_total, fec_recovery_failures_total, fec_sets_discarded_unused_total, fec_sets_evicted_early_total |
| Unparseable | unparseable_packets, unparseable_too_short, unparseable_variant, unparseable_payload, unparseable_slot_range |
| Slot lifecycle | slots_completed_total, slots_evicted_by_age, dropped_known_slots, harvested_batches_total, salvaged_tail_tx_total |
| Tail control | batches_force_finalized_corrupted_total, batches_force_finalized_timeout_total |
| Pool / I-O | pool_exhausted_count, last_io_error_kind, busy_poll_active |
shredstream::classify_variant(byte) -> Option<VariantKind>โ Classify a shred variant byte.VariantKindexposes.is_data(),.is_code(),.proof_size(),.resigned(),.merkle_suffix().shredstream::pin_current_thread_to_cpu(cpu_id: usize) -> io::Result<()>โ Best-effort thread pinning (Linux:sched_setaffinity; macOS: hint; other: no-op)
ShredStream.com shred data powers a wide range of latency-sensitive strategies โ HFT, MEV extraction, token sniping, copy trading, liquidation bots, on-chain analytics, and more.
ShredStream.com SDK detects PumpFun token creations ~499ms before they appear on PumpFun's live feed โ tested across 25 consecutive detections:
Ready-to-run example included: see
examples/pumpfun_creates.rs. Run withcargo run --release --example pumpfun_creates [port].
For high-throughput environments, increase the kernel receive buffer:
# Linux
sudo sysctl -w net.core.rmem_max=67108864
sudo sysctl -w net.core.busy_read=200
# macOS
sudo sysctl -w kern.ipc.maxsockbuf=67108864Need a feed? Launch a Solana Shred Stream on ShredStream.com โ sub-millisecond delivery, multiple global regions, 5-minute setup.
- ๐ Website: https://www.shredstream.com/
- ๐ Documentation: https://docs.shredstream.com/
- ๐ฆ X (Twitter): https://x.com/ShredStream
- ๐ฎ Discord: https://discord.gg/4w2DNbTaWD
- ๐ฌ Telegram: https://t.me/ShredStream
- ๐ป GitHub: https://github.com/ShredStream
- ๐ซ Support: Discord
- ๐ Benchmarks: Discord
MIT โ ShredStream.com
