pb blob存储到image_【Filecoin相关】速懂 Filecoin 自认证存储设计
本文由IPFS原力区 Taosheng shi 原创
Filecoin项目的发起人胡安于2019/10/22,在‘slack’讨论群中公开了filecoin数据存储格式的细节,供团队讨论和审阅。众所周知,filecoin是基于存储(IPFS)的区块链项目,数据存储设计,特别是区块链与数据存储的配合就至关重要。据笔者观察,协议实验室一直善于在借鉴和研究已有的成熟技术之上,进行基础性的创新。本文不仅对胡安公布的ppt进行解读,也会梳理其借鉴的设计思想。思想来源
目前主流的服务器都安装类Unix的操作系统,其中文件存储都是基于POSXI 的IO语义。POSIX I/O API 是我们最熟悉的,因为它就是应用程序读写数据调用的接口,包括open()/close()/read()/write()/lseek()等等。POSIX I/O API 是当今应用程序和程序库的一个必要组成部分。一个典型的 POSXI IO 程序的流程如下:使用open()打开文件;
然后read()文件数据;
接着seek()到文件中的新位置;
在该位置write()一些数据;
最后close()文件。
定义线程的数据DAG结构
定义从输入生成此结构所需的转换顺序
如上图所示:通过定义一个数据工厂,就可以转换任意格式的数据:
message FileMeta { string mill = 1; // Mill used to process the file (e.g., `/image/resize`, `/json`) string checksum = 2; // Pre-milled (md5) checksum of the input file string source = 3; // Source file CID string opts = 4; // md5 checksum of input mill options string hash = 5; // CID hash of milled file string key = 6; // AES encryption key string media = 7; // Media type (e.g., `'application/json'`, `'image/jpeg'`) string name = 8; // Name of the input file int64 size = 9; // Size of the milled file in bytes google.protobuf.Timestamp added = 10; // Date the file was added to the thread google.protobuf.Struct meta = 11; // Additional metadata repeated string targets = 12; // DAG targets the file belongs to (kept only by the local peer)}更多内容,请参阅:https://docs.textile.io/concepts/threads/
Cryptree 也是filecoin数据存储的借鉴来源,由《Cryptree: A Folder Tree Structure for Cryptographic File Systems》一文详细介绍。Cryptree是一种加密树结构,它有助于在不可信存储上实现文件系统的访问控制。Cryptree利用文件系统的文件夹层次结构实现高效、直观、简单的访问控制。最突出的是Cryptree可以递归地在固定时间内访问一个文件夹及其所有子文件夹,并且访问权的动态继承从本质上防止了访问权的分散,另外Cryptree允许某人访问文件或文件夹而不暴露其他访问者身份。为了推理和形象化加密树,论文引入了加密链接的概念。我们描述了在我们自己的文件系统中用来强制读写访问的加密树。加密链接是一个重要基本抽象,也是协议实验室的重要借鉴之处。加密链接原理上很简单,从一个密钥K1到另一个密钥K2的加密链接使每个拥有K1的人都能推导出K2。连接多个链接可以构建加密数据结构。注意,当K1变脏时,K2也变脏。论文区分了两种类型的密码链路:对称链路和非对称链路。更多内容参阅《Cryptree: A Folder Tree Structure for Cryptographic File Systems》。filecoin数据存储借鉴的Git分支的原理。要真正理解Git管理分支的原理,需要打开Git的引擎盖,了解Git如何存储数据。假设你的目录下面有三个文件,然后执行第一步add(stage)第二步commit。$ git add README test.rb LICENSE$ git commit -m 'initial commit of my project'add操作计算文件的校验和(SHA-1 ),存储这个版本的文件到Git仓库中(blob)。commit操作计算所有目录和文件的校验和(SHA-1 ),然后存储到tree对象中。commit操作还会创建一个 commit 对象存储元数据和指向tree对象的指针。现在,Git仓库包含五个对象,对应于每个文件的三个blob对象,包含目录内容和文件映射的tree对象,包含元数据信息和指向tree指针的commit对象。区块链基于时间戳的链式存储也是filecoin数据存储借鉴来源。如下图所示,区块链存储结构众所周知,这里不再赘言。总体设计
基于以上思想来源,包含了一下关键要点:文件存储的目录结构
链式加密
链式存储
元数据设计
分支管理
Merkle tree
IPFS unixfs 设计
由于filecoin的自认证归档存储基于IPFS的数据存储格式,传统posix 语义的文件需要转换为IPFS unixfs的文件格式,才能比较方便地参与filecoin区块链的复制证明和时空证明。IPFS unixfs 使用可插拔的数据分片算法对传统posix 语义的文件进行分片。传统posix 语义的文件是顺序存储的字节,IPFS unixfs 是基于分片的有向无环图。IPFS unixfs的最小单位是分片,这些分片(leaves)被称为叶子或者数据片(pieces),为了构建有向无环图,必然需要引入中间文件对象(File objects),这些中间对象通过一定拓扑hash为一个root CID。IPFS unixfs 这种构建图式数据存储的方式被称为IPLD,即是星际链式数据,这也是IPFS 内容寻址的基础。如下图所示,ipfs文件系统存储一只猫的图片形象表示:IPFS unixfs的这种设计代表了文件存储范式的一种转变,即从posix 语义(单机顺序字节存储、文件名检索)向网络化链式存储的转变(全网链式存储,内容寻址)。IPFS unixfs 目录设计
目录设计,或者是元数据设计,是所有文件系统设计的重中之重。对比传统posix 语义的目录设计和IPFS unixfs的目录设计,可以更好的理解IPFS unixfs是如何把传统类unix文件系统中文件转化为链式文件存储的传统文件系统组织成树形的目录和文件,要么存储在本地,要么存储在云中。这种树形结构已经成为人们认知数据存储的基本方式。类似于这种组织方式,IPFS unixfs使用IPLD graph来表示目录,来指向其他目录或文件。由于IPLD graph的这种递归指向方式,IPFS unixfs可以存储超大文件。当然,IPFS unixfs也可以单机存储,把IPLD目录对象单独存储一部分,和数据文件一起序列化存储。IPFS unixfs 应用
Textile本身就是基于ipfs的,非常适合存储在filecoin中。Peergos cryptree 内置了IPFS unixfs 能力,可以输出加密的IPLD graph。Git 也是基于DAG的方式存储。一些区块链的数据存储格式本身就是IPLD 组织方式。可以通过修改代码存储为IPLD存储方式。参考资料:《糟糕的 POSIX IO》http://guleilab.com/2019/05/12/bad-posix-io/
https://git-scm.com/book/en/v1/Git-Branching-What-a-Branch-Is
https://github.com/ipfs/go-unixfs/blob/master/pb/unixfs.proto
https://docs.textile.io/concepts/threads/
https://training-course-material.com/training/Git_-_Under_the_Bonnet
【IPFS原力区】
价值观:价值 共建 共享 荣耀
总部位于上海,聚集基于分布式网络&存储的众多技术大咖和爱好者,深耕基于 IPFS 的商业生态建设和社区发展。
每周二举办“分布式存储网络”主题沙龙,聚集了众多技术大咖和 IPFS 爱好者,通过持续输出全面、精细、优质的IPFS咨询和技术支持,将生态中的爱好者转化为IPFS支持者和参与者,共建IPFS生态的健康发展。
协议学院活动 快速了解总结
以上是生活随笔为你收集整理的pb blob存储到image_【Filecoin相关】速懂 Filecoin 自认证存储设计的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Java 集合体系详解——List体系有
- 下一篇: java.net.URLEncode编码