Merkle DAG是IPFS核心的数据结构,IPFS整个系统都是围绕Merkle DAG进行的,而Merkle DAG本身则并不复杂。
IPFS is a stack of network protocols that organize agent networks to create, publish, distribute, serve, and download merkledags. [1]
IPFS Merkle DAG的数据结构[2]
type IPFSLink struct {
Name string
// name or alias of this link
Hash Multihash
// cryptographic hash of target
Size int
// total size of target
}
type IPFSObject struct {
links []IPFSLink
// array of links
data []byte
// opaque content data
}
通用性
它比Merkle tree更加通用[3],Merkel Tree将文件数据都存在leaf node,而Merkel DAG每个node都可以存储数据。
对于普通存储文件,Merkel tree是完全没有问题的。
但是除了存储文件之外,IPFS意图用于更多的应用场景,采用Merkle DAG可以兼容更多的数据结构,比如区块链、Git。
区块大小限制
IPFS object包含link 和 data,data的大小限制是 2¹⁸+14 bytes(262158 bytes),
当文件小于262158 bytes,数据使用一个object存储;
但文件大于262158 bytes,则进行切割,parent object保存 child object 的hash。当我们寻找文件时,使用的是root object 的hash。
命令行
查看object的信息的常用命令:
> ipfs block stat QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
Key: QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
Size: 102
> ipfs ls QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
QmcqPiVqTYkMzbUEvJxHtXYoA77ebJhWt47dD9QMqrXsYa 262158
Qmbvzc3p7vnxVr6v8azL917RstXbTbyZRDA9LTBn7mTu1f 5928
> ipfs object stat QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
NumLinks: 2
BlockSize: 102
LinksSize: 89
DataSize: 13
CumulativeSize: 268188
> ipfs object get QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN
{"Links":[{"Name":"","Hash":"QmcqPiVqTYkMzbUEvJxHtXYoA77ebJhWt47dD9QMqrXsYa","Size":262158},{"Name":"","Hash":"Qmbvzc3p7vnxVr6v8azL917RstXbTbyZRDA9LTBn7mTu1f","Size":5928}],"Data":"\u0008\u0002\u0018��\u0010 ��\u0010 �."}
从命令返回结果可以看出来,CID为 QmSu1tBmnvugUw1Mv1ajA6jpgqtTGJnqko9ghypMrjA8jN 的 object 的信息:
- block size 为 102 bytes,其中link占89bytes,data占13bytes,递归获取所有child object,总共大小为 268188bytes。
- 包含2个link,CID分别为
QmcqPiVqTYkMzbUEvJxHtXYoA77ebJhWt47dD9QMqrXsYa
,Qmbvzc3p7vnxVr6v8azL917RstXbTbyZRDA9LTBn7mTu1f
,大小分别为262158,5928 bytes。
参考
-
IPFS whitepaper 3.5节部分 ↩