# S³P Core — Step A
Минимальное ядро для BlockNet S³P:
- порезка на чанки;
- шифрование XChaCha20-Poly1305 (через HKDF-SHA256);
- код Рида–Соломона (GF(2^8)) для устойчивости к потерям;
- Merkle root и проверки включения;
- сквозной тест: encrypt → shard → потерять часть шардов → reconstruct → decrypt.
## Требования
- Rust (stable) и Cargo: https://www.rust-lang.org/ (на Windows установите также сборочные инструменты)
- Интернет для скачивания crate-зависимостей при первой сборке.
## Быстрый старт
```bash
unzip s3p-core-step-a.zip
cd s3p-core
cargo test
```
Ожидаемый результат — прохождение теста `end_to_end_with_losses_and_merkle`.
## Структура проекта
```
s3p-core/
Cargo.toml
src/
lib.rs
errors.rs
types.rs
chunk.rs
aead.rs
rs.rs
merkle.rs
tests/
step_a_pipeline.rs
```
## Что именно проверяем
- **AEAD:** данные шифруются/расшифровываются с AAD.
- **Erasure (RS):** данные режутся на data+parity шардов; при потере до `parity_shards` всё восстанавливается.
- **Merkle:** считаем корень и строим proof для произвольного листа; верификация проходит.
- **End-to-end:** сборка исходного буфера полностью совпадает с оригиналом.
## Полезные параметры
Откройте `tests/step_a_pipeline.rs` и правьте:
- `chunk_size` — размер чанка (байт).
- `data_shards`, `parity_shards` — параметры Рида–Соломона (чем больше parity, тем выше устойчивость).
- уровень потерь — простая стохастика `~33%` в примере; можно менять по своему сценарию.
## Типичные проблемы
- **Windows MSVC:** установите «Desktop development with C++» (Build Tools) для компиляции некоторых зависимостей.
- **Memory/Time:** если тест долго идёт — уменьшите `payload_len` и/или `chunk_size`.
## Что дальше (Step B)
- Добавим слой преобразования (Identity→Walsh-Hadamard) и фонтанные пакеты (LT-style).
- Опишем `SeriesCommit` и JSON-кодек, подготовим scid.
- Интеграционные тесты с libp2p (Node.js harness).
## Исправление ошибки chacha20poly1305
Если видите сообщение наподобие:
> package `s3p-core` depends on `chacha20poly1305` with feature `xchacha20` but `chacha20poly1305` does not have that feature
Просто используйте зависимость без фичи `xchacha20` (в проекте уже поправлено):
```toml
chacha20poly1305 = "0.10"
```
Затем выполните:
```bash
cargo update
cargo clean
cargo test
```