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>
format

两种典型的CID

cid-examples
  • 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)

链接

  1. CID Specification
  2. Anatomy of a Cid
posted @ 2021-10-14 16:10  qxxiao  阅读(601)  评论(0编辑  收藏  举报