Набор для проверки журналов MITR

Здесь лежит то, чем МОЖНО проверить наши журналы, не доверяя нам на слово, и честно сказано, чего этими данными проверить НЕЛЬЗЯ.

Коротко. Скачайте проверщик и файл якорей и запустите python3 verify_chain_standalone.py honesty_anchors-public.jsonl. Код возврата 0 — якоря сошлись; 1 — не сошлись, и названа эпоха; 2 — проверить не удалось (нет файла, битая строка).

Файлы

файлчто это
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.

эпохавремя якоря, UTCдлина цепитело якоряметкаBitcoin
872026-09-25 04:5598anchor-epoch-87.json.otsблок 968505
862026-09-24 04:5797anchor-epoch-86.json.otsблок 968359
852026-09-23 04:5696anchor-epoch-85.json.otsблок 968232
842026-09-22 04:5595anchor-epoch-84.json.otsблок 968102
832026-09-21 04:5494anchor-epoch-83.json.otsблок 967945
822026-09-20 04:5093anchor-epoch-82.json.otsблок 967797
812026-09-19 04:5092anchor-epoch-81.json.otsблок 967667
802026-09-18 16:2091anchor-epoch-80.json.otsблок 967579
792026-09-18 04:5191———
782026-09-17 04:5090———

Время последней эпохи — чужим клиентом: 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.

эпохавремя якоря, UTCдлина цепитело якоряметкаBitcoin
422026-10-15 05:1556anchor-epoch-42.json.otsожидает блока
412026-10-14 05:1556anchor-epoch-41.json.otsблок 971356
402026-10-13 05:1556anchor-epoch-40.json.otsблок 971197
392026-10-12 05:1656anchor-epoch-39.json.otsблок 971049
382026-10-11 05:1656anchor-epoch-38.json.otsблок 970875
372026-10-10 05:1556anchor-epoch-37.json.otsблок 970729
362026-10-09 05:1656anchor-epoch-36.json.otsблок 970591
352026-10-08 05:1756anchor-epoch-35.json.otsблок 970446
342026-10-07 05:1556anchor-epoch-34.json.otsблок 970296
332026-10-06 05:1556anchor-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.

эпохавремя якоря, UTCдлина цепитело якоряметкаBitcoin
232026-10-15 05:154960gate-anchor-epoch-23.json.otsожидает блока
222026-10-14 05:154950gate-anchor-epoch-22.json.otsблок 971356
212026-10-13 05:154937gate-anchor-epoch-21.json.otsблок 971197
202026-10-12 05:164911gate-anchor-epoch-20.json.otsблок 971049
192026-10-11 05:164883gate-anchor-epoch-19.json.otsблок 970875
182026-10-10 05:154825gate-anchor-epoch-18.json.otsблок 970729
172026-10-09 05:164551gate-anchor-epoch-17.json.otsблок 970591
162026-10-08 05:174084gate-anchor-epoch-16.json.otsблок 970446
152026-10-07 05:153713gate-anchor-epoch-15.json.otsблок 970296
142026-10-06 05:153288gate-anchor-epoch-14.json.otsблок 970135

Время последней эпохи — чужим клиентом: ots verify gate-anchor-epoch-23.json.ots. Метка датирует файл gate-anchor-epoch-23.json; сверьте его с последней строкой gate_anchors-public.jsonl.

Как проверить

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. Второй дайджест по ГОСТ рядом с SHA-256 для цепей MITR — замысел, не сделан. Заменить хеш в существующей цепи нельзя: это отменило бы проверку всех прошлых записей, поэтому возможна только вторая сумма рядом с первой.

Что этими данными доказывается, а что нет

Доказывается. Что на дату каждой метки существовала цепь ровно такой длины и с ровно такой головой. Любое последующее изменение прошлого — подмена, вставка, удаление, усечение — ломает либо пересчёт головы, либо сверку с якорем.

НЕ доказывается по публичным данным. Содержимое записей. Тела записей хешируются вместе с полями, которые наружу не отдаются (в журнале решений это model и detail), поэтому пересчитать хеш конкретной записи по опубликованному нельзя. Полная цепь с телами передаётся проверяющему по запросу; тогда тот же проверщик пересчитывает её целиком и называет НОМЕР первой разошедшейся записи.

И не доказывается правдивость. Цепь доказывает неизменность записанного, а не соответствие записанного реальности. Это предмет отдельной проверки — суточных вердиктов и квитанций.