美文网首页
IPFS七层协议栈之文件层

IPFS七层协议栈之文件层

作者: 建怀 | 来源:发表于2018-09-14 11:47 被阅读0次

    IPFS七层协议栈之文件层

    文件层(Files)

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

    • 块(block):一个可变大小的数据块。
    • 列表(list):一个块或其他列表的集合。
    • 树(tree):块,列表或其他树的集合。
    • 提交(commit):树的版本历史记录中的快照。

    文件对象:BLOB

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

    {
        "data":"some data here", //blobs 无links
    }
    

    文件对象:LIST

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

    {
        "data":["blob","list","blob"],  //lists有一个对象类型的数组作为数据
        "links":[
            {
                "hash":"XLYkgq61DYaq8Nhkcqy7LcnSA7dSHQ78x",
                "size":189458
            },
            {
                "hash":"XLHBNsgoepUDKL8dkd9Hesa5io9sdxi7n",
                "size":19442
            },
            {
                "hash":"XLWVQKJII8v7dggkfdhHSFlkaw9yjs7dj",
                "size":5286
            } // 在links中lists是没有名字的
        ]
    }
    

    文件对象:TREE

      在IPFS中,Tree对象与Git的tree类似,代表一个目录,或者一个名字到哈希值的映射表,哈希值表示blob,list,其他的tree,或commit,结构如下:

    {
        "data":["blob","list","blob"], // trees有一个对象类型的数组作为数据
        "links":[
            {
                "hash":"XLYkgq61DYaq8Nhkcqy7LcnSA7dSHQ78x",
                "name":"less",
                "size":189458
            },
            {
                "hash":"XLHBNsgoepUDKL8dkd9Hesa5io9sdxi7n",
                "name":"script",
                "size":19442
            },
            {
                "hash":"XLWVQKJII8v7dggkfdhHSFlkaw9yjs7dj",
                "name":"template",
                "size":5286
            } // trees是没有名字的
        ]
    }
    

    文件对象:COMMIT

      IPFS中,commit对象代表任何对象在版本历史记录中的一个快照,它与Git的commit也非常类似,但它可以指向任何类型的对象。

    版本控制

      commit对象代表着一个对象在历史版本中的一个特定快照。两个不同的commit之间相互比较对象数据,可以揭露出两个不同版本文件系统的区别。IPFS可以实现Git版本控制工具的所有功能,同时也可以兼容Git。

    文件系统路径

      Merkle DAG可以看到,可以使用字符串路径API遍历IPFS对象在系统上的文件路径地址。

    将文件分割成LIST和BLOB

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

    • 使用Rabin Fingerprints指纹算法来定义比较合适的块边界。
    • 使用rsync和rolling-checksum算法,来检测块在版本之间的改变。
    • 允许用户设定文件大小而调整数据块的分割策略。

    路径查找性能

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

    • 树缓存(tree cache):由于所有的对象都是哈希寻址的,可以被无限的缓存,另外,tree一般比较小,所以比起blob,IPFS会优先缓存tree。
    • 扁平树(flattened trees):对于任何给定的tree,一个特殊的扁平树可以构建一个链表,所有对象都可以从这个tree中访问得到。在扁平树中name就是一个从原始tree分离的路径,用斜线分隔。
    对象关系图

    上图的对象关系中的ttt111的flattened tree结构如下:

    {
        "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":578,"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"},
        ]
    }
    

    文章借鉴《IPFS与区块链:原理与实战》推荐大家购买正版书籍。

    相关文章

      网友评论

          本文标题:IPFS七层协议栈之文件层

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