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编码