Открыть сервис

Multihash

Multihash — это спецификация и стандарт кодирования криптографических хэш-значений, предназначенный для самодокументирования: он объединяет в одной строке идентификатор алгоритма хэширования, длину дайджеста и само хэш-значение. Разработанный в рамках экосистемы IPFS (InterPlanetary File System), Multihash решает проблему несовместимости хэшей, созданных разными алгоритмами, позволяя программам однозначно определять способ проверки целостности данных без внешних подсказок.

История и контекст создания

Спецификация Multihash была предложена Хуаном Бенетом, основателем Protocol Labs, в 2014 году в ходе работы над протоколом IPFS. Основной стимул — необходимость создания устойчивой к будущим изменениям системы адресации контента. Ранние версии IPFS использовали только SHA-256, однако команда осознала, что с развитием вычислительных мощностей и появлением квантовых угроз потребуется миграция на более стойкие алгоритмы. Введение самодокументируемых хэшей позволило менять алгоритмы без изменения формата адресов и без потери обратной совместимости. В 2015 году спецификация была оформлена в виде отдельного стандарта в репозитории multiformats, объединяющем семейство взаимосвязанных форматов (multiaddr, multicodec, multibase).

Структура и принцип кодирования

Multihash представляет собой конкатенацию трёх полей, закодированных в бинарном виде:

  1. Код функции (varint) — числовой идентификатор алгоритма хэширования (например, 0x12 для SHA-256, 0x13 для SHA-1, 0x1b для Keccak-256).
  2. Длина дайджеста (varint) — размер хэш-значения в байтах.
  3. Собственно дайджест — бинарное хэш-значение фиксированной длины.

Переменная длина (varint) используется для компактного представления чисел: меньшие значения занимают один байт, большие — несколько. Это позволяет минимизировать накладные расходы: для SHA-256 префикс занимает всего 2 байта (код + длина), тогда как полезная нагрузка составляет 32 байта.

Пример кодирования для SHA-256 от строки «hello world»:

  • Дайджест: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
  • Multihash (hex): 1220b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
  • Расшифровка: 0x12 (SHA-256), 0x20 (32 байта), далее 32 байта дайджеста.

Таблица распространённых кодов

АлгоритмКод (hex)Длина дайджеста (байт)
SHA-10x1120
SHA-2560x1232
SHA-5120x1364
Keccak-2560x1b32
Blake2b-2560xa032
Blake30x1e32
Identity (сырые данные)0x00переменная

Полный реестр кодов поддерживается в спецификации multicodec и насчитывает более 100 зарегистрированных алгоритмов, включая экспериментальные и постквантовые (например, на основе решёток).

Применение в экосистеме IPFS и за её пределами

Основная область применения Multihash — система адресации контента в IPFS. Каждый объект (файл, директория, коммит) идентифицируется через CID (Content Identifier), который внутри содержит Multihash. Благодаря этому узлы сети могут проверять целостность полученных блоков данных, не зная заранее, каким алгоритмом они были хэшированы.

Помимо IPFS, Multihash используется в:

  • Filecoin — децентрализованная сеть хранения данных, где каждый сектор и доказательство хранения включают Multihash.
  • Git через расширения (например, git-remote-ipfs) для адресации объектов репозитория.
  • Блокчейн-проектах (Ethereum, Polkadot) для совместимости с мультиформатными адресами.
  • Базах данных и системах резервного копирования, где требуется миграция между хэш-функциями без пересчёта всех ссылок.

Преимущества и ограничения

Ключевые достоинства формата:

  • Самодокументируемость — для валидации не требуется внешняя информация об алгоритме.
  • Устойчивость к миграциям — возможность постепенного перехода на новые алгоритмы.
  • Компактность — накладные расходы составляют 2–3 байта на хэш.
  • Интероперабельностьединый стандарт для множества проектов.

Ограничения включают:

  • Отсутствие встроенной канонизации — один и тот же дайджест может быть представлен с разными префиксами (например, для SHA-256 и SHA-512), что требует осторожности при сравнении.
  • Зависимость от реестра кодов — для корректной интерпретации необходима актуальная таблица multicodec, что создаёт риск рассинхронизации устаревших реализаций.
  • Не является хэш-функцией — Multihash лишь обёртка, не обеспечивающая криптографическую стойкость сама по себе.

Реализации и инструменты

Официальные библиотеки доступны для большинства языков программирования: Go (go-multihash), JavaScript (js-multihash), Rust (rust-multihash), Python (py-multihash), Java и C++. Библиотеки предоставляют функции кодирования, декодирования и валидации, а также интеграцию с CID. Инструменты командной строки, такие как ipfs и multihash-cli, позволяют вычислять Multihash из файлов и строк.

Критика и альтернативы

Основная критика связана с избыточностью: для большинства приложений достаточно фиксированного алгоритма, и самодокументирование добавляет сложность без видимой пользы. Альтернативой выступает формат multibase (кодирование префикса в строку) в сочетании с обычными хэшами, а также стандарт Hash из ISO/IEC 10118, который использует отдельные поля идентификации. Тем не менее, в децентрализованных системах, где компоненты развиваются независимо, Multihash остаётся де-факто стандартом благодаря простоте и гибкости.

Источники

  • Спецификация Multihash, репозиторий multiformats (GitHub).
  • Бенет Х. «IPFS — Content Addressed, Versioned, P2P File System», технический отчёт Protocol Labs, 2014.
  • Документация Protocol Labs по CID и multiformats.
  • Реестр multicodec (GitHub, Protocol Labs).
Загружаем BFOmetr…