🔬 Формат пакетов
Этот справочник предназначен только для custom-приёмников. Наш формат shred оптимизирован под ShredStream.com — он не совпадает с тем, что ожидает стандартный Solana-инструментарий. SDK инкапсулирует всё это за вас. Читайте эту страницу, только если вы реализуете custom UDP-приёмник без нашего SDK. См. Почему стоит использовать SDK и Быстрый старт SDK.
📖 Обзор
Каждый UDP-пакет, доставляемый ShredStream.com, имеет ровно 1203 байта и содержит один legacy data shred (вариант 0xA5). ShredStream.com доставляет только data shreds -- FEC или coding shreds в поток не включены.
Каждый shred несёт часть данных записей (entries) slot Solana. Shreds поступают с последовательными индексами внутри каждого slot, начиная с 0. Чтобы восстановить полные данные блока для 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 | Номер slot, к которому принадлежит этот shred |
0x49 | 4 | Index | u32 LE | Индекс shred внутри slot (последовательный) |
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 байт | Максимальный payload на shred (80 байт зарезервировано для совместимости с wire-форматом Solana) |
🚩 Байт флагов
Байт флагов по смещению 0x55 отмечает границы пачки записей:
| Флаг | Значение | Смысл |
|---|---|---|
DATA_COMPLETE | 0x40 | Это последний data shred в текущей пачке записей |
⚠️ Важные замечания
- Только data shreds. ShredStream.com доставляет legacy data shreds (вариант
0xA5). FEC/coding shreds вы не получите. - Последовательные индексы. Внутри каждого slot индексы shreds начинаются с 0 и увеличиваются последовательно. Пропуск индекса означает, что shred был потерян при передаче.
- Размер payload. Поле Size указывает конец полезных данных. Байты payload находятся в data[0x58..size]. Байты за пределами смещения size -- нулевое дополнение.