Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 99视频在线精品,一区不卡在线观看,国产精品中文

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          HTTP PK IPFS:一個(gè)中心,還是多個(gè)中心?

          HTTP PK IPFS:一個(gè)中心,還是多個(gè)中心?

          言:一種新技術(shù)的誕生,總會(huì)面臨著不同境況:有狂熱的信仰者追捧,有沉穩(wěn)的中立者觀望,也有頑固的保守者評(píng)判,猶如達(dá)爾文的《物種起源》。

          (一)前世——HTTP:拉開網(wǎng)絡(luò)信息時(shí)代的序幕,獨(dú)領(lǐng)風(fēng)騷二十年

          1991年8月6日,蒂姆·伯納斯·李在位于歐洲粒子物理研究所(CERN)的NeXT計(jì)算機(jī)上,正式運(yùn)行世界上第一個(gè)Web網(wǎng)站(http://info.cern.ch ),建立起基本的互聯(lián)網(wǎng)基礎(chǔ)概念和技術(shù)體系,由此開啟了網(wǎng)絡(luò)信息時(shí)代的序幕。

          1991年,HTTP/0.9版首次登上歷史的舞臺(tái),版本極其簡(jiǎn)單,只有一個(gè)命令GET。基于協(xié)議規(guī)定:服務(wù)器只能回應(yīng)HTML格式的字符串,不能回應(yīng)別的格式,服務(wù)器發(fā)送完畢,就關(guān)閉TCP連接。現(xiàn)在看來,是多么的簡(jiǎn)陋單一,然而就是這一小小的變化,卻敲開一扇塵封已久的大門。

          1996年5月,HTTP/1.0 版本發(fā)布,別看只是0.9與1.0數(shù)字上細(xì)微只差,但卻是一個(gè)分水嶺,為HTTP的后續(xù)發(fā)展提供了強(qiáng)勁的動(dòng)力。

          首先HTTP擴(kuò)大了傳輸內(nèi)容的類別,并非僅僅局限于文字,圖片、二進(jìn)制文件、視頻等均囊括于內(nèi),這為互聯(lián)網(wǎng)的后續(xù)爆發(fā)奠定了基礎(chǔ)。其次,除了GET命令,還引入POST命令和HEAD命令,豐富了瀏覽器與服務(wù)器的互動(dòng)手段,讓HTTP請(qǐng)求和回應(yīng)的格式也有些改變。最后,也新增了一些的功能以此更好去服務(wù)互聯(lián)網(wǎng)。

          技術(shù)一直在迭代更新,只為需求最優(yōu)的方案。半年后,HTTP/1.1 版本發(fā)布,HTTP/1.1進(jìn)一步完善了 HTTP/1.0 協(xié)議,它引入持久連接(persistent connection)和管道機(jī)制(pipelining),改進(jìn)了HTTP協(xié)議的效率,但卻存在著“對(duì)頭堵塞”的問題。即便如此,HTTP/1.1一直用到了20十多年后的今天,直到現(xiàn)在還是最流行的版本之一。

          2009年,谷歌公開了自行研發(fā)的 SPDY 協(xié)議,主要解決 HTTP/1.1 效率不高的問題。基于這個(gè)協(xié)議在Chrome瀏覽器上證明可行后,便被當(dāng)作 HTTP/2 的基礎(chǔ)。2015年,HTTP/2 發(fā)布,它不叫 HTTP/2.0,是因?yàn)闃?biāo)準(zhǔn)委員會(huì)不打算再發(fā)布子版本,下一個(gè)新版本將是 HTTP/3,這也許意味一個(gè)時(shí)代的終結(jié)。

          歷史告我們,一個(gè)英雄倒下了,下一個(gè)英雄崛起,開啟著屬于他的輝煌。

          (二)今生——IPFS:極簡(jiǎn)主義的布道者,后起之秀可爭(zhēng)雄

          2014年5月,一個(gè)叫Juan Benet墨西哥的小哥與他的幾個(gè)斯坦福大學(xué)同學(xué)一起發(fā)明了IPFS。IPFS 的發(fā)明者Juan Benet是一位墨西哥移民也是一個(gè)傳奇人物,畢業(yè)于斯坦福大學(xué)的計(jì)算機(jī)科學(xué)專業(yè)。之前創(chuàng)立的一家公司在 2013 年被雅虎收購(gòu) ,隨后,他在Y Combinator 項(xiàng)目中成立了 Protocol Labs。

          Protocal Labs剛一創(chuàng)立就加入美國(guó)硅谷頂級(jí)孵化器Y-Combinator,IPFS是他們做的第一個(gè)產(chǎn)品。Protocol Labs在創(chuàng)建IPFS的時(shí)候給它取名為“Inter Planetary File System(星際文件傳輸)”。對(duì)于這一點(diǎn),Protocol Labs希望構(gòu)建一個(gè)點(diǎn)對(duì)點(diǎn)的分布式文件系統(tǒng),通過底層協(xié)議,讓全世界所有人都能夠輕松從IPFS系統(tǒng)上提取文件,且不受防火墻的影響。

          愿景很美好,但每一條看似光鮮亮麗的道路上是荊棘遍地。IPFS主張將大文件分別存放于不同的塊中,但同時(shí)存在著一個(gè)隱患,即:如果一部分存放文件的節(jié)點(diǎn)統(tǒng)統(tǒng)下線不可用了,并且該文件沒有備份,那么整個(gè)文件都是不可用的。

          簡(jiǎn)而言之,就是需要激勵(lì)更多人去存儲(chǔ)信息和分發(fā)文件。此刻,F(xiàn)ilecoin順勢(shì)而生,作為IPFS的激勵(lì)層,也可認(rèn)為是IPFS網(wǎng)絡(luò)上的通證。Filecoin共發(fā)行20億枚,并在2017年7月進(jìn)行代幣私募,8月進(jìn)行了通證眾籌,融資超過2.5億美元。這意味著IPFS尚未正式啟動(dòng),市場(chǎng)價(jià)值已達(dá)到25億美元,其魅力可見一斑!

          2018年1月2日,IPFS官方網(wǎng)站發(fā)布:自融資完成以來,IPFS一直致力于將Filecoin的巨大潛力變?yōu)楝F(xiàn)實(shí) - 從Filecoin的實(shí)施到執(zhí)行協(xié)議的核心再到招募最優(yōu)秀的人才來發(fā)展團(tuán)隊(duì)。直到現(xiàn)在,IPFS依然像一個(gè)典型的理工男一樣默默深耕技術(shù),或許正因?yàn)檫@份堅(jiān)毅的執(zhí)著和近似苛刻的嚴(yán)謹(jǐn),才會(huì)讓IPFS走得更遠(yuǎn),真正將夢(mèng)想照進(jìn)現(xiàn)實(shí)。

          他們還在為曾經(jīng)的理想書寫著未來,默默地砥礪前行,離成功只差臨門一腳。

          (三)技術(shù)間的博弈源于:是一個(gè)中心,還是多個(gè)中心?

          其實(shí)一開始,Web的本意是去中心化,但它卻變得越來越中心化,今天越來越多的人依靠的是少數(shù)網(wǎng)站的服務(wù)。HTTP變成了一個(gè)脆弱的、高度集中的、無效的、過度依賴于骨干網(wǎng)的協(xié)議,像美國(guó)國(guó)家安全局這樣的組織,現(xiàn)在只需要在幾個(gè)點(diǎn)上攔截通信來進(jìn)行監(jiān)視。對(duì)政府來說,阻止網(wǎng)站訪問這些高度集中化的資源變得容易,這也使通信容易遭受DDoS攻擊而面臨巨大的風(fēng)險(xiǎn)。

          反觀IPFS,它不需要每個(gè)節(jié)點(diǎn)存儲(chǔ)所有發(fā)布到IPFS上的內(nèi)容。相反,每個(gè)節(jié)點(diǎn)只存儲(chǔ)自己想要的數(shù)據(jù)。如果每個(gè)節(jié)點(diǎn)托管一點(diǎn)數(shù)據(jù),所有數(shù)據(jù)通過累積就提供了比任何集中式HTTP更多的空間、帶寬和可用性。分布式網(wǎng)絡(luò)將很快成為世界上最快、最可用、以及最大的數(shù)據(jù)存儲(chǔ)。沒有人有能力關(guān)閉所有的節(jié)點(diǎn),所以數(shù)據(jù)永遠(yuǎn)不會(huì)丟失。

          與此同時(shí),比及HTTP協(xié)議,IPFS會(huì)讓文件下載速度更快,儲(chǔ)存空間價(jià)格變的更加低廉,網(wǎng)絡(luò)更加開放和安全。目前,在網(wǎng)絡(luò)結(jié)構(gòu)里面,中心化服務(wù)器的傳輸壓力非常大,而個(gè)人電腦、家用網(wǎng)絡(luò)、數(shù)據(jù)帶寬的利用率卻很低,造成了資源的浪費(fèi),如果它通過把個(gè)人的帶寬資源利用起來,為用戶創(chuàng)造更好的網(wǎng)絡(luò)環(huán)境,同時(shí)還采用激勵(lì)的方式讓更多用戶貢獻(xiàn)自己的資源(參考Filecoin\HCC颶風(fēng)生態(tài)),豈不是兩全其美。

          誠(chéng)然,IPFS在某些性能上占據(jù)了優(yōu)勢(shì),但就目前的存儲(chǔ)市場(chǎng)而論,中心化存儲(chǔ)遠(yuǎn)占上風(fēng),中心化存儲(chǔ)的市場(chǎng)占比高達(dá)90%以上。據(jù)了解,世界最大的芯片制造廠商 Intel 有大約10萬臺(tái)服務(wù)器,F(xiàn)acebook有3萬臺(tái),而 Google有超過100萬臺(tái)服務(wù)器。

          然而,伴隨著各行各業(yè)的數(shù)據(jù)一直在急劇猛增,勢(shì)頭如火如荼,未來對(duì)數(shù)據(jù)存儲(chǔ)、分發(fā)的門檻也會(huì)隨之拔高,傳統(tǒng)中心化存儲(chǔ)的性能難以為繼,HTTP或許會(huì)從框架上進(jìn)行改進(jìn),但終究無法解決“集中性化”帶來的痼疾,IPFS也許能成為一個(gè)不錯(cuò)的替代方案,卻也依然存在著監(jiān)管復(fù)雜等一些潛在的風(fēng)險(xiǎn)。

          歸根結(jié)底,兩者之間的博弈核心還在于“中心化”還是多中心化的選擇。

          (四)去中心化:展望未來,萬物皆是中心

          正如我們現(xiàn)在對(duì)于互聯(lián)網(wǎng)使用習(xí)以為常一樣,IPFS實(shí)則是重構(gòu)了我們傳遞、獲取、存儲(chǔ)信息的方式。為此出現(xiàn)新型的項(xiàng)目,像Filecoin則為這一系統(tǒng)建立了激勵(lì)體系來確保系統(tǒng)的運(yùn)轉(zhuǎn),又恰如HCC颶風(fēng)生態(tài)以視頻為切入口,構(gòu)建聚合數(shù)據(jù)儲(chǔ)存、處理及公鏈開發(fā)的雙底層智能生態(tài)。雖然諸如此類的項(xiàng)目層出不窮,但整個(gè)行業(yè)都朝著“萬物皆是中心”的良好趨勢(shì)前進(jìn),即便這個(gè)時(shí)間線很長(zhǎng)。

          或許,IPFS的前沿在不久的將來,會(huì)徹底改變我們看待信息的方式,成為我們?nèi)粘I畹囊徊糠帧2还苁菂^(qū)塊鏈本身帶來的金融自由,還是IPFS給我們帶來的信息自由,無疑都將是人類進(jìn)化史上重要的一個(gè)里程碑。

          是否還記得,那臺(tái)Tim Berners-Lee在CERN的NeXT電腦——世界上第一臺(tái)HTTP協(xié)議的Web服務(wù)器,主機(jī)箱上貼著一張醒目的紙條,上面寫著“這是一臺(tái)服務(wù)器,不要關(guān)機(jī)!”即便它現(xiàn)存于一家博物館,但它的“兄弟姐妹”依舊分布在全球各地,依舊貼著“不要關(guān)機(jī)”的字樣。或許多年后,服務(wù)器會(huì)擺脫這個(gè)無形的標(biāo)簽,因?yàn)橐呀?jīng)沒有了中心。

          要:IPFS 和區(qū)塊鏈有著非常緊密的聯(lián)系, 隨著區(qū)塊鏈的不斷發(fā)展,對(duì)數(shù)據(jù)的存儲(chǔ)需求也越來越高。本文從IPFS 的底層設(shè)計(jì)出發(fā), 結(jié)合源代碼, 分析了IPFS 的一些技術(shù)細(xì)節(jié)。


          一、概述

          IPFS 和區(qū)塊鏈有著非常緊密的聯(lián)系, 隨著區(qū)塊鏈的不斷發(fā)展,對(duì)數(shù)據(jù)的存儲(chǔ)需求也越來越高, 由于性能和成本的限制,現(xiàn)有的區(qū)塊鏈設(shè)計(jì)方案大部分都選擇了把較大的數(shù)據(jù)存儲(chǔ)在鏈外,通過對(duì)數(shù)據(jù)進(jìn)行加密, 哈希運(yùn)算等手段來防止數(shù)據(jù)被篡改, 在區(qū)塊鏈上只引用所存數(shù)據(jù)的hash 值, 從而滿足業(yè)務(wù)對(duì)數(shù)據(jù)的存儲(chǔ)需求。 本文從IPFS 的底層設(shè)計(jì)出發(fā), 結(jié)合源代碼, 分析了IPFS 的一些技術(shù)細(xì)節(jié)。 由于IPFS還在不斷更新中, 文中引用的部分可能和最新代碼有所出入。

          閱讀本文需要讀者

          • 了解網(wǎng)絡(luò)編程

          • 了解分布式存儲(chǔ)

          • 了解基本的區(qū)塊鏈知識(shí)

          二、什么是IPFS?

          維基百科上是這樣解釋的:是一個(gè)旨在創(chuàng)建持久且分布式存儲(chǔ)和共享文件的網(wǎng)絡(luò)傳輸協(xié)議。

          上面的解釋稍顯晦澀, 我的理解是:

          1. 首先它是一個(gè)FS(文件系統(tǒng))

          2. 其次它支持點(diǎn)對(duì)點(diǎn)傳輸

          既然是文件系統(tǒng), 那它和普通的文件系統(tǒng)有什么區(qū)別呢? 有以下幾點(diǎn)區(qū)別:

          • 存儲(chǔ)方式: 它是分布式存儲(chǔ)的, 為了方便傳輸,文件被切分成多個(gè)block, 每個(gè)block 通過hash運(yùn)算得到唯一的ID, 方便在網(wǎng)絡(luò)中進(jìn)行識(shí)別和去重。 考慮到傳輸效率, 同一個(gè)block 可能有多個(gè)copy, 分別存儲(chǔ)在不同的網(wǎng)絡(luò)節(jié)點(diǎn)上。

          • 內(nèi)容尋址方式: 每個(gè)block都有唯一的ID,我們只需要根據(jù)節(jié)點(diǎn)的ID 就可以獲取到它所對(duì)應(yīng)的block。

          那么問題來了, 既然文件被切分成了多個(gè)block,如何組織這些block 數(shù)據(jù),組成邏輯上的文件呢? 在IFPS中采用的merkledag, 下面是 merkledag 的一個(gè)示意圖:

          簡(jiǎn)單來說, 就是2種數(shù)據(jù)結(jié)構(gòu)merkle 和DAG(有向無環(huán)圖)的結(jié)合, 通過這種邏輯結(jié)構(gòu), 可以滿足:

          • 內(nèi)容尋址: 使用hash ID來唯一識(shí)別一個(gè)數(shù)據(jù)塊的內(nèi)容

          • 防篡改: 可以方便的檢查哈希值來確認(rèn)數(shù)據(jù)是否被篡改

          • 去重: 由于內(nèi)容相同的數(shù)據(jù)塊哈希是相同的,可以很容去掉重復(fù)的數(shù)據(jù),節(jié)省存儲(chǔ)空間

          確定了數(shù)據(jù)模型后, 接下來要做的事: 如何把數(shù)據(jù)分發(fā)到不同的網(wǎng)絡(luò)節(jié)點(diǎn)上, 達(dá)到分布式存儲(chǔ)和共享的目的? 我們先思考一下, 通過網(wǎng)絡(luò),比如HTTP, 訪問某個(gè)文件的步驟,首先我們要知道存儲(chǔ)這個(gè)文件的服務(wù)器地址, 然后我們需要知道這個(gè)文件對(duì)應(yīng)的ID, 比如文件名。前者我們可以抽象成網(wǎng)絡(luò)節(jié)點(diǎn)尋址, 后者我們抽象成文件對(duì)象尋址; 在IPFS中, 這兩種尋址方式使用了相同的算法, KAD, 介紹KAD算法的文章很多,這里不贅述, 只簡(jiǎn)單說明一下核心思想:

          KAD 最精妙之處就是使用XOR 來計(jì)算ID 之間的距離,并且統(tǒng)一了節(jié)點(diǎn)ID 和 對(duì)象ID的尋址方式。 采用 XOR(按比特異或操作)算法計(jì)算 key 之間的“距離”。

          這種做法使得它具備了類似于“幾何距離”的某些特性(下面用 ⊕ 表示 XOR)

          • (A ⊕ B)==(B ⊕ A) XOR 符合“交換律”,具備對(duì)稱性。

          • (A ⊕ A)==0 反身性,自身距離為零

          • (A ⊕ B) > 0 【不同】的兩個(gè) key 之間的距離必大于零

          • (A ⊕ B) + (B ⊕ C) >=(A ⊕ C) 三角不等式

          通過KAD算法,IPFS 把不同ID的數(shù)據(jù)塊分發(fā)到與之距離較近的網(wǎng)絡(luò)節(jié)點(diǎn)中,達(dá)到分布式存儲(chǔ)的目的。

          通過IPFS獲取文件時(shí),只需要根據(jù)merkledag, 按圖索驥,根據(jù)每個(gè)block的ID, 通過KAD算法從相應(yīng)網(wǎng)絡(luò)節(jié)點(diǎn)中下載block數(shù)據(jù), 最后驗(yàn)證是否數(shù)據(jù)完整, 完成拼接即可。

          下面我們?cè)購(gòu)募夹g(shù)實(shí)現(xiàn)的角度做更深入的介紹。

          三、IPFS的系統(tǒng)架構(gòu)

          我們先看一下IPFS的系統(tǒng)架構(gòu)圖, 分為5層:

          • 一層為naming, 基于PKI的一個(gè)命名空間;

          • 第二層為merkledag, IPFS 內(nèi)部的邏輯數(shù)據(jù)結(jié)構(gòu);

          • 第三層為exchange, 節(jié)點(diǎn)之間block data的交換協(xié)議;

          • 第四層為routing, 主要實(shí)現(xiàn)節(jié)點(diǎn)尋址和對(duì)象尋址;

          • 第五層為network, 封裝了P2P通訊的連接和傳輸部分。

          站在數(shù)據(jù)的角度來看, 又可以分為2個(gè)大的模塊:

          • IPLD( InterPlanetary Linked Data) 主要用來定義數(shù)據(jù), 給數(shù)據(jù)建模;

          • libp2p解決的是數(shù)據(jù)如何傳輸?shù)膯栴}。

          下面分別介紹IFPS 中的2個(gè)主要部分IPLD 和 libP2P。

          3.1 IPLD

          通過hash 值來實(shí)現(xiàn)內(nèi)容尋址的方式在分布式計(jì)算領(lǐng)域得到了廣泛的應(yīng)用, 比如區(qū)塊鏈, 再比如git repo。 雖然使用hash 連接數(shù)據(jù)的方式有相似之處, 但是底層數(shù)據(jù)結(jié)構(gòu)并不能通用, IPFS 是個(gè)極具野心的項(xiàng)目, 為了讓這些不同領(lǐng)域之間的數(shù)據(jù)可互操作, 它定義了統(tǒng)一的數(shù)據(jù)模型IPLD, 通過它, 可以方便地訪問來自不同領(lǐng)域的數(shù)據(jù)。

          前面已經(jīng)介紹數(shù)據(jù)的邏輯結(jié)構(gòu)是用merkledag表示的, 那么它是如何實(shí)現(xiàn)的呢? 圍繞merkledag作為核心, 它定義了以下幾個(gè)概念:

          • merkle link 代表dag 中的邊

          • merkel-dag 有向無環(huán)圖

          • merkle-path 訪問dag節(jié)點(diǎn)的類似unix path的路徑

          • IPLD data model 基于json 的數(shù)據(jù)模型

          • IPLD serialized format 序列化格式

          • canonical 格式: 為了保證同樣的logic object 總是序列化為一個(gè)同樣的輸出, 而制定的確定性規(guī)則

          圍繞這些定義它實(shí)現(xiàn)了下面幾個(gè)components

          • CID 內(nèi)容ID

          • data model 數(shù)據(jù)模型

          • serialization format 序列化格式

          • tools & libraries 工具和庫(kù)

          • IPLD selector 類似CSS 選擇器, 方便選取dag中的節(jié)點(diǎn)

          • IPLD transformation 對(duì)dag 進(jìn)行轉(zhuǎn)換計(jì)算

          我們知道,數(shù)據(jù)是多樣性的,為了給不同的數(shù)據(jù)建模, 我們需要一種通用的數(shù)據(jù)格式, 通過它可以最大程度地兼容不同的數(shù)據(jù), IPFS 中定義了一個(gè)抽象的集合, multiformat, 包含multihash、multiaddr、multibase、multicodec、multistream幾個(gè)部分。

          3.1.1 multihash

          自識(shí)別hash, 由3個(gè)部分組成,分別是:hash函數(shù)編碼、hash值的長(zhǎng)度和hash內(nèi)容, 下面是個(gè)簡(jiǎn)單的例子:

          這種設(shè)計(jì)的最大好處是非常方便升級(jí),一旦有一天我們使用的hash 函數(shù)不再安全了, 或者發(fā)現(xiàn)了更好的hash 函數(shù),我們可以很方便的升級(jí)系統(tǒng)。

          3.1.2 multiaddr

          自描述地址格式,可以描述各種不同的地址

          3.1.3 multibase

          multibase 代表的是一種編碼格式, 方便把CID 編碼成不同的格式, 比如這里定義了2進(jìn)制、8進(jìn)制、10進(jìn)制、16進(jìn)制、也有我們熟悉的base58btc 和 base64編碼。

          3.1.4 multicodec

          mulcodec 代表的是自描述的編解碼, 其實(shí)是個(gè)table, 用1到2個(gè)字節(jié)定了數(shù)據(jù)內(nèi)容的格式, 比如用字母z表示base58btc編碼, 0x50表示protobuf 等等。

          3.1.5 multistream

          multistream 首先是個(gè)stream, 它利用multicodec,實(shí)現(xiàn)了自描述的功能, 下面是基于一個(gè)javascript 的例子; 先new 一個(gè)buffer 對(duì)象, 里面是json對(duì)象, 然后給它加一個(gè)前綴protobuf, 這樣這個(gè)multistream 就構(gòu)造好了, 可以通過網(wǎng)絡(luò)傳輸。在解析時(shí)可以先取codec 前綴,然后移除前綴, 得到具體的數(shù)據(jù)內(nèi)容。

          結(jié)合上面的部分, 我們重點(diǎn)介紹一下CID。

          CID 是IPFS分布式文件系統(tǒng)中標(biāo)準(zhǔn)的文件尋址格式,它集合了內(nèi)容尋址、加密散列算法和自我描述的格式, 是IPLD 內(nèi)部核心的識(shí)別符。目前有2個(gè)版本,CIDv0 和CIDv1。

          CIDv0是一個(gè)向后兼容的版本,其中:

          • multibase 一直為 base58btc

          • multicodec 一直為 protobuf-mdag

          • version 一直為 CIDv0

          • multihash 表示為cidv0 ::=<multihash-content-address>

          為了更靈活的表述ID數(shù)據(jù), 支持更多的格式, IPLD 定義了CIDv1,CIDv1由4個(gè)部分組成:

          • multibase

          • version

          • multicodec

          • multihash

          IPLD 是IPFS 的數(shù)據(jù)描述格式, 解決了如何定義數(shù)據(jù)的問題, 下面這張圖是結(jié)合源代碼整理的一份邏輯圖,我們可以看到上面是一些高級(jí)的接口, 比如file, mfs, fuse 等。 下面是數(shù)據(jù)結(jié)構(gòu)的持久化部分,節(jié)點(diǎn)之間交換的內(nèi)容是以block 為基礎(chǔ)的, 最下面就是物理存儲(chǔ)了。比如block 存儲(chǔ)在blocks 目錄, 其他節(jié)點(diǎn)之間的信息存儲(chǔ)在leveldb, 還有keystore, config 等。

          3.2 數(shù)據(jù)如何傳輸呢?

          接下來我們介紹libP2P, 看看數(shù)據(jù)是如何傳輸?shù)摹ibP2P 是個(gè)模塊化的網(wǎng)絡(luò)協(xié)議棧。

          做過socket編程的小伙伴應(yīng)該都知道, 使用raw socket 編程傳輸數(shù)據(jù)的過程,無非就是以下幾個(gè)步驟:

          1. 獲取目標(biāo)服務(wù)器地址

          2. 和目標(biāo)服務(wù)器建立連接

          3. 握手協(xié)議

          4. 傳輸數(shù)據(jù)

          5. 關(guān)閉連接

          libP2P 也是這樣,不過區(qū)別在于它把各個(gè)部分都模塊化了, 定義了通用的接口, 可以很方便的進(jìn)行擴(kuò)展

          3.2.1 架構(gòu)圖

          由以下幾個(gè)部分組成,分別是:

          • Peer Routing

          • Swarm (傳輸和連接)

          • Distributed Record Store

          • Discovery

          下面我們對(duì)它們做分別介紹, 我們先看關(guān)鍵的路由部分。

          3.2.2 Peer Routing

          libP2P定義了routing 接口,目前有2個(gè)實(shí)現(xiàn),分別是KAD routing 和 MDNS routing, 擴(kuò)展很容易, 只要按照接口實(shí)現(xiàn)相應(yīng)的方法即可。

          ipfs 中的節(jié)點(diǎn)路由表是通過維護(hù)多個(gè)K-BUCKET來實(shí)現(xiàn)的, 每次新增節(jié)點(diǎn), 會(huì)計(jì)算節(jié)點(diǎn)ID 和自身節(jié)點(diǎn)ID 之間的common prefix, 根據(jù)這個(gè)公共前綴把節(jié)點(diǎn)加到對(duì)應(yīng)的KBUCKET 中, KBUCKET 最大值為20, 當(dāng)超出時(shí),再進(jìn)行拆分。

          更新路由表的流程如下:

          除了KAD routing 之外, IPFS 也實(shí)現(xiàn)了MDNS routing, 主要用來在局域網(wǎng)內(nèi)發(fā)現(xiàn)節(jié)點(diǎn), 這個(gè)功能相對(duì)比較獨(dú)立, 由于用到了多播地址, 在一些公有云部署環(huán)境中可能無法工作。

          3.2.3 Swarm(傳輸和連接)

          swarm 定義了以下接口:

          • transport 網(wǎng)絡(luò)傳輸層的接口

          • connection 處理網(wǎng)絡(luò)連接的接口

          • stream multiplex 同一connection 復(fù)用多個(gè)stream的接口

          下面我們重點(diǎn)看下是如何動(dòng)態(tài)協(xié)商stream protocol 的,整個(gè)流程如下:

          1. 默認(rèn)先通過multistream-select 完成握手

          2. 發(fā)起方嘗試使用某個(gè)協(xié)議, 接收方如果不接受, 再嘗試其他協(xié)議, 直到找到雙方都支持的協(xié)議或者協(xié)商失敗。

          另外為了提高協(xié)商效率, 也提供了一個(gè)ls 消息, 用來查詢目標(biāo)節(jié)點(diǎn)支持的全部協(xié)議。

          3.2.4 Distributed Record Store

          record 表示一個(gè)記錄, 可以用來存儲(chǔ)一個(gè)鍵值對(duì),比如ipns name publish 就是發(fā)布一個(gè)objectId 綁定指定 node id 的record 到ipfs 網(wǎng)絡(luò)中, 這樣通過ipns 尋址時(shí)就會(huì)查找對(duì)應(yīng)的record, 再解析到objectId, 實(shí)現(xiàn)尋址的功能。

          3.2.5 Discovery

          目前系統(tǒng)支持3種發(fā)現(xiàn)方式, 分別是:

          • bootstrap 通過配置的啟動(dòng)節(jié)點(diǎn)發(fā)現(xiàn)其他的節(jié)點(diǎn)

          • random walk 通過查詢隨機(jī)生成的peerID, 從而發(fā)現(xiàn)新的節(jié)點(diǎn)

          • mdns 通過multicast 發(fā)現(xiàn)局域網(wǎng)內(nèi)的節(jié)點(diǎn)

          最后總結(jié)一下源代碼中的邏輯模塊:

          從下到上分為5個(gè)層次:

          • 最底層為傳輸層, 主要封裝各種協(xié)議, 比如TCP,SCTP, BLE, TOR 等網(wǎng)絡(luò)協(xié)議

          • 傳輸層上面封裝了連接層,實(shí)現(xiàn)連接管理和通知等功能

          • 連接層上面是stream 層, 實(shí)現(xiàn)了stream的多路復(fù)用

          • stream層上面是路由層

          • 最上層是discovery, messaging以及record store 等

          四、總結(jié)

          本文從定義數(shù)據(jù)和傳輸數(shù)據(jù)的角度分別介紹了IPFS的2個(gè)主要模塊IPLD 和 libP2P:

          • IPLD 主要用來定義數(shù)據(jù), 給數(shù)據(jù)建模

          • libP2P 解決數(shù)據(jù)傳輸問題

          這兩部分相輔相成, 雖然都源自于IPFS項(xiàng)目,但是也可以獨(dú)立使用在其他項(xiàng)目中。

          IPFS的遠(yuǎn)景目標(biāo)就是替換現(xiàn)在瀏覽器使用的 HTTP 協(xié)議, 目前項(xiàng)目還在迭代開發(fā)中, 一些功能也在不斷完善。為了解決數(shù)據(jù)的持久化問題, 引入了filecoin 激勵(lì)機(jī)制, 通過token激勵(lì),讓更多的節(jié)點(diǎn)加入到網(wǎng)絡(luò)中來,從而提供更穩(wěn)定的服務(wù)。


          近IPFS/Filecoin很火,不是小火,而是大火,引起存儲(chǔ)界一大批人士的關(guān)注。

          也就是在不久之前,以太坊這位虛擬貨幣界的二哥,就曾把官網(wǎng)部署在IPFS之上,除去幫助新生的小老弟站臺(tái)的原因外,大部分原因,就是看好IPFS的特殊技能——永恒存儲(chǔ)。

          畢竟這種既能節(jié)省網(wǎng)站所需數(shù)據(jù)的成本,又能有效防止出現(xiàn)“404”這種尷尬情況出現(xiàn)的操作,實(shí)在是太秀了

          那既然以太坊都可以在IPFS部署官網(wǎng),那么個(gè)人如何在IPFS部署網(wǎng)站呢?


          01

          如何在IPFS托管


          現(xiàn)在一打開網(wǎng)站,就能看到開頭為HTTP的網(wǎng)站地址,這依然是現(xiàn)在流行的HTTP協(xié)議,想要改變這種協(xié)議,讓任何文件都能在完全不同的IPFS顯現(xiàn),跟著小編接下來一起操作。

          1.IPFS 桌面

          如果您已安裝并正在運(yùn)行IPFS Desktop,則可以使用常規(guī)文件選擇器添加文件。只需導(dǎo)入包含您靜態(tài)網(wǎng)站內(nèi)容的目錄即可。

          IPFS CLI

          IPFS CLI允許使用add的命令添加文件和目錄。

          最后一行打印的哈希是整個(gè)目錄的CID,因此也是我們網(wǎng)站的CID。可以看到托管在

          “https://ipfs.io/ipfs/QmeUG2oZvyx4NzfpP9rruKbmV5UNDmTQ8MoxuhTJGVZVTW/”上的示例網(wǎng)站

          提示:

          在您的網(wǎng)站中使用相對(duì)鏈接非常重要,因?yàn)镮PFS網(wǎng)關(guān)的URL類似于<gateway>/ipfs/<cid>/file.ext。


          02

          Pinning


          在最后一節(jié)中,添加的文件可以在我們的 IPFS節(jié)點(diǎn)網(wǎng)絡(luò)中找到,這就是IPFS網(wǎng)關(guān)能夠解析它并將其顯示在瀏覽器中的原因。


          但是,一旦關(guān)閉IPFS daemon,該站點(diǎn)很可能將無法訪問。即使在IPFS上請(qǐng)求了某些內(nèi)容之后,接收節(jié)點(diǎn)也成為該內(nèi)容的主機(jī),但是在12小時(shí)后將對(duì)這些內(nèi)容進(jìn)行收集。那么,如何在沒有服務(wù)器的分散式網(wǎng)站中全天候備份您的網(wǎng)站?


          在IPFS上固定一些內(nèi)容的節(jié)點(diǎn)將永遠(yuǎn)托管它(直到取消pinning它)。諸如Pinata之類的固定服務(wù),可將文件固定在其IPFS節(jié)點(diǎn)上。如此一來,網(wǎng)站將始終可用。

          在Pinata中,如果內(nèi)容已經(jīng)上傳到IPFS,則可以上傳文件或僅提供其哈希值。這是我固定我們上面上傳的示例網(wǎng)站的方式。

          提示:最好使用多種固定服務(wù)固定您的站點(diǎn),以實(shí)現(xiàn)冗余。


          03

          自動(dòng)化部署


          可以借助Fleek這樣的工具,可以幫助自動(dòng)完成上面列出的所有步驟。

          Fleek就像Travis或CircleCi一樣用于IPFS部署。您可以將其Github帳戶與其關(guān)聯(lián),并使用Github掛鉤,F(xiàn)leek將在每次推送至Github存儲(chǔ)庫(kù)時(shí)觸發(fā)部署。他們還固定部署的所有內(nèi)容。

          此外,我使用Hexo生成了此博客,并且能夠在Fleek本身中添加一個(gè)構(gòu)建步驟,因此無需生成HTML并將其推送到我的存儲(chǔ)庫(kù)。這是我使用的構(gòu)建命令:

          • git submodule update --recursive --init && npm i && npm run build

          需要自己安裝的模塊,但是不用擔(dān)心,因?yàn)檫@是非常容易的。

          鏈接到域

          因此,現(xiàn)在我們可以啟動(dòng)并運(yùn)行我們的網(wǎng)站,但是IPFS上的內(nèi)容不像傳統(tǒng)網(wǎng)絡(luò)上那樣容易查找。傳統(tǒng)的網(wǎng)站可以在https://tarunbatra.com上找到。

          但在IPFS上,我們可以通過:“https://ipfs.io/ipfs/QmTPTa1ddoSkuakaW56SaL9dicbC71BbwfjRbVjasshCXs/”訪問當(dāng)前版本。


          04

          DNSLink


          使用 DNSLink,您可以將一個(gè)普通域指向 IPFS 內(nèi)容。它可以很容易地設(shè)置在 Fleek 上。我已經(jīng)將 IPFS .tarunbatra.com 指向了使用 Fleek 的 IPFS 版本,您將能夠打開這個(gè)站點(diǎn)。

          IPNS(星際命名服務(wù))也存在,它類似于 DNSLink,但現(xiàn)在要慢得多。

          做了這些暫時(shí)就能讓網(wǎng)站能稍微初具規(guī)模


          不過雖說IPFS\filecoin能給網(wǎng)站的建立一個(gè)永久性的陣地,但是它的主要作用還是用來存儲(chǔ),主要市場(chǎng)的方向,還是正在逐漸擴(kuò)大的存儲(chǔ)市場(chǎng)。

          不過想要在這個(gè)存儲(chǔ)分上一杯羹或者成為一名filecoin的礦工,除了要盡早布局,還需要不斷的提升自身的競(jìng)爭(zhēng)力。


          主站蜘蛛池模板: 亚洲精品色播一区二区| 女人和拘做受全程看视频日本综合a一区二区视频 | 日韩精品国产一区| 国产在线观看精品一区二区三区91| 无码精品不卡一区二区三区 | 波多野结衣一区二区三区高清在线 | 日韩一区二区三区射精| 亚洲AV无码一区二区乱子伦| 夜夜精品无码一区二区三区| а天堂中文最新一区二区三区| 91精品国产一区二区三区左线| 学生妹亚洲一区二区| 一区二区三区四区免费视频 | 亚洲av乱码一区二区三区按摩| 精品一区二区三区无码免费视频 | 蜜桃视频一区二区三区| 日韩人妻无码一区二区三区99| 一区二区三区精品视频| 免费高清av一区二区三区| 欧美日韩综合一区二区三区| 亚洲伦理一区二区| 亚洲av不卡一区二区三区| 亚洲av片一区二区三区| 国产一区二区三区在线看片| 亚洲国产精品一区二区九九| 在线免费一区二区| 日本高清不卡一区| 国产精品亚洲午夜一区二区三区| 亚洲AV无码一区二区三区DV| 无码人妻一区二区三区免费看| 狠狠色成人一区二区三区| 国产一区二区三区在线2021| 伊人精品视频一区二区三区| 国产在线精品一区二区在线观看| 狠狠做深爱婷婷综合一区 | 无码欧精品亚洲日韩一区夜夜嗨| 国产主播福利精品一区二区| 国产午夜精品一区二区三区嫩草| 国产在线精品一区二区三区直播 | 中文字幕一区日韩在线视频 | 亚洲a∨无码一区二区|