⚡ 原始 shreds 快速入门

Raw Shred Stream原始 (raw) Solana shreds 以 UDP 数据报的形式发送到您配置的 IP 和端口,直接进入您自己的接收器。本页展示如何绑定一个套接字并开始接收这些数据报,以确认数据正在流入。此后的去分片、重组和交易解码在您自己的管线中运行 —— 通过经过优化的解码器,以保住延迟优势。

想彻底跳过解码器?Decoded Shred Stream 交付的交易已按标准线格式完成重组。完整的原始 shred 管线请参见构建接收端


📋 前提条件

  1. ShredStream.com 创建账户
  2. 创建 Raw Shred Stream 并选择区域
  3. 输入服务器 IP 地址和接收 shreds 的 UDP 端口
  4. 开放 firewall 的入站 UDP 流量——详见 网络配置

💻 接收原始 shred 数据报

下面的示例在您于 ShredStream.com 上配置的端口上绑定一个 UDP 套接字,并打印每个到达数据报的大小。每个数据报都是一个原始 Solana shred —— 请交给您自己的去分片器 / 解码器处理。

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 shred 字节 —— 交给你自己的去分片器 / 解码器。
print(f"shred: {len(shred)} bytes")

JavaScript / TypeScript

javascript
import dgram from 'node:dgram';
const PORT = parseInt(process.env.SHREDSTREAM_PORT || '8080', 10);
const sock = dgram.createSocket('udp4');
sock.on('message', (shred) => {
// 原始 Solana shred 字节 —— 交给你自己的去分片器 / 解码器。
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 shred 字节 —— 交给你自己的去分片器 / 解码器。
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 {
panic(err)
}
// 原始 Solana shred 字节 —— 交给你自己的去分片器 / 解码器。
fmt.Printf("shred: %d bytes\n", n)
}
}

通过 SHREDSTREAM_PORT 环境变量传入端口,将默认值 8080 替换为您在 ShredStream.com 仪表盘中为数据流配置的端口。


🧩 旧版客户端: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]);
}
}
}

⚙️ 操作系统 Buffer 调优

原始 UDP 接收器需要一个较大的套接字接收 buffer,否则在高负载下会丢包。请在操作系统层面允许更大的 buffer:

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

在应用中,请通过 setsockopt(或所用语言的等价接口)将套接字接收 buffer 请求为至少 25 MB。完整的 firewall 和 buffer 配置详见 网络配置


🚀 彻底跳过解码器

上面的接收循环只证明数据报正在到达。原始 shreds 仍然需要去分片、重组和交易解码 —— 这条管线由您构建。想彻底跳过它,请使用 ShredStream.com 的另一款产品 Decoded Shred Stream:交易到达时已按 Solana 标准线格式完成重组,您这一侧无需任何解码。通过 UDP 或 gRPC 交付,使用 decoded-shredstream 客户端接收:安装 decoded-shredstream(npm install decoded-shredstream / pip install decoded-shredstream / cargo add decoded-shredstream),或 Go 模块 go get github.com/shredstream/decoded-shredstream-go


➡️ 下一步

  • 构建接收端——完整的原始 shred 管线包含哪些部分,以及何时 Decoded Shred Stream 是更合适的选择
  • 网络配置——firewall 和操作系统级配置
  • 最佳实践——监控、冗余和性能优化
  • 故障排查——常见问题与解决方案
原始 shreds 快速入门 — Docs | ShredStream.com