A content identifier, or CID, is a label used to point to material in IPFS. It doesn’t indicate where the content is stored, but it forms a kind of address based on the content itself.
IPFS協(xié)議使用CID作為文件的唯一標(biāo)志章钾,它根據(jù)內(nèi)容進(jìn)行hash計(jì)算得到翎蹈,標(biāo)志的是文件內(nèi)容存筏;而HTTP標(biāo)志的則是文件存儲的位置。
一個IPFS節(jié)點(diǎn)可以向它的peer詢問是否存有某特定hash值的文件幔摸,如果某個peer有這個文件,就返回文件。
由4個部分組成
CID當(dāng)前最新的版本是v1秀姐,結(jié)構(gòu)是:
<multibase-prefix><cid-version><multicodec-content-type><multihash-content-address>
- multi-base:編碼格式
- CID version
- multi-codec:文件類型
- multi-hash:hash值
舉個例子,將下面的CID轉(zhuǎn)換成可讀形式若贮,它表示使用base58btc編碼省有,cidv1版本的CID,文件類型raw谴麦,hash算法sha2-256蠢沿,hash值長度256 bits, hash值6e6ff7950a36187a801613426e858dce686cd7d7e3c0fc42ee0330072d245c95
# example CID
zb2rhe5P4gXftAwvA4eXQ5HJwsER2owDyS9sKaQRRVQPn93bA
# corresponding human readable CID
base58btc - cidv1 - raw - sha2-256-256-6e6ff7950a36187a801613426e858dce686cd7d7e3c0fc42ee0330072d245c95
支持多版本
這里的multi指的是它支持多個版本
- multi-base的作用是縮小hash的長度,支持base64, base32, base58btc等等匾效。完整的支持列表
- multi-codec標(biāo)志數(shù)據(jù)的類型舷蟀,支持raw, png, mp4, zip, eth-tx, bitcoin-tx, git-raw, md5, sha2-512等等∶婧撸可以看到它不僅支持圖片雪侥、視頻,還支持以太坊精绎、比特幣的交易和區(qū)塊速缨。完整的支持列表
- multi-hash支持多種hash方法,md5, sha2-512, sha3-512等等
multi-hash
multi-hash又分成3部分:hash算法代乃、hash值bytes長度旬牲、hash值仿粹。不僅包含了hash值,還包含了所使用的hash算法原茅,實(shí)現(xiàn)self describing吭历,并兼容多種hash算法。
<varint hash function code><varint digest size in bytes><hash function output>
下面是使用4種不同hash算法對同一個文件獲得multi-hash擂橘,使用的是16進(jìn)制晌区。
- 紫色的部分表示hash算法,不同算法有對應(yīng)的標(biāo)志通贞。
- 綠色部分表示hash值長度朗若,這里都是256位,也就是32 bytes昌罩,使用16進(jìn)制表示為
20
哭懈。 - 白色部分表示使用對應(yīng)的hash算法求得的hash值。
參考
https://docs.ipfs.io/guides/concepts/cid/
https://github.com/multiformats/multihash