美文网首页
Merkle DAG

Merkle DAG

作者: 建怀 | 来源:发表于2018-09-13 10:42 被阅读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    
}

相关文章

网友评论

      本文标题:Merkle DAG

      本文链接:https://www.haomeiwen.com/subject/wtfwgftx.html