Все записи

7 мин чтения

Доказать один файл из пакета Merkle: сертификат включения

После того как множество хешей файлов опубликовано под одним корнем Merkle на Cardano, сертификат включения — это небольшой загружаемый файл, который доказывает, что конкретный файл входил в этот пакет: проверяемый в вашем собственном браузере, без доверия к CardanoWall, навсегда.

Когда вы публикуете пакет файлов в Cardano, в блокчейн попадает лишь один небольшой отпечаток: единственный корень Merkle, заменяющий собой весь список. Так публикация остаётся дешёвой. Но это порождает очевидный вопрос — если в блокчейне только корень, как позже доказать, что один конкретный файл действительно входил в пакет?

Ответ — сертификат включения: небольшой файл, который можно скачать и который доказывает, что хеш конкретного файла входил в этот опубликованный пакет. Любой может проверить его в собственном браузере, по любому публичному обозревателю Cardano, без доверия к CardanoWall. А поскольку доказательство встроено в сам файл, оно продолжает работать вечно.

Это повседневный спутник пакетирования Merkle. Пакетирование позволяет зафиксировать сразу тысячи файлов; сертификат включения позволяет извлечь один из них обратно и доказать его позже.

Какую проблему решает сертификат включения?

Представьте, что в прошлом году вы опубликовали тысячу файлов одним пакетом — папку договоров, набор релизных артефактов, логи аудита за один день. Все они были свёрнуты в единственный корень Merkle, и этот корень получил метку времени на Cardano. Дёшево, компактно, готово.

И вот кто-то ставит под сомнение лишь один из этих файлов. Допустим, контрагент спрашивает: «Можете показать, что именно этот договор существовал до дедлайна?» В блокчейне хранится только корень — ни файла, ни списка. Указание на транзакцию доказывает, что какой-то пакет известного размера существовал, — но не то, что в нём был именно этот документ.

Сертификат включения закрывает этот пробел. Это крошечный, самодостаточный файл, который, по сути, говорит: «хеш этого файла был элементом номер 42 пакета, стоящего за этой транзакцией Cardano, и вот точный расчёт, который любой может выполнить, чтобы это подтвердить». Вы передаёте сертификат, и другая сторона проверяет его, не нуждаясь в том, чтобы вы, ваша учётная запись или даже наш сайт всё ещё существовали.

Что на самом деле содержит сертификат?

Считайте его запечатанным пакетом доказательств из трёх частей.

  • Отпечаток вашего файла. Не сам файл — только его хеш. Сертификат никогда не несёт содержимое вашего документа, поэтому им безопасно делиться даже тогда, когда файл приватный.
  • Путь доказательства. Короткий список «соседних» отпечатков, позволяющий любому свернуть хеш вашего файла обратно вверх по дереву Merkle и прийти ровно к опубликованному корню. Именно эта часть делает сертификат самодостаточным: расчёт встроен внутрь, поэтому никому и никогда не придётся просить у вас остальную часть пакета.
  • Привязку к блокчейну. Транзакцию Cardano, в которой был опубликован корень, время, которое блокчейн зафиксировал для неё, и пару ссылок на публичные обозреватели, чтобы любой мог посмотреть всё сам.

Он также включает строку claim на простом языке, где сказано, что именно доказывает сертификат, и короткую заметку о том, как проверить его независимо. Один сертификат может охватывать один файл или сразу несколько — у каждого свой путь доказательства и понятная отметка verified.

CardanoWall может выдать вам этот пакет в нескольких форматах: файлом JSON (машиночитаемый оригинал, который инструменты могут перепроверить) и файлом PDF (читаемая, пригодная для печати версия для людей и юридических дел, с вложенным внутрь JSON в виде приложения, так что документ остаётся машинопроверяемым).

Как его получить?

Вы создаёте его сами, на странице транзакции, в своём браузере.

Откройте публичную страницу транзакции, которая несла пакет. Поскольку запись содержит корень Merkle, страница предлагает проверку включения. Дальше — два небольших шага:

  1. Укажите, какой файл. Либо вставьте хеш файла, либо просто перетащите файл на страницу — ваш браузер вычислит его хеш локально и никогда не загрузит его наружу.
  2. Прочитайте результат. Страница получает список листьев пакета, заново вычисляет доказательство и показывает вам понятный зелёный (ваш файл в пакете) или красный (его нет) результат.

Если результат зелёный, вы скачиваете сертификат — JSON, PDF или оба. Эта загрузка и есть переносимое доказательство. Отправьте его по почте, подшейте в дело, приложите к договору, положите в дата-рум. Теперь он полностью независим от CardanoWall.

Всё это происходит на стороне клиента. Мы не создаём сертификат на сервере, прося вам ему верить; работу выполняет ваш собственный браузер — именно поэтому результату можно доверять.

Почему никому не нужно доверять CardanoWall?

Потому что ничто в сертификате не зависит от того, честны мы, в сети ли мы и существуем ли вообще.

Внутри сертификата включения — два утверждения, и оба из тех, что любой может проверить сам:

  • Ваш файл был в пакете. Верификатор сворачивает хеш вашего файла вверх по пути доказательства и убеждается, что тот воспроизводит опубликованный корень. Это чистая арифметика — ей нужен только файл сертификата, и больше ничего. Изменись хоть один бит вашего файла, свёртка пришла бы к другому корню, и проверка не прошла бы.
  • Корень действительно на Cardano. Верификатор находит транзакцию в любом публичном обозревателе Cardano — Cardanoscan, AdaStat, любом по своему выбору — и убеждается, что тот же корень находится в записи в блокчейне. В этом поиске сервер CardanoWall вообще не участвует.

Вместе эти две проверки доказывают, что файл существовал к тому моменту, который блокчейн проставил на этой транзакции, или раньше. И это время приходит от Cardano, а не от нас. Мы не можем ни промотать блок вперёд, ни задним числом датировать транзакцию, ни тихо переписать историю; когда что-то произошло, решает блокчейн. В этом и весь смысл привязки к публичной цепочке вместо того, чтобы просить вас доверять часам какой-то компании.

Исчезни CardanoWall завтра — каждый выданный нами сертификат продолжал бы проходить проверку. Открытый инструмент командной строки cardanowall и любой независимый инструмент, понимающий формат, могут заново выполнить те же проверки.

flowchart LR
  A["Ваш файл"] -->|"хешируется локально"| B["Хеш файла"]
  B --> C["Свернуть вверх по пути доказательства"]
  C --> D["Пересчитанный корень"]
  E["Транзакция Cardano<br/>(публичный обозреватель)"] --> F["Опубликованный корень + время блока"]
  D -->|"должны совпасть"| F
  F --> G["Существовал к времени<br/>блока или раньше"]

Чего сертификат не доказывает?

Сертификат точен в одном и молчит обо всём остальном — и честность в этом как раз и делает его достойным доверия.

Он доказывает, что хеш конкретного файла существовал к времени блока блокчейна или раньше и что файл входил в зафиксированный пакет. Вот и всё. В частности:

  • Он не доказывает, кто создал файл. Сертификат ничего не говорит об авторстве. Опубликовать пакет мог кто угодно. (В Label 309 авторство — это отдельная, необязательная подпись, которая никогда не предполагается по умолчанию, — см. что подтверждение не доказывает.)
  • Он не доказывает, что файл истинен, точен или законен. Он доказывает, что байты существовали к определённому моменту, а не то, что написанное в них верно.
  • Он не доказывает, что файл — единственная или исходная версия. Он доказывает, что именно этот файл был в пакете, а не то, что других версий не существует.
  • Это не «квалифицированная» метка времени. Это метка времени, привязанная к блокчейну, из того же семейства, что и другие блокчейн-метки времени. Она служит весомым подтверждающим свидетельством момента, но это не квалифицированная электронная метка времени по eIDAS от регулируемого органа. Если процесс прямо требует квалифицированной метки времени, сама по себе она этой планке не отвечает (см. Proof of Existence и удостоверяющий центр времени).

Ценность сертификата именно в том, что он ничего не заявляет сверх меры. Он жёстко фиксирует момент и целостность и оставляет смысл документам и людям вокруг.

Как это связано с OpenTimestamps?

Если вы уже знакомы с OpenTimestamps, идея покажется знакомой.

OpenTimestamps выдаёт вам небольшой файл доказательства .ots: переносимую, самодостаточную метку времени, которую любой может проверить позже, не доверяя сервису, её создавшему. Сертификат включения — вещь той же природы — переносимый файл доказательства, который можно передать кому угодно, — с двумя отличиями, о которых стоит знать.

Удостоверяющим центром времени выступает блокчейн Cardano, причём время берётся из блока, который нёс ваш корень, а не из календарного сервера. А расчёт доказательства опирается на ту же конструкцию дерева Merkle, что используется в стандарте повсюду, поэтому один сертификат способен извлечь один файл из большого зафиксированного пакета. Дух тот же, точка привязки иная.

Более подробное сравнение бок о бок см. в чем Proof of Existence отличается от OpenTimestamps.

Коротко

Опубликуйте множество файлов под одним корнем Merkle — и затраты на блокчейн останутся минимальными. Сертификат включения — это то, чем вы позже докажете, что любой из этих файлов действительно входил в пакет: небольшая загрузка, проверяемая в вашем собственном браузере, по любому публичному обозревателю Cardano, со временем от самой цепочки и без доверия к CardanoWall. Путь доказательства встроен в файл, поэтому сертификат продолжает работать ещё долго после того, как исчезнет конкретный инструмент, учётная запись или компания.

Что почитать дальше

merkleproof-of-existencelabel-309