CID的产生
Multihash的格式其实就是一个字符串,由三部分组成:Hash算法编码、HasH值的长度(字节数)、Hash值。
Multihash以字节(0x12)开头,这个开头将指示出是哪一个哈希算法。接着是长度为(0x20)的另一个字节。目前IPFS默认采用sha2-256哈希函数算法,哈希摘要的二进制长度为32个字节。再加上哈希值后,字符串的长度就很长很长。
这时候用到了Base58编码技术,使得字符串长度可以压缩,方便存储和传播。因为IPFS现在的Multihash值,都是以1220开头,按照Base58编码运算,算出的结果都是以“Qm”开头。
总结起来正是:原始数据封装 -> sha2-256函数计算 -> 封装成Multihash -> Base58编码转换 ->最终的哈希地址(即CID)。
上文为二进制,下文为字符串
上文以Qm开头的为base58btc编码的CIDv0,下文以b开头的则为使用base32编码,是大部分IPFS默认使用的标识符
ipfs add指定块大小(-s --chunker)
# ipfs add -s=size-1
12
ipfs: Reading from /dev/stdin; send Ctrl-d to stop.
added QmTUK826T8DBSoWU2pgvyBEum4cbvD3Qf6Fvj8td4UAtPg QmTUK826T8DBSoWU2pgvyBEum4cbvD3Qf6Fvj8td4UAtPg
2 B / 2 B [===================================================================================================================] 100.00%/
# ipfs ls QmTUK826T8DBSoWU2pgvyBEum4cbvD3Qf6Fvj8td4UAtPg
QmWYddCPs7uR9EvHNCZzpguVFVNfHc6aM3hPVzPdAEESMc 1 《------字符1
QmT9SanPHnSH5AsBqy2xZbstw4rAw5znFPkmjkvDCMdVuF 1 《------字符2
# ipfs add -s=size-1
123
ipfs: Reading from /dev/stdin; send Ctrl-d to stop.
added QmfEhKEffgDqNAL2XvaiVnL52iHD3shQiJEKETJbHBBYmM QmfEhKEffgDqNAL2XvaiVnL52iHD3shQiJEKETJbHBBYmM
3 B / 3 B [===================================================================================================================] 100.00%/ # ipfs ls QmfEhKEffgDqNAL2XvaiVnL52iHD3shQiJEKETJbHBBYmM
QmWYddCPs7uR9EvHNCZzpguVFVNfHc6aM3hPVzPdAEESMc 1 《----字符1 cid与前面的相同
QmT9SanPHnSH5AsBqy2xZbstw4rAw5znFPkmjkvDCMdVuF 1 《----字符2 cid与前面的相同
QmY4ZaCGXPTqRmTVEGSC6PPMgniAhMD1wPBTH7PeU3qtAf 1 《----字符3
块的分级结构
$date; icc add press/2G/1.json --replication-max 1 --replication-min 1 --local ; date
4G文件耗时3分钟
-------------------------------------
顶层
QmWNk2RP4JwrXw1u1yuACEmr67XWvHGsrzRGbS9nmwonVd
------------------------------------
第二层
$ipfs0 ls QmWNk2RP4JwrXw1u1yuACEmr67XWvHGsrzRGbS9nmwonVd
QmP7yQ6M27n1a3Gn4M8dum2VGBd4NAt7QvLSLz8e26cHth 45613056 <<<<<
QmVx4jSAuApvnHSvqv23ueVwSntyw1d2FJ9kB4tHordkjx 45613056
QmUtoRaCBL7sknV7RJYPiKBapRs4trT2qpmKihraKJb8FC 45613056
QmRLVkoTZUFCgmCbQ8PdRtsfc83x1uJw4i3Ejbg8Mae4MQ 45613056
...
Qmb7nuHAzHSsziMjbSwVAedrBSXQHcPa39QzQJTmat4eDP 31664128
$ipfs0 ls QmWNk2RP4JwrXw1u1yuACEmr67XWvHGsrzRGbS9nmwonVd | wc -l
88
------------------------------------
第三层
$ipfs0 ls QmP7yQ6M27n1a3Gn4M8dum2VGBd4NAt7QvLSLz8e26cHth
QmRCZsYGha8a3edbgCmkecGaTs38jqTeqif4YGbVe1YFsb 262144
QmZBXn5o72Paa3HGDM84u9wRZrrkBUkGrqtgWVinBVsbJ8 262144
QmV78sg6VwbYfxyWFhYcbu9jsEowAMqPUWDMumsSShwqzn 262144
...
QmdRFddS857VaEFzvwyzLaJirSUHMu8eVT41hPPJGRQ5Eo 262144
$ipfs0 ls QmP7yQ6M27n1a3Gn4M8dum2VGBd4NAt7QvLSLz8e26cHth | wc -l
174
1个顶层块,88个二层块,262144个三层快
块数:88 * 174 = 15312
每个二层块收纳的自己数: 172 * 262144 = 45613056
总字节数:88 * 174 * 262144 = 4,013,948,928 bytes