Merkle DAG

2018-09-13  本文已影响0人  建怀

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    
}
上一篇 下一篇

猜你喜欢

热点阅读