- Transport
- UDP (raw packets)
- Max Shred Size
- 1,228 bytes
- Packet Frequency
- Continuous per slot
- Authentication
- IP whitelist
- Destination Config
- IP:port via dashboard
- Sync Frequency
- Every 5 seconds
Solana Shred Header Format
| Offset | Size | Field |
|---|
| 0x00 | 64 bytes | Signature (Ed25519) |
|---|
| 0x40 | 1 byte | Variant (type + auth) |
|---|
| 0x41 | 8 bytes | Slot (u64 little-endian) |
|---|
| 0x49 | 4 bytes | Index (u32 little-endian) |
|---|
| 0x4D | 2 bytes | Version (u16 little-endian) |
|---|
| 0x4F | 4 bytes | FEC Set Index (u32 little-endian) |
|---|
| 0x53+ | varies | Type-specific header + payload |
|---|
shred_listener.rsRust · receiver example
use std::net::UdpSocket;
use solana_ledger::shred::{
merkle::Shred, ShredType,
};
fn main() -> std::io::Result<()> {
let socket = UdpSocket::bind("0.0.0.0:9000")?;
let mut buf = [0u8; 1232];
loop {
let (len, _src) = socket.recv_from(&mut buf)?;
let raw = buf[..len].to_vec();
// Parse via solana_ledger (same as shredstream-proxy)
let shred = match Shred::from_payload(raw) {
Ok(s) => s,
Err(_) => continue,
};
let hdr = shred.common_header();
let kind = match shred.shred_type() {
ShredType::Data => "DATA",
ShredType::Code => "CODE",
};
println!(
"[{kind}] slot={} idx={} fec={} {len}B",
hdr.slot, shred.index(), shred.fec_set_index(),
);
}
}