Автор данной статьи: оригинальная работа 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 имеет реализации на следующих разных языках.