美文网首页
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七层协议栈之文件层

    IPFS七层协议栈之文件层 文件层(Files)   IPFS定义了一组对象,用于在Merkle DAG之上对版本...

  • IPFS七层协议栈之对象层

    IPFS七层协议栈之对象层 对象层(Objects)   基于分布式哈希表DHT和BitSwap技术,IPFS期望...

  • IPFS七层协议栈之交换层

    IPFS七层协议栈之交换层 交换层(Exchange)   IPFS中BitSwap协议旨在通过对等节点间交换数据...

  • IPFS七层协议栈之命名层

    IPFS协议栈之命名层 命名层(Naming) IPNS:命名以及易变状态   IPFS形成了一个内容可寻址的DA...

  • 网络协议、端口和Socket

    1、网络协议分层 网络层次可划分为五层因特网协议栈和七层因特网协议栈。 1.1 五层因特网协议栈 因特网协议栈共有...

  • IPFS协议栈以及身份层、网络层和路由层

    IPFS协议栈以及身份层、网络层和路由层   与HTTP类似,IPFS是基于TCP/IP的应用层协议,同时作为一个...

  • “100问”教你读懂IPFS【2】

    第7问:IPFS架构是怎么样的? 答:IPFS至少有八层子协议栈,从上至下为身份、网络、路由、交换、对象、文件、命...

  • Socket编程之TCP/IP和OSI参考模型

    TCP/IP协议栈以及OSI参考模型 1.OSI七层模型 2.OSI七层功能 wKiom1SIA_nwv_AgAA...

  • OSI-体系结构

    一 OSI七层模型 OSI七层协议模型以及个模型协议 OSI七层协议模型主要是:应用层(Application)、...

  • Dubbo剖析-Dubbo协议

    一、前言 TCP协议栈中,每层模型都有自己的协议报文格式,TCP协议是网络七层模型中的传输层,在TCP上层是应用层...

网友评论

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

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