Спецификация CID

блокчейн

Автор данной статьи: оригинальная работа Star Alliance, просьба указывать источник для перепечатки

CID широко используется в проектах IPFS, а Filecoin — это проект, построенный на основе IPFS.Естественно, CID используется во многих местах.CID сам по себе представляет собой строку закодированных строк, что вносит трудности в наше понимание. Эта статья введет CID из следующих моментов, с надеждой, что читатели могут иметь более полное понимание CID.

что такое CID


CID — это «самоописываемый идентификатор с адресацией по содержимому», который использует криптографические хэши для достижения целей адресации по содержимому и использует несколько мультиформатов для достижения гибкого «самоописания», то есть использует мультихэш для представления хэша, использует мультикодек для Представление формата содержимого данных и используйте MultiBase для кодирования CID в строку. В частности, это «адрес напечатанного контента», который основан на основании (тип контента, контента).

Мотивация дизайна для CID


CID — это формат ссылки на контент в распределенных системах, таких как IPFS, который использует «адресацию контента», «криптографическое хеширование» и«Самоописывающий формат», используемый в качестве основного идентификатора проектами IPFS и IPLD.

Как работают CID


Текущая версия CID — CIDv1. Версия v1 CID состоит из четырех частей:

<cidv1> ::= <mb><version><mc><mh>

Расширенная форма выглядит следующим образом:

<cidv1> ::= <multibase-prefix><cid-version><multicodec-content-type><multihash-content-address>

в

  • это многобазовый код (занимает 1 или 2 байта), чтобы упростить кодирование CID в разные базы. Примечание. Двоичные (не текстовые) протоколы и форматы могут игнорировать этот префикс, если кодировка четкая и недвусмысленная.
  • используется для указания версии CIDvarintЗакодировано с целью сохранения возможности обновления версии.
  • ОдинmulticodecКодировка, используемая для представления типа контента или формата данных, к которым нужно обращаться.
  • ОдинmultihashЗначение, представляющее криптографический хэш содержимого, к которому необходимо обратиться. В целях обеспечения масштабируемости и гибкости протокола мультихэш позволяет CID использовать различные криптографические хэш-функции.

Рекомендации по дизайну


При разработке CID тщательно учитывались различные компромиссные факторы, возникающие при построении процедур IPFS. Эти компромиссы в основном связаны с проектом MultiFormats:

  • Краткость: идентификаторы CID являются бинарными по своей природе, и цель состоит в том, чтобы сделать их как можно более компактными и лаконичными, поскольку они предназначены для того, чтобы быть частью более длинного идентификатора пути или URL-адреса.
  • Удобство транспортировки: CID, также известный как «реплицируемость», использует многобазовое кодирование, что позволяет выбрать наилучшую основу для переносимости. Например, CID можно закодировать в base58btc, чтобы получить более короткие хэши, которые легко скопировать и вставить.
  • Универсальность: CID предназначены для представления значений в произвольных форматах, возможно, закодированных с использованием произвольных криптографических хэшей.
  • Избегайте блокировки: CID предотвращают блокировку старых, потенциально устаревших решений.
  • Возможность обновления: CID кодирует номер версии, чтобы обеспечить эволюцию самого формата CID.

Удобочитаемый CID


Даже просто для отладки и уточнения наличие удобочитаемого описания CID чрезвычайно полезно. Мы можем просто преобразовать CID в «удобочитаемый CID» следующим образом:

<hr-cid> ::= <hr-mbc> "-" <hr-cid-version> "-" <hr-mc> "-" <hr-mh>

Каждый из этих подразделов представлен в собственной удобочитаемой форме:

  • Удобочитаемый мультибазовый код, такой как base58btc
  • это строка вида "cidv#", например cidv1 или cidv2
  • Удобочитаемый код мультикодека, такой как cbor
  • Удобочитаемый мультихэш, такой как sha2-256-256-abcdef0123456789...

См. пример ниже:

# 示例 CID
zb2rhe5P4gXftAwvA4eXQ5HJwsER2owDyS9sKaQRRVQPn93bA
# 对应的人类可读CID
base58btc - cidv1 - raw - sha2-256-256-6e6ff7950a36187a801613426e858dce686cd7d7e3c0fc42ee0330072d245c95

Версия


CIDv0

CIDV0 обратная совместимая версия, в которой:

  • Представление мультибазовой части строки всегда base58btc или неявное (незаписанное)
  • Часть мультикодека всегда dag-pb или неявная
  • Часть cid-версии всегда cidv0 или неявная.
  • Часть multihash записывает и всегда представляет собой полный (32-битный) хэш sha256.
cidv0 ::= <multihash-content-address>
CIDv1

Подробнее см. в разделе «Как работает CID».

<cidv1> ::= <multibase-prefix><cid-version><multicodec-content-type><multihash-content-address>

Алгоритм декодирования


Чтобы декодировать CID, вам необходимо обратиться к следующему алгоритму: 1. Если CID представляет собой строку в кодировке ASCII или UTF-8:

  • Если длина составляет 46 символов и начинается с "Qm...", это версия CID v0, декодируйте ее в соответствии с base58btc и перейдите к шагу 2.
  • Если нет, декодируйте в соответствии со спецификацией мультибазы и:
    • Если первый декодированный байт равен 0x12, сразу возвращается ошибка.
    • В противном случае все, что у вас есть, это двоичный CID, перейдите к шагу 2, чтобы продолжить.

2. Учитывая двоичный CID:

  • Если длина составляет 34 байта, а первый байт — [0x12, 0x20, ...], это CID версии v0.
    • Мультихэш этого CID равен cid
    • Мультикодек для этого CID — DagProtobuf.
    • Версия этого CID 0
  • В противном случае, используя N в качестве первого варианта в CID, номер версии можно рассчитать следующим образом.
    • Если N равно 1, версия CIDv1: ♦ Мультикодек этого CID является вторым вариантом в CID. ♦ чей мультихэш является остатком CID (после второго варианта) ♦ Номер версии — 1.
  • Если N меньше или равно 0, CID имеет неверный формат.
  • Номера версий с N больше 1 зарезервированы и еще не использовались.

Список реализации


В настоящее время спецификация CID имеет реализации на следующих разных языках.