IPFS七层协议栈之文件层
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与区块链:原理与实战》推荐大家购买正版书籍。