Merkle DAG
Merkle DAG跟Merkle Tree很相似,但不完全一样,Merkle DAG不需要进行树的平衡操作,非叶子节点允许包含数据等。ipfs add命令将从指定的文件中的数据中创建Merkle DAG。遵循unixfs数据格式(protobuf),意味着文件被分解成块,然后使用“连接节点”以树状结构排列,连接在一起,给定文件的“散列”实际上是DAG中根节点的散列。
当文件的内容超过256k或者add的是一个目录时,文件将会被拆分成block存储,并使用link nodes重排列成类似tree的一种结构。如何去理解unixfs数据格式呢,比如自己创建一个block,使用如下命令:
echo "block test" | ipfs block put
自己创建block不能用ipfs cat命令查看,因为ipfs cat查看的基于unixfs data格式的数据。
Merkle DAG的功能
Merkle DAG在功能上与Merkle Tree很大不同,Merkle Tree主要为了验证,例如验证数字签名,以及比特币Merkle Proof;对Merkle DAG而言,主要目的有如下三个:
- 内容寻址:使用多种哈希来唯一识别一个数据块的内容。
- 防篡改:方便的检查哈希值来确认数据是否被篡改。
- 去重:相同内容的数据块有相同哈希值,可去掉重复的数据,节省存储空间。
数据对象格式
定义Merkle DAG的对象格式,IPFSObject是IPFSde存储结构,限制每个数据大小在256K以内,在IPFSObject对象里,保存两部分,一个是Link,用于保存其他的分块数据的引用,另一个是data为本对象内容。Link主要包含三部分,Link的名字,Hash和Size。Link只是对一个IPFSObject的引用。这样设计的好处是结合Git,Merkle DAG会极大减少存储空间消耗。如果对源文件进行部分修改,那么可能只是对很少的IPFSObject进行了修改,就没必要对全部内容进行读写修改。如下是IPFSObject和Link的数据结构:
type IPFSObject struct{
links []IPFSLink
data []byte
}
type IPFSLink struct{
Name string
Hash Multihash
Size int
}
网友评论