IPFS━━CID
为什么需要CID:https://github.com/ipfs/specs/issues/130
CID格式
CID即内容标识符,通过构建Merkel DAG
得到根哈希生成CID。
CIDv0
CIDv0:默认使用dag-pb
编解码底层的数据,默认使用base58btc
来将二进制的CID转换为字符串格式,这两个信息不显示表达在CIDv0中。
CIDv1
CIDv1:二进制表示中提供了<cid-version><multicodec><multihash>
信息;并且字符表示中添加了字符编码信息<multibase>
,multibase前缀表示在字符串和二进制格式之间转换 CID 时使用的基本编码(编码后加的字符前缀),仅用于 CID 的字符串形式。
具体格式:
<cidv1> ::= <multibase-prefix><multicodec-cidv1><multicodec-content-type><multihash-content-address>
两种典型的CID
Qm
开头的CID可以安全的解释为以base58btc
编码的CIDv0,解码为二进制后直接得到multihash
b
开头的CID是base编码base32
前缀标识符(直接使用字符作为前缀标识),将后面字符解码得到CID的二进制表示<cid-version><multicodec><multihash>
CID解码
分析
CID Inspector: http://cid.ipfs.io/
CIDv0可以很容易的转换为CIDv1格式,添加默认的属性即可。但是只有符合CIDv0默认的属性的CIDv1才能转换为CIDv0,即需要:
- multibase = base58btc(可以直接编码为base58btc)
- multicodec = dag-pb
- multihash-algorithm = sha2-256
- multihash-length = 32(字节)
两个指向同一个文件/对象的CIDv0和CIDv1,实际是等效的,不违反唯一性原则。
ipfs@v0.10.0
- 使用
ipfs id
查看显示的ID
是self密钥对公钥(哈希)的base58btc
编码,注意没有加base前缀,字符串是编码后字符串形式base58btc(multihash)
- 测试CID Inspector:
base58btc - cidv0 - dag-pb - (identity : 288 : 08011220B86AF8355C284AC9E2D224E7519F971C903A8726293E31EE760F450F996AE8A4)
一般没有显示加base前缀的字符串编码是base58btc
(CIDv0)