Набор для проверки журналов 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 |
|---|---|---|---|---|---|
| 87 | 2026-09-25 04:55 | 98 | anchor-epoch-87.json | .ots | блок 968505 |
| 86 | 2026-09-24 04:57 | 97 | anchor-epoch-86.json | .ots | блок 968359 |
| 85 | 2026-09-23 04:56 | 96 | anchor-epoch-85.json | .ots | блок 968232 |
| 84 | 2026-09-22 04:55 | 95 | anchor-epoch-84.json | .ots | блок 968102 |
| 83 | 2026-09-21 04:54 | 94 | anchor-epoch-83.json | .ots | блок 967945 |
| 82 | 2026-09-20 04:50 | 93 | anchor-epoch-82.json | .ots | блок 967797 |
| 81 | 2026-09-19 04:50 | 92 | anchor-epoch-81.json | .ots | блок 967667 |
| 80 | 2026-09-18 16:20 | 91 | 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.
| эпоха | время якоря, UTC | длина цепи | тело якоря | метка | Bitcoin |
|---|---|---|---|---|---|
| 42 | 2026-10-15 05:15 | 56 | anchor-epoch-42.json | .ots | ожидает блока |
| 41 | 2026-10-14 05:15 | 56 | anchor-epoch-41.json | .ots | блок 971356 |
| 40 | 2026-10-13 05:15 | 56 | anchor-epoch-40.json | .ots | блок 971197 |
| 39 | 2026-10-12 05:16 | 56 | anchor-epoch-39.json | .ots | блок 971049 |
| 38 | 2026-10-11 05:16 | 56 | anchor-epoch-38.json | .ots | блок 970875 |
| 37 | 2026-10-10 05:15 | 56 | anchor-epoch-37.json | .ots | блок 970729 |
| 36 | 2026-10-09 05:16 | 56 | anchor-epoch-36.json | .ots | блок 970591 |
| 35 | 2026-10-08 05:17 | 56 | anchor-epoch-35.json | .ots | блок 970446 |
| 34 | 2026-10-07 05:15 | 56 | anchor-epoch-34.json | .ots | блок 970296 |
| 33 | 2026-10-06 05:15 | 56 | 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.
| эпоха | время якоря, UTC | длина цепи | тело якоря | метка | Bitcoin |
|---|---|---|---|---|---|
| 23 | 2026-10-15 05:15 | 4960 | gate-anchor-epoch-23.json | .ots | ожидает блока |
| 22 | 2026-10-14 05:15 | 4950 | gate-anchor-epoch-22.json | .ots | блок 971356 |
| 21 | 2026-10-13 05:15 | 4937 | gate-anchor-epoch-21.json | .ots | блок 971197 |
| 20 | 2026-10-12 05:16 | 4911 | gate-anchor-epoch-20.json | .ots | блок 971049 |
| 19 | 2026-10-11 05:16 | 4883 | gate-anchor-epoch-19.json | .ots | блок 970875 |
| 18 | 2026-10-10 05:15 | 4825 | gate-anchor-epoch-18.json | .ots | блок 970729 |
| 17 | 2026-10-09 05:16 | 4551 | gate-anchor-epoch-17.json | .ots | блок 970591 |
| 16 | 2026-10-08 05:17 | 4084 | gate-anchor-epoch-16.json | .ots | блок 970446 |
| 15 | 2026-10-07 05:15 | 3713 | gate-anchor-epoch-15.json | .ots | блок 970296 |
| 14 | 2026-10-06 05:15 | 3288 | gate-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), поэтому пересчитать хеш конкретной записи по опубликованному нельзя. Полная цепь с телами передаётся проверяющему по запросу; тогда тот же проверщик пересчитывает её целиком и называет НОМЕР первой разошедшейся записи.
И не доказывается правдивость. Цепь доказывает неизменность записанного, а не соответствие записанного реальности. Это предмет отдельной проверки — суточных вердиктов и квитанций.