⚡ Быстрый старт (сырые шреды)

Raw Shred Stream доставляет сырые шреды Solana на ваш сервер в виде UDP-датаграмм — прямо в ваш собственный приёмник. Этот быстрый старт биндит UDP-сокет и принимает эти датаграммы, чтобы вы убедились, что данные идут. Дальше дешрединг, сборка и декодирование транзакций выполняются в вашем собственном конвейере — через оптимизированный декодер, чтобы преимущество по задержке сохранилось.

Хотите полностью обойтись без декодера? Decoded Shred Stream доставляет транзакции уже собранными в стандартном wire-формате. Полный конвейер сырых шредов описан в разделе Создание приёмника.


📋 Предварительные требования

  1. Создайте аккаунт на ShredStream.com
  2. Запустите Raw Shred Stream и выберите регион
  3. Укажите IP-адрес вашего сервера и UDP-порт для приёма shreds
  4. Откройте firewall для входящего UDP-трафика на этом порту -- см. Сетевая настройка

💻 Минимальный приёмник UDP

Каждый пример биндит UDP-сокет на порту, который вы указали при создании стрима на ShredStream.com, и печатает размер каждой входящей датаграммы. Пришедшие байты — это сырой шред Solana: отправьте их своему дешреддеру / декодеру.

🔹 Python

python
import os, socket
PORT = int(os.environ.get("SHREDSTREAM_PORT", 8080))
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", PORT))
while True:
shred, _ = sock.recvfrom(65535)
# Сырые байты шреда Solana — передайте их своему дешреддеру / декодеру.
print(f"shred: {len(shred)} bytes")

🔹 JavaScript / TypeScript

javascript
import dgram from 'node:dgram';
const PORT = parseInt(process.env.SHREDSTREAM_PORT || '8080');
const sock = dgram.createSocket('udp4');
sock.on('message', (shred) => {
// Сырые байты шреда Solana — передайте их своему дешреддеру / декодеру.
console.log('shred:', shred.length, 'bytes');
});
sock.bind(PORT, '0.0.0.0');

🔹 Rust

rust
use std::net::UdpSocket;
fn main() -> std::io::Result<()> {
let port: u16 = std::env::var("SHREDSTREAM_PORT")
.ok().and_then(|v| v.parse().ok()).unwrap_or(8080);
let sock = UdpSocket::bind(("0.0.0.0", port))?;
let mut buf = [0u8; 65535];
loop {
let (len, _) = sock.recv_from(&mut buf)?;
// Сырые байты шреда Solana — передайте их своему дешреддеру / декодеру.
println!("shred: {} bytes", len);
}
}

🔹 Go

Gogo
package main
import (
"fmt"
"net"
"os"
"strconv"
)
func main() {
port, _ := strconv.Atoi(os.Getenv("SHREDSTREAM_PORT"))
if port == 0 {
port = 8080
}
conn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4zero, Port: port})
if err != nil {
panic(err)
}
defer conn.Close()
buf := make([]byte, 65535)
for {
n, _, err := conn.ReadFromUDP(buf)
if err != nil {
continue
}
// Сырые байты шреда Solana — передайте их своему дешреддеру / декодеру.
fmt.Printf("shred: %d bytes\n", n)
}
}

Замените 8080 на порт, который вы указали для своего стрима в панели управления ShredStream.com.

Этот цикл лишь подтверждает, что датаграммы приходят. Сырым шредам по-прежнему нужны дешрединг, сборка и декодирование транзакций — этот конвейер строите вы. Чтобы полностью его пропустить, см. Decoded Shred Stream: транзакции приходят уже собранными.


🧩 Прежний клиент: shredstream

Внимание: наш клиент больше не рекомендуется для чувствительных к задержке сценариев. Отдавайте предпочтение другому клиенту или напрямую нашему сервису Decoded Shred Stream.

Если нужно решение, работающее уже сегодня, прежний клиент shredstream биндит порт, выполняет дешрединг и сборку на стороне клиента и отдаёт готовые транзакции Solana. Дешрединг на стороне клиента стоит задержки — подходит для старта, но не для борьбы за задержку.

ЯзыкУстановкаПакет
JavaScript / TypeScriptnpm install shredstreamnpm
Pythonpip install shredstreamPyPI
Rustcargo add shredstreamcrates.io
Gogo get github.com/shredstream/shredstream-sdk-go/v2GitHub
rust
// cargo add shredstream
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");
// Client-side deshredding → ready Solana transactions
for (slot, transactions) in listener.transactions() {
for tx in &transactions {
println!("slot {}: {}", slot, tx.signatures[0]);
}
}
}

⚙️ Тюнинг буферов ОС

Ваш приёмник должен запросить достаточно большой буфер приёма сокета (рекомендуется минимум 25 МБ) через setsockopt(SO_RCVBUF, ...). Кроме того, нужно разрешить этот размер буфера на уровне ОС:

bash
# Linux
sudo sysctl -w net.core.rmem_max=33554432
# macOS
sudo sysctl -w kern.ipc.maxsockbuf=33554432

Подробности -- в разделе Сетевая настройка.


➡️ Следующие шаги

Быстрый старт (сырые шреды) — Docs | ShredStream.com