⚡ 原始 shreds 快速入门
Raw Shred Stream 把原始 (raw) Solana shreds 以 UDP 数据报的形式发送到您配置的 IP 和端口,直接进入您自己的接收器。本页展示如何绑定一个套接字并开始接收这些数据报,以确认数据正在流入。此后的去分片、重组和交易解码在您自己的管线中运行 —— 通过经过优化的解码器,以保住延迟优势。
想彻底跳过解码器?Decoded Shred Stream 交付的交易已按标准线格式完成重组。完整的原始 shred 管线请参见构建接收端。
📋 前提条件
- 在 ShredStream.com 创建账户
- 创建 Raw Shred Stream 并选择区域
- 输入服务器 IP 地址和接收 shreds 的 UDP 端口
- 开放 firewall 的入站 UDP 流量——详见 网络配置
💻 接收原始 shred 数据报
下面的示例在您于 ShredStream.com 上配置的端口上绑定一个 UDP 套接字,并打印每个到达数据报的大小。每个数据报都是一个原始 Solana shred —— 请交给您自己的去分片器 / 解码器处理。
Python
import os, socketPORT = 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
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
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
package mainimport ("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 / TypeScript | npm install shredstream | npm |
| Python | pip install shredstream | PyPI |
| Rust | cargo add shredstream | crates.io |
| Go | go get github.com/shredstream/shredstream-sdk-go/v2 | GitHub |
// cargo add shredstreamuse 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 transactionsfor (slot, transactions) in listener.transactions() {for tx in &transactions {println!("slot {}: {}", slot, tx.signatures[0]);}}}
⚙️ 操作系统 Buffer 调优
原始 UDP 接收器需要一个较大的套接字接收 buffer,否则在高负载下会丢包。请在操作系统层面允许更大的 buffer:
# Linuxsudo sysctl -w net.core.rmem_max=33554432# macOSsudo 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。