# Набор для проверки журналов MITR Здесь лежит то, чем МОЖНО проверить наши журналы, не доверяя нам на слово, и честно сказано, чего этими данными проверить НЕЛЬЗЯ. **Коротко.** Скачайте проверщик и файл якорей и запустите `python3 verify_chain_standalone.py honesty_anchors-public.jsonl`. Код возврата 0 — якоря сошлись; 1 — не сошлись, и названа эпоха; 2 — проверить не удалось (нет файла, битая строка). ## Файлы | файл | что это | |---|---| | [`verify_chain_standalone.py.txt`](verify_chain_standalone.py.txt) | проверщик: только стандартная библиотека Python, ни одного импорта из нашего кода. Скачать и переименовать в `.py` (витрина скриптов не отдаёт — и правильно) | | `<цепь>_anchors-public.jsonl` | якоря: длина цепи, хеш головы, сцепка якорей между собой | | `anchor-epoch-N.json` + `.ots` | тело якоря и его метка времени OpenTimestamps (Bitcoin); у цепи `gate` имена с приставкой: `gate-anchor-epoch-N.json` | ## Цепи в этом наборе Якоря сцеплены между собой, поэтому последний коммитит всю историю эпох. Метки времени выложены для последних 10 эпох каждой цепи. «—» значит, что файла для этой эпохи в наборе нет; какие свидетели у эпохи были, записано в самом якоре. Эпоха без метки не остаётся без внешней даты: её хеш входит в следующий якорь, и метка следующей эпохи датирует её сверху. ### honesty — журнал честности: суточные вердикты Эпох: **88**, последняя — **87** (2026-09-25 04:55 UTC), длина цепи на ней **98**, признак целостности в записи якоря `chain_ok`: **true**; внешний свидетель последней эпохи: есть. Все якоря — [`honesty_anchors-public.jsonl`](honesty_anchors-public.jsonl). | эпоха | время якоря, UTC | длина цепи | тело якоря | метка | Bitcoin | |---|---|---|---|---|---| | 87 | 2026-09-25 04:55 | 98 | [`anchor-epoch-87.json`](anchor-epoch-87.json) | [`.ots`](anchor-epoch-87.json.ots) | блок 968505 | | 86 | 2026-09-24 04:57 | 97 | [`anchor-epoch-86.json`](anchor-epoch-86.json) | [`.ots`](anchor-epoch-86.json.ots) | блок 968359 | | 85 | 2026-09-23 04:56 | 96 | [`anchor-epoch-85.json`](anchor-epoch-85.json) | [`.ots`](anchor-epoch-85.json.ots) | блок 968232 | | 84 | 2026-09-22 04:55 | 95 | [`anchor-epoch-84.json`](anchor-epoch-84.json) | [`.ots`](anchor-epoch-84.json.ots) | блок 968102 | | 83 | 2026-09-21 04:54 | 94 | [`anchor-epoch-83.json`](anchor-epoch-83.json) | [`.ots`](anchor-epoch-83.json.ots) | блок 967945 | | 82 | 2026-09-20 04:50 | 93 | [`anchor-epoch-82.json`](anchor-epoch-82.json) | [`.ots`](anchor-epoch-82.json.ots) | блок 967797 | | 81 | 2026-09-19 04:50 | 92 | [`anchor-epoch-81.json`](anchor-epoch-81.json) | [`.ots`](anchor-epoch-81.json.ots) | блок 967667 | | 80 | 2026-09-18 16:20 | 91 | [`anchor-epoch-80.json`](anchor-epoch-80.json) | [`.ots`](anchor-epoch-80.json.ots) | блок 967579 | | 79 | 2026-09-18 04:51 | 91 | — | — | — | | 78 | 2026-09-17 04:50 | 90 | — | — | — | Время последней эпохи — чужим клиентом: `ots verify anchor-epoch-87.json.ots`. Метка датирует файл `anchor-epoch-87.json`; сверьте его с последней строкой `honesty_anchors-public.jsonl`. ### ledger — журнал решений: действия гейта Эпох: **43**, последняя — **42** (2026-10-15 05:15 UTC), длина цепи на ней **56**, признак целостности в записи якоря `chain_ok`: **true**; внешний свидетель последней эпохи: есть. Все якоря — [`ledger_anchors-public.jsonl`](ledger_anchors-public.jsonl). | эпоха | время якоря, UTC | длина цепи | тело якоря | метка | Bitcoin | |---|---|---|---|---|---| | 42 | 2026-10-15 05:15 | 56 | [`anchor-epoch-42.json`](anchor-epoch-42.json) | [`.ots`](anchor-epoch-42.json.ots) | ожидает блока | | 41 | 2026-10-14 05:15 | 56 | [`anchor-epoch-41.json`](anchor-epoch-41.json) | [`.ots`](anchor-epoch-41.json.ots) | блок 971356 | | 40 | 2026-10-13 05:15 | 56 | [`anchor-epoch-40.json`](anchor-epoch-40.json) | [`.ots`](anchor-epoch-40.json.ots) | блок 971197 | | 39 | 2026-10-12 05:16 | 56 | [`anchor-epoch-39.json`](anchor-epoch-39.json) | [`.ots`](anchor-epoch-39.json.ots) | блок 971049 | | 38 | 2026-10-11 05:16 | 56 | [`anchor-epoch-38.json`](anchor-epoch-38.json) | [`.ots`](anchor-epoch-38.json.ots) | блок 970875 | | 37 | 2026-10-10 05:15 | 56 | [`anchor-epoch-37.json`](anchor-epoch-37.json) | [`.ots`](anchor-epoch-37.json.ots) | блок 970729 | | 36 | 2026-10-09 05:16 | 56 | [`anchor-epoch-36.json`](anchor-epoch-36.json) | [`.ots`](anchor-epoch-36.json.ots) | блок 970591 | | 35 | 2026-10-08 05:17 | 56 | [`anchor-epoch-35.json`](anchor-epoch-35.json) | [`.ots`](anchor-epoch-35.json.ots) | блок 970446 | | 34 | 2026-10-07 05:15 | 56 | [`anchor-epoch-34.json`](anchor-epoch-34.json) | [`.ots`](anchor-epoch-34.json.ots) | блок 970296 | | 33 | 2026-10-06 05:15 | 56 | [`anchor-epoch-33.json`](anchor-epoch-33.json) | [`.ots`](anchor-epoch-33.json.ots) | блок 970135 | Время последней эпохи — чужим клиентом: `ots verify anchor-epoch-42.json.ots`. Метка датирует файл `anchor-epoch-42.json`; сверьте его с последней строкой `ledger_anchors-public.jsonl`. ### gate — цепь квитанций шлюза Эпох: **24**, последняя — **23** (2026-10-15 05:15 UTC), длина цепи на ней **4960**, признак целостности в записи якоря `chain_ok`: **true**; внешний свидетель последней эпохи: есть. Все якоря — [`gate_anchors-public.jsonl`](gate_anchors-public.jsonl). | эпоха | время якоря, UTC | длина цепи | тело якоря | метка | Bitcoin | |---|---|---|---|---|---| | 23 | 2026-10-15 05:15 | 4960 | [`gate-anchor-epoch-23.json`](gate-anchor-epoch-23.json) | [`.ots`](gate-anchor-epoch-23.json.ots) | ожидает блока | | 22 | 2026-10-14 05:15 | 4950 | [`gate-anchor-epoch-22.json`](gate-anchor-epoch-22.json) | [`.ots`](gate-anchor-epoch-22.json.ots) | блок 971356 | | 21 | 2026-10-13 05:15 | 4937 | [`gate-anchor-epoch-21.json`](gate-anchor-epoch-21.json) | [`.ots`](gate-anchor-epoch-21.json.ots) | блок 971197 | | 20 | 2026-10-12 05:16 | 4911 | [`gate-anchor-epoch-20.json`](gate-anchor-epoch-20.json) | [`.ots`](gate-anchor-epoch-20.json.ots) | блок 971049 | | 19 | 2026-10-11 05:16 | 4883 | [`gate-anchor-epoch-19.json`](gate-anchor-epoch-19.json) | [`.ots`](gate-anchor-epoch-19.json.ots) | блок 970875 | | 18 | 2026-10-10 05:15 | 4825 | [`gate-anchor-epoch-18.json`](gate-anchor-epoch-18.json) | [`.ots`](gate-anchor-epoch-18.json.ots) | блок 970729 | | 17 | 2026-10-09 05:16 | 4551 | [`gate-anchor-epoch-17.json`](gate-anchor-epoch-17.json) | [`.ots`](gate-anchor-epoch-17.json.ots) | блок 970591 | | 16 | 2026-10-08 05:17 | 4084 | [`gate-anchor-epoch-16.json`](gate-anchor-epoch-16.json) | [`.ots`](gate-anchor-epoch-16.json.ots) | блок 970446 | | 15 | 2026-10-07 05:15 | 3713 | [`gate-anchor-epoch-15.json`](gate-anchor-epoch-15.json) | [`.ots`](gate-anchor-epoch-15.json.ots) | блок 970296 | | 14 | 2026-10-06 05:15 | 3288 | [`gate-anchor-epoch-14.json`](gate-anchor-epoch-14.json) | [`.ots`](gate-anchor-epoch-14.json.ots) | блок 970135 | Время последней эпохи — чужим клиентом: `ots verify gate-anchor-epoch-23.json.ots`. Метка датирует файл `gate-anchor-epoch-23.json`; сверьте его с последней строкой `gate_anchors-public.jsonl`. ## Как проверить ```bash curl -O https://asi5.ru/console/verify/verify_chain_standalone.py.txt mv verify_chain_standalone.py.txt verify_chain_standalone.py # 1. якоря: пересчёт anchor_hash и сцепка эпох (файл якорей проверяется сам по себе) curl -O https://asi5.ru/console/verify/honesty_anchors-public.jsonl python3 verify_chain_standalone.py honesty_anchors-public.jsonl python3 verify_chain_standalone.py --explain # алгоритм словами, для своей реализации # 2. метка времени — чужим клиентом, не нашим (pip install opentimestamps-client) # имена тела и метки — из таблицы своей цепи: номера эпох у цепей совпадают, # и по номеру имя не угадывается curl -O https://asi5.ru/console/verify/anchor-epoch-N.json curl -O https://asi5.ru/console/verify/anchor-epoch-N.json.ots ots verify anchor-epoch-N.json.ots # со своим узлом Bitcoin ots --no-bitcoin verify anchor-epoch-N.json.ots # без узла: назовёт блок и корень Меркла ``` `ots verify` отвечает на главный вопрос: существовал ли этот хеш головы НА ТУ ДАТУ. Хеш-цепь сама по себе доказывает порядок записей, но не их время — переписать цепь целиком задним числом ничто не мешает. Метка времени в Bitcoin это закрывает, и проверяется она без нас. Оговорка, чтобы не выдавать желаемое за проверенное. Свежая метка сначала «pending»: календари OpenTimestamps приняли хеш, а блока ещё нет. Когда блок есть, мы дозаполняем метку (`ots upgrade`) и выкладываем её уже с аттестацией блока — колонка «Bitcoin» в таблицах выше называет его высоту по `ots info`. Такой метке календари для проверки не нужны; сверку с самим блоком клиент делает через СВОЙ узел Bitcoin. Узла у нас нет и ставить его мы не обещаем: эту часть проверяющий делает сам, поэтому доказательство от нас не зависит. Без своего узла `ots --no-bitcoin verify` печатает высоту блока и корень Меркла, который у этого блока обязан быть, — его можно сравнить с блоком той же высоты в любом обозревателе. ## Хеш-функция Цепи и якоря этого набора считаются SHA-256; точный алгоритм печатает `python3 verify_chain_standalone.py --explain`. На ГОСТ Р 34.11-2012 («Стрибог») стоит другая цепь — открытый пакет [`iss-ledger-117`](https://git.isslab.ru/isslab/iss-ledger-117). Второй дайджест по ГОСТ рядом с SHA-256 для цепей MITR — замысел, не сделан. Заменить хеш в существующей цепи нельзя: это отменило бы проверку всех прошлых записей, поэтому возможна только вторая сумма рядом с первой. ## Что этими данными доказывается, а что нет **Доказывается.** Что на дату каждой метки существовала цепь ровно такой длины и с ровно такой головой. Любое последующее изменение прошлого — подмена, вставка, удаление, усечение — ломает либо пересчёт головы, либо сверку с якорем. **НЕ доказывается по публичным данным.** Содержимое записей. Тела записей хешируются вместе с полями, которые наружу не отдаются (в журнале решений это `model` и `detail`), поэтому пересчитать хеш конкретной записи по опубликованному нельзя. Полная цепь с телами передаётся проверяющему по запросу; тогда тот же проверщик пересчитывает её целиком и называет НОМЕР первой разошедшейся записи. **И не доказывается правдивость.** Цепь доказывает неизменность записанного, а не соответствие записанного реальности. Это предмет отдельной проверки — суточных вердиктов и квитанций. --- Обновляется автоматически вместе с публикацией цепи. Сформировано: 2026-10-15 05:15 UTC. Страница для браузера — https://asi5.ru/console/verify/