《IPFS原理与实践》 —3.6 文件层(File)

2021-04-17 16:12:00 FIL16888

3.6 文件层(File)

IPFS还定义了一组对象,用于在Merkle DAG之上对版本化文件系统进行建模。这个对象模型类似于著名版本控制软件Git的数据结构。

块(block):一个可变大小的数据块。

列表(list):一个块或其他列表的集合。

树(tree):块、列表或其他树的集合。

提交(commit):树版本历史记录中的快照。

1.文件对象:Blob

Blob对象包含一个可寻址的数据单元,表示一个文件。当文件比较小,不足以大到需要分片时,就以Blob对象的形式存储于IPFS网络之中,如下所示:

{

    "data": "some data here",  //Blobs无links

}

2.文件对象:List

List对象由多个连接在一起的Blob组成,通常存储的是一个大文件。从某种意义上说,List的功能更适用于数据块互相连接的文件系统。由于List可以包含其他List,所以可能形成包括链接列表和平衡树在内的拓扑结构,如下所示:

{

    "data": ["blob", "list", "blob"], //标记对象类型的数组

    "links": [

    { "hash": "XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x",

    "size": 189458 },

    { "hash": "XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5",

    "size": 19441 },

    { "hash": "XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z",

    "size": 5286 }

    ]

}

3.文件对象:Tree

IPFS中,Tree对象与Git的Tree类似:它代表一个目录,或者一个名字到哈希值的映射表。哈希值表示Blob、List、其他的Tree或Commit,结构如下所示:

{

    "data": ["blob", "list", "blob"],//Tree有一个对象类型的数组作为数据

    "links": [

        { "hash": "XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x",

        "name": "less", "size": 189458 },

        { "hash": "XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5",

        "name": "script", "size": 19441 },

        { "hash": "XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z",

        "name": "template", "size": 5286 }//tree是有名字的

    ]

}

4.文件对象:Commit

IPFS中,Commit对象代表任何对象在版本历史记录中的一个快照。它与Git的Commit类似,但它可以指向任何类型的对象(Git中只能指向Tree或其他Commit)。

5.版本控制:Commit

Commit对象代表一个对象在历史版本中的一个特定快照。两个不同的Commit之间互相比较对象数据(和子对象数据),可以***出两个不同版本文件系统的区别。IPFS可以实现Git版本控制工具的所有功能,同时也可以兼容并改进Git。这块知识内容将作为实战项目,在第8章中进行详细介绍。

6.文件系统路径

正如我们在介绍Merkle DAG时看到的,IPFS对象在系统上的文件路径地址,可以通过外层接口调用输出。

7.将文件分割成List和Blob

版本控制和分发大文件最主要的挑战是:找到一个正确的方法来将它们分隔成独立的块。与其认为IPFS可以为每个不同类型的文件提供正确的分隔方法,不如说IPFS提供了以下的几个可选项:

使用Rabin Fingerprints指纹算法来定义比较合适的块边界。

使用rsync和rolling-checksum算法来检测块在版本之间的改变。

允许用户设定文件大小而调整数据块的分割策略。

8.路径查找性能

基于路径的访问需要遍历整个对象图,检索每个对象需要在DHT中查找它的Key值,连接到节点并检索对应的数据块。这是一笔相当大的性能开销,特别是在查找的路径中具有多个子路径时。IPFS充分考虑了这一点,并设计了如下的方式来提高性能。

树缓存(tree cache):由于所有的对象都是哈希寻址的,它们可以被无限地缓存。另外,Tree一般比较小,所以比起Blob,IPFS会优先缓存Tree。

扁平树(flattened tree):对于任何给定的Tree,一个特殊的扁平树可以构建一个链表,所有对象都可以从这个Tree中访问得到。在扁平树中,name就是一个从原始Tree分离的路径,用斜线分隔。

如图3-4所示对象关系示例图中的ttt111的扁平树结构如下:

{

    "data":["tree", "blob", "tree", "list", "blob" "blob"],

    "links": [

        { "hash": "<ttt222-hash>", "size": 1234

        "name": "ttt222-name" },

        { "hash": "<bbb111-hash>", "size": 123,

        "name": "ttt222-name/bbb111-name" },

        { "hash": "<ttt333-hash>", "size": 3456,

        "name": "ttt333-name" },

        { "hash": "<lll111-hash>", "size": 587,

        "name": "ttt333-name/lll111-name"},

        { "hash": "<bbb222-hash>", "size": 22,

        "name": "ttt333-name/lll111-name/bbb222-name" },

        { "hash": "<bbb222-hash>", "size": 22

        "name": "bbb222-name" }

    ]

}


首页
产品
新闻
联系