# Аудит-пак цепочки доказательств Sentinel

Пакет собран 2026-10-31 01:30:26 UTC.

## Что здесь

- `events.jsonl` — 939 блоков (высоты 66642..67580), каждый с
  payload, хешами, подписью и публичным ключом подписанта;
- `roots.jsonl` — 130 опубликованных корней (реестр snin-hub) с подписью;
- `certs.jsonl` — внешние сертификаты Nostr (kind 8010) — то, что ушло наружу;
- `witnesses.jsonl` — подписи свидетелей под чекпоинтом (фаза 4): без них проверка
  не проходит;
- `manifest.json` — хеши этих файлов и границы пакета; `no-witness/` — негативный
  тест: тот же пакет без подписей свидетелей.

## Как проверить самому

Формулы (проверяются на любом языке, здесь — словами):

    content_hash = sha256(payload)
    unsigned     = sha256(prev_hash + "|" + content_hash + "|" + ts)
    block_hash   = sha256(unsigned + "|" + signature)

1. Возьми любую строку `events.jsonl`, посчитай `content_hash` от `payload` —
   он должен совпасть с полем `payload_hash`.
2. Посчитай `unsigned` и `block_hash` — должны совпасть с полями `block_hash`.
3. Проверь подпись `signature` (BIP340-schnorr) по `unsigned` и `signer_pub`.
4. Проверь `prev_hash` каждого блока = `block_hash` предыдущего (в пакете
   диапазон непрерывный).
5. Возьми корень из `roots.jsonl`: его `height` — это высота блока, а `root`
   должен быть равен `block_hash` этого блока. Подпись корня — подпись того же блока.
6. Возьми строку из `witnesses.jsonl` и посчитай `payload_hash` = sha256 от её тела
   `payload` в канонической форме: ключи по алфавиту, без пробелов, тот же порядок
   символов. Подпись `sig` (BIP340-schnorr) должна проверяться по `payload_hash` и
   `witness_pub`. Чекпоинт `height`/`root` должен совпасть с блоком этой высоты, а
   подписей РАЗНЫХ ключей должно быть не меньше двух, причём хотя бы одна — с
   источником `source`, начинающимся на `relay:` (свидетель прочитал сертификат
   с внешних релеев, а не из нашего же файла).

Если хоть один шаг не сходится — пакет недействителен, и это видно БЕЗ нашего участия.

## Честные границы

- Пакет не содержит всю цепочку: включён непрерывный хвост и все события
  действий за последние сутки. Полный лог доступен отдельно.
- Payload включён целиком: без него проверка хеша невозможна. Маскирование
  персональных данных до записи — отдельная задача.
- Проверка ссылок доказывает, что записи не переписаны ПОСЛЕ публикации корня.
  Она не доказывает, что в цепочку записано всё, что агент делал.
