pb blob存储到image_【Filecoin相关】速懂 Filecoin 自认证存储设计
本文由IPFS原力區(qū) Taosheng shi 原創(chuàng)
Filecoin項目的發(fā)起人胡安于2019/10/22,在‘slack’討論群中公開了filecoin數(shù)據(jù)存儲格式的細(xì)節(jié),供團(tuán)隊討論和審閱。眾所周知,filecoin是基于存儲(IPFS)的區(qū)塊鏈項目,數(shù)據(jù)存儲設(shè)計,特別是區(qū)塊鏈與數(shù)據(jù)存儲的配合就至關(guān)重要。據(jù)筆者觀察,協(xié)議實驗室一直善于在借鑒和研究已有的成熟技術(shù)之上,進(jìn)行基礎(chǔ)性的創(chuàng)新。本文不僅對胡安公布的ppt進(jìn)行解讀,也會梳理其借鑒的設(shè)計思想。思想來源
目前主流的服務(wù)器都安裝類Unix的操作系統(tǒng),其中文件存儲都是基于POSXI 的IO語義。POSIX I/O API 是我們最熟悉的,因為它就是應(yīng)用程序讀寫數(shù)據(jù)調(diào)用的接口,包括open()/close()/read()/write()/lseek()等等。POSIX I/O API 是當(dāng)今應(yīng)用程序和程序庫的一個必要組成部分。一個典型的 POSXI ?IO 程序的流程如下:使用open()打開文件;
然后read()文件數(shù)據(jù);
接著seek()到文件中的新位置;
在該位置write()一些數(shù)據(jù);
最后close()文件。
定義線程的數(shù)據(jù)DAG結(jié)構(gòu)
定義從輸入生成此結(jié)構(gòu)所需的轉(zhuǎn)換順序
如上圖所示:通過定義一個數(shù)據(jù)工廠,就可以轉(zhuǎn)換任意格式的數(shù)據(jù):
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)}更多內(nèi)容,請參閱:https://docs.textile.io/concepts/threads/
Cryptree 也是filecoin數(shù)據(jù)存儲的借鑒來源,由《Cryptree: A Folder Tree Structure for Cryptographic File Systems》一文詳細(xì)介紹。Cryptree是一種加密樹結(jié)構(gòu),它有助于在不可信存儲上實現(xiàn)文件系統(tǒng)的訪問控制。Cryptree利用文件系統(tǒng)的文件夾層次結(jié)構(gòu)實現(xiàn)高效、直觀、簡單的訪問控制。最突出的是Cryptree可以遞歸地在固定時間內(nèi)訪問一個文件夾及其所有子文件夾,并且訪問權(quán)的動態(tài)繼承從本質(zhì)上防止了訪問權(quán)的分散,另外Cryptree允許某人訪問文件或文件夾而不暴露其他訪問者身份。為了推理和形象化加密樹,論文引入了加密鏈接的概念。我們描述了在我們自己的文件系統(tǒng)中用來強(qiáng)制讀寫訪問的加密樹。加密鏈接是一個重要基本抽象,也是協(xié)議實驗室的重要借鑒之處。加密鏈接原理上很簡單,從一個密鑰K1到另一個密鑰K2的加密鏈接使每個擁有K1的人都能推導(dǎo)出K2。連接多個鏈接可以構(gòu)建加密數(shù)據(jù)結(jié)構(gòu)。注意,當(dāng)K1變臟時,K2也變臟。論文區(qū)分了兩種類型的密碼鏈路:對稱鏈路和非對稱鏈路。更多內(nèi)容參閱《Cryptree: A Folder Tree Structure for Cryptographic File Systems》。filecoin數(shù)據(jù)存儲借鑒的Git分支的原理。要真正理解Git管理分支的原理,需要打開Git的引擎蓋,了解Git如何存儲數(shù)據(jù)。假設(shè)你的目錄下面有三個文件,然后執(zhí)行第一步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操作還會創(chuàng)建一個 commit 對象存儲元數(shù)據(jù)和指向tree對象的指針。現(xiàn)在,Git倉庫包含五個對象,對應(yīng)于每個文件的三個blob對象,包含目錄內(nèi)容和文件映射的tree對象,包含元數(shù)據(jù)信息和指向tree指針的commit對象。區(qū)塊鏈基于時間戳的鏈?zhǔn)酱鎯σ彩莊ilecoin數(shù)據(jù)存儲借鑒來源。如下圖所示,區(qū)塊鏈存儲結(jié)構(gòu)眾所周知,這里不再贅言。總體設(shè)計
基于以上思想來源,包含了一下關(guān)鍵要點:文件存儲的目錄結(jié)構(gòu)
鏈?zhǔn)郊用?/p>
鏈?zhǔn)酱鎯?/p>
元數(shù)據(jù)設(shè)計
分支管理
Merkle tree
IPFS unixfs 設(shè)計
由于filecoin的自認(rèn)證歸檔存儲基于IPFS的數(shù)據(jù)存儲格式,傳統(tǒng)posix 語義的文件需要轉(zhuǎn)換為IPFS unixfs的文件格式,才能比較方便地參與filecoin區(qū)塊鏈的復(fù)制證明和時空證明。IPFS unixfs 使用可插拔的數(shù)據(jù)分片算法對傳統(tǒng)posix 語義的文件進(jìn)行分片。傳統(tǒng)posix 語義的文件是順序存儲的字節(jié),IPFS unixfs 是基于分片的有向無環(huán)圖。IPFS unixfs的最小單位是分片,這些分片(leaves)被稱為葉子或者數(shù)據(jù)片(pieces),為了構(gòu)建有向無環(huán)圖,必然需要引入中間文件對象(File objects),這些中間對象通過一定拓?fù)鋒ash為一個root CID。IPFS unixfs 這種構(gòu)建圖式數(shù)據(jù)存儲的方式被稱為IPLD,即是星際鏈?zhǔn)綌?shù)據(jù),這也是IPFS 內(nèi)容尋址的基礎(chǔ)。如下圖所示,ipfs文件系統(tǒng)存儲一只貓的圖片形象表示:IPFS unixfs的這種設(shè)計代表了文件存儲范式的一種轉(zhuǎn)變,即從posix 語義(單機(jī)順序字節(jié)存儲、文件名檢索)向網(wǎng)絡(luò)化鏈?zhǔn)酱鎯Φ霓D(zhuǎn)變(全網(wǎng)鏈?zhǔn)酱鎯?#xff0c;內(nèi)容尋址)。IPFS unixfs 目錄設(shè)計
目錄設(shè)計,或者是元數(shù)據(jù)設(shè)計,是所有文件系統(tǒng)設(shè)計的重中之重。對比傳統(tǒng)posix 語義的目錄設(shè)計和IPFS unixfs的目錄設(shè)計,可以更好的理解IPFS unixfs是如何把傳統(tǒng)類unix文件系統(tǒng)中文件轉(zhuǎn)化為鏈?zhǔn)轿募鎯Φ膫鹘y(tǒng)文件系統(tǒng)組織成樹形的目錄和文件,要么存儲在本地,要么存儲在云中。這種樹形結(jié)構(gòu)已經(jīng)成為人們認(rèn)知數(shù)據(jù)存儲的基本方式。類似于這種組織方式,IPFS unixfs使用IPLD graph來表示目錄,來指向其他目錄或文件。由于IPLD graph的這種遞歸指向方式,IPFS unixfs可以存儲超大文件。當(dāng)然,IPFS unixfs也可以單機(jī)存儲,把IPLD目錄對象單獨存儲一部分,和數(shù)據(jù)文件一起序列化存儲。IPFS unixfs 應(yīng)用
Textile本身就是基于ipfs的,非常適合存儲在filecoin中。Peergos cryptree 內(nèi)置了IPFS unixfs 能力,可以輸出加密的IPLD graph。Git 也是基于DAG的方式存儲。一些區(qū)塊鏈的數(shù)據(jù)存儲格式本身就是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原力區(qū)】
價值觀:價值 共建 共享 榮耀
總部位于上海,聚集基于分布式網(wǎng)絡(luò)&存儲的眾多技術(shù)大咖和愛好者,深耕基于 IPFS 的商業(yè)生態(tài)建設(shè)和社區(qū)發(fā)展。
每周二舉辦“分布式存儲網(wǎng)絡(luò)”主題沙龍,聚集了眾多技術(shù)大咖和 IPFS 愛好者,通過持續(xù)輸出全面、精細(xì)、優(yōu)質(zhì)的IPFS咨詢和技術(shù)支持,將生態(tài)中的愛好者轉(zhuǎn)化為IPFS支持者和參與者,共建IPFS生態(tài)的健康發(fā)展。
協(xié)議學(xué)院活動? 快速了解總結(jié)
以上是生活随笔為你收集整理的pb blob存储到image_【Filecoin相关】速懂 Filecoin 自认证存储设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 集合体系详解——List体系有
- 下一篇: java.net.URLEncode编码