🔬 数据包格式
📖 概述
ShredStream.com 传送的每个 UDP 数据包固定为 1203 字节,包含一个 legacy data shred(variant 0xA5)。ShredStream.com 仅传送 data shreds——流中不包含 FEC 或 coding shreds。
每个 shred 承载 Solana slot 条目数据的一部分。同一 slot 内的 shreds 按顺序索引到达,从 0 开始。要重建某个 slot 的完整区块数据,需收集该 slot 的所有 shreds,按索引排序,然后拼接 payload。
📐 偏移量表
| 偏移量 | 大小 | 字段 | 类型 | 说明 |
|---|---|---|---|---|
0x00 | 64 | Signature | bytes | 64 个零字节。ShredStream.com 不对 shreds 签名;请勿验证此字段 |
0x40 | 1 | Shred Variant | u8 | 始终为 0xA5(legacy data shred) |
0x41 | 8 | Slot | u64 LE | 此 shred 所属的 slot 编号 |
0x49 | 4 | Index | u32 LE | slot 内的 shred 索引(顺序递增) |
0x4D | 2 | Version | u16 LE | 始终为 0——ShredStream.com 未使用 |
0x4F | 4 | FEC Set Index | u32 LE | 始终为 0——ShredStream.com 未使用 |
0x53 | 2 | Parent Offset | u16 LE | 始终为 0——ShredStream.com 未使用 |
0x55 | 1 | Flags | u8 | 边界标志:DATA_COMPLETE = 0x40 |
0x56 | 2 | Size | u16 LE | 有效总大小(头部 + payload)。Payload = data[0x58..size] |
0x58 | 可变 | Payload | bytes | 实际条目数据 |
| payload 之后 | 可变 | 零填充 | bytes | 从 payload 末尾到第 1203 字节的未使用字节(均为零) |
📏 常量
| 常量 | 值 | 说明 |
|---|---|---|
SHRED_MAX_SIZE | 1203 字节 | 每个 UDP 数据包的固定大小 |
DATA_HEADER_SIZE | 88 字节(0x58) | payload 之前的总头部大小 |
MAX_PAYLOAD_SIZE | 1035 字节 | 每个 shred 的最大 payload(80 字节保留用于 Solana 线路格式兼容性) |
🚩 Flags 字节
偏移量 0x55 处的 flags 字节标示条目批次边界:
| 标志 | 值 | 含义 |
|---|---|---|
DATA_COMPLETE | 0x40 | 当前条目批次中的最后一个 data shred |
⚠️ 重要说明
- **仅 data shreds。**ShredStream.com 传送 legacy data shreds(variant
0xA5)。您不会收到 FEC/coding shreds。 - **顺序索引。**每个 slot 内的 shred 索引从 0 开始顺序递增。缺少某个索引意味着该 shred 在传输中丢失。
- **Payload 大小。**Size 字段指示有效数据的结束位置。Payload 字节位于 data[0x58..size]。超出 size 偏移量的字节为零填充。