IPFS系列 - 默克有向无环图(Merkle DAG)

Merkle DAG的全称是Merkle Directed Acyclic Graph(默克有向无环图)。它是在Merkle Tree的基础上构建的,Merkle Tree由美国计算机学家Merkle于1979年申请了专利。

Merkle DAG跟 Merkle Tree

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而言,主要目的有如下三个:

  • 内容寻址:使用多种哈希来唯一识别一个数据块的内容。
  • 防篡改:方便的检查哈希值来确认数据是否被篡改。
  • 去重:相同内容的数据块有相同哈希值,可去掉重复的数据,节省存储空间。

其中第3条是IPFS系统最为重要的一个特性,在IPFS系统中,每个Blob的大小限制在256KB(暂定为256KB,这个值可以根据实际的性能需求进行修改)以内,那些相同的数据就能通过Merkle DAG过滤掉,只需增加一个文件引用,而不需要占据存储空间。

同时每个节点可以 ipfs pin 某个资源, 将其永久保存在本地, 提高全网的冗余度

默认情况下, 通过 ipfs add 添加的资源是自动固定在本地仓库空间中

数据对象格式

定义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    
}

你可能感兴趣的:(区块链知识系列,密码学系列,Filecoin,IPFS,Merkle,DAG,DAG,默克有向无环图,Filecoin)