區(qū)塊鏈 | 流行的分布式存儲(chǔ)平臺(tái)Swarm和IPFS分析
談到區(qū)塊鏈和分布式計(jì)算,最重要的是共識(shí)算法(整個(gè)網(wǎng)絡(luò)如何達(dá)成一致的決策)和智能合約(實(shí)現(xiàn)我們?cè)谥行幕澜缰腥粘J褂玫膽?yīng)用)。但是,談及日常應(yīng)用程序,這些屬性還不足以支持當(dāng)今世界的需求。如果我們只依靠上述這兩項(xiàng),就難以想象像在 Netflix 上那樣觀賞喜愛(ài)的電影或電視劇、像在臉書(shū)上那樣存儲(chǔ)或分享值得紀(jì)念的視頻或照片,或在區(qū)塊鏈上玩喜愛(ài)的在線游戲(如 DOTA)。
我們?nèi)鄙僖粋€(gè)強(qiáng)大、安全和去中心化的內(nèi)容存儲(chǔ)以及分發(fā)系統(tǒng),服務(wù)于當(dāng)今的應(yīng)用程序。
下面,我們將探索和評(píng)估一些***的分布式存儲(chǔ)平臺(tái)。
本文為系列文中的《上》篇,主要介紹 Swarm 和 IPFS。系列文的《中》及《下》篇將分別介紹 Sia 和 Storj 以及 MaidSafe。
1.Swarm
狀態(tài):活躍
說(shuō)明:
Swarm 是分布式存儲(chǔ)平臺(tái)和內(nèi)容分發(fā)服務(wù),是以太坊 web3 棧的本地基礎(chǔ)層服務(wù)。Swarm 的主要目標(biāo)是提供充分分散和冗余存儲(chǔ)的以太坊公共記錄,尤其是存儲(chǔ)和分發(fā) DApp 的代碼和數(shù)據(jù)以及區(qū)塊鏈數(shù)據(jù)。從經(jīng)濟(jì)角度來(lái)看,它允許參與者有效匯集他們的存儲(chǔ)容量和帶寬資源,以給網(wǎng)絡(luò)的所有參與者提供這些服務(wù),同時(shí)接受以太坊的激勵(lì)。
目標(biāo)
Swarm 更廣泛的目標(biāo),是為去中心化的 web 應(yīng)用程序(DApp)開(kāi)發(fā)人員提供基礎(chǔ)設(shè)施服務(wù),特別是:消息傳遞、數(shù)據(jù)流、點(diǎn)對(duì)點(diǎn)記賬、可變資源更新、存儲(chǔ)保險(xiǎn)、監(jiān)管掃描和修復(fù)、支付渠道和數(shù)據(jù)庫(kù)服務(wù)。
從終端用戶的角度來(lái)看,Swarm 和萬(wàn)維網(wǎng)的差別不大,除了上傳不托管在特定的服務(wù)器上。Swarm 提供了一個(gè)點(diǎn)到點(diǎn)的存儲(chǔ)和服務(wù)解決方案,它具有 DDos 抗性、零停機(jī)、容錯(cuò)和審查及自我維持的特性,它內(nèi)置了激勵(lì)系統(tǒng),通過(guò)點(diǎn)對(duì)點(diǎn)記賬,允許用戶為交易資源進(jìn)行支付。Swarm 旨在和以太坊的 devp2p 多協(xié)議網(wǎng)絡(luò)層以及以太坊區(qū)塊鏈進(jìn)行深度集成,以進(jìn)行域名解析(利用 ENS)、服務(wù)支付和內(nèi)容可用性保證。
請(qǐng)注意: 為了解析 ENS 域名,Swarm 節(jié)點(diǎn)必須要連接到以太坊區(qū)塊鏈上(主網(wǎng)或測(cè)試網(wǎng))。
概述
Swarm 旨在給新的去中心化互聯(lián)網(wǎng)提供基礎(chǔ)層的基礎(chǔ)設(shè)施。Swarm 是點(diǎn)對(duì)點(diǎn)的節(jié)點(diǎn)網(wǎng)絡(luò),通過(guò)彼此之間貢獻(xiàn)資源(存儲(chǔ)、消息轉(zhuǎn)發(fā)、支付處理)提供分布式數(shù)字服務(wù)。以太坊基金會(huì)運(yùn)作 Swarm 測(cè)試網(wǎng),可以用來(lái)以類似于以太坊測(cè)試網(wǎng)絡(luò)(ropsten)的方式測(cè)試功能。每個(gè)人都可以通過(guò)在自己的服務(wù)器、臺(tái)式機(jī)、筆記本電腦或移動(dòng)設(shè)備上運(yùn)行 Swarm 客戶節(jié)點(diǎn)加入到網(wǎng)絡(luò)中。請(qǐng)參閱 《Swarm 入門(mén)(https://swarm-guide.readthedocs.io/en/latest/gettingstarted.html#getting-started)》一文以了解操作方法。Swarm 客戶端是以太坊棧的一部分,參考實(shí)現(xiàn)是用 golang 編寫(xiě)的,可以在 go-ethereum 存儲(chǔ)庫(kù)中找到它。目前在所有節(jié)點(diǎn)上運(yùn)行的是 POC 0.3 版。
Swarm 提供 本地 HTTP 代理 API,DApp 或命令行工具可以用來(lái)和 Swarm 進(jìn)行交互。像 消息傳遞 這樣的模塊只能基于 PRC-JSON API 才可使用。在測(cè)試網(wǎng)(testnet)上的基礎(chǔ)服務(wù)提供公共網(wǎng)關(guān),用于輕松演示功能和允許免費(fèi)的訪問(wèn),以便人們無(wú)需運(yùn)行任何自己的節(jié)點(diǎn)即可嘗試 Swarm。
Swarm 是 devp2p 網(wǎng)絡(luò)的節(jié)點(diǎn)集合,其中的每個(gè)節(jié)點(diǎn)在同一個(gè)網(wǎng)絡(luò) ID 上運(yùn)行 bzz 協(xié)議套件。
Swarm 節(jié)點(diǎn)也可以連接到一個(gè)(或多個(gè))以太坊區(qū)塊鏈上,以進(jìn)行域名解析,并連接到一個(gè)以太坊區(qū)塊鏈進(jìn)行帶寬和存儲(chǔ)補(bǔ)償。運(yùn)行相同網(wǎng)絡(luò) ID 的節(jié)點(diǎn)應(yīng)該連接到相同的區(qū)塊鏈上以進(jìn)行支付。Swarm 網(wǎng)絡(luò)由其網(wǎng)絡(luò) ID 標(biāo)識(shí),該網(wǎng)絡(luò) ID 是一個(gè)任意整數(shù)。
Swarm 允許上傳(upload)和消失(disappear),這意味著任何節(jié)點(diǎn)可以只上傳內(nèi)容給 Swarm,然后就可以下線。只要節(jié)點(diǎn)沒(méi)有丟失或變得不可用,該內(nèi)容將仍舊可以訪問(wèn),這是因?yàn)橛幸粋€(gè)“同步”的過(guò)程,節(jié)點(diǎn)持續(xù)地在彼此之間傳遞可用數(shù)據(jù)。
公共網(wǎng)關(guān)
Swarm 提供本地 HTTP 代理 API,DApp 可以用來(lái)和 Swarm 進(jìn)行交互。以太坊基金會(huì)在托管公共網(wǎng)關(guān),該網(wǎng)關(guān)允許免費(fèi)訪問(wèn),因此,人們甚至無(wú)需運(yùn)行自己的節(jié)點(diǎn)即可嘗試 Swarm。
Swarm 公共網(wǎng)關(guān)可以在 http://swarm-gateways.net 上找到,上面一直都運(yùn)行著***的 Swarm 穩(wěn)定版。
目前,該網(wǎng)關(guān)只接受限制大小的上傳。將來(lái),上傳到該網(wǎng)關(guān)的功能很可能完全消失。
上傳和下載
數(shù)據(jù)上傳內(nèi)容由這些步驟組成:“上傳”內(nèi)容到本地 Swarm 節(jié)點(diǎn),接著本地 Swarm 節(jié)點(diǎn)用其在網(wǎng)絡(luò)中的對(duì)等點(diǎn)“同步”所生成的數(shù)據(jù)塊。同時(shí),下載內(nèi)容由這些步驟組成:本地 Swarm 節(jié)點(diǎn)查詢?cè)诰W(wǎng)絡(luò)中的對(duì)等點(diǎn)以獲取相關(guān)的數(shù)據(jù)塊,然后在本地重組這些內(nèi)容。
內(nèi)容解析器:ENS
為了解析 ENS 名稱,Swarm 節(jié)點(diǎn)必須連接到以太坊區(qū)塊鏈(主網(wǎng)或測(cè)試網(wǎng))。
ENS 是個(gè)系統(tǒng),Swarm 用它來(lái)實(shí)現(xiàn)以人類可讀的名稱(如 theswarm.eth)引用內(nèi)容。它的操作類似于 DNS 系統(tǒng),把人類可讀的名稱轉(zhuǎn)換成機(jī)器標(biāo)識(shí)符,在此,即你正在引用的內(nèi)容的 Swarm 哈希。通過(guò)注冊(cè)一個(gè)名稱,并把它解析成網(wǎng)站的根清單的內(nèi)容哈希值,用戶可以通過(guò) URL(如 bzz://theswarm.eth/)訪問(wèn)該網(wǎng)站。
目前,主流的瀏覽器(如 Chrome、Firefox 或 Safari)不支持 bzz 協(xié)議。目前,如果要通過(guò)這些瀏覽器訪問(wèn) bzz 協(xié)議,必須使用 HTTP 網(wǎng)關(guān)(如 https://swarm-gateways.net/bzz:/theswarm.eth/)或者使用支持 bzz 協(xié)議的瀏覽器(如 Mist)。
可變資源更新(Mutable Resource Updates)
可變資源更新是 Swarm POC3 上的一項(xiàng) 高度實(shí)驗(yàn)性的功能 。它正在積極開(kāi)發(fā)中,因此,有些東西可能會(huì)有變化。
我們?cè)谶@份指南中已經(jīng)了解到,當(dāng)我們?cè)?Swarm 中改變數(shù)據(jù)時(shí),我們上傳的數(shù)據(jù)所返回的哈希值會(huì)以無(wú)法預(yù)料的方式變化。通過(guò)可變資源更新,Swarm 提供一種內(nèi)置方式,可以對(duì)更改數(shù)據(jù)保持一個(gè)持久的標(biāo)識(shí)符。
為了保持與更改數(shù)據(jù)有相同的指針,常用的方法是利用以太坊命名服務(wù) ENS。但是,ENS 是一個(gè)鏈上功能,它限制了其他地方的功能:
- 每個(gè) ENS 解析器的更新都需要 gas 才能進(jìn)行。
- 更改數(shù)據(jù)不可能比挖出新區(qū)塊的速度更快。
- 正確的 ENS 解析方案要求始終同步到區(qū)塊鏈。
可變資源更新允許我們用非變量標(biāo)識(shí)符來(lái)更改數(shù)據(jù),無(wú)需使用 ENS。利用在創(chuàng)建資源時(shí)獲得的密鑰,可以像普通 Swarm 對(duì)象一樣引用可變資源。
如果同時(shí)使用 ENS 解析器合約和可變資源更新,只需要一個(gè)初始事務(wù)來(lái)注冊(cè) MRU_MAINFEST_KEY。該密鑰將解析到資源的最近版本上(更新該資源不會(huì)改變?cè)撁荑€)。有 3 種和可變資源更新進(jìn)行交互的方法:HTTP API、Golang API 和 Swarm CLI。
注意事項(xiàng):
- 只有創(chuàng)建該資源的私鑰(地址)可以更新它。
- 在創(chuàng)建可變資源時(shí),必須要提供的參數(shù)之一是預(yù)期的更新頻率。這表明該資源多快(以秒計(jì)算)被更新一次。盡管你可以以其他的速率更新該資源,但這么做會(huì)減慢索引該資源的處理過(guò)程。
Swarm 上的加密
在 POC 0.3 中引入了對(duì)稱加密技術(shù),現(xiàn)在可以很容易隨 Swarm up 上傳命令一起使用對(duì)稱加密了。該加密機(jī)制是用來(lái)保護(hù)信息,并使得在處理任何 Swarm 節(jié)點(diǎn)時(shí)都不可讀分塊數(shù)據(jù)。
Swarm 使用 計(jì)數(shù)器模式加密技術(shù) 來(lái)加密和解密內(nèi)容。當(dāng)上傳內(nèi)容到 Swarm 時(shí),該上傳的數(shù)據(jù)被分為 4KB 大小的塊。這些塊都將用獨(dú)立的隨機(jī)生成的加密密鑰來(lái)編碼。這個(gè)加密過(guò)程在本地 Swarm 節(jié)點(diǎn)上發(fā)生,沒(méi)被加密的數(shù)據(jù)不與其他節(jié)點(diǎn)共享。單個(gè)塊(和整個(gè)內(nèi)容)的引用將是編碼數(shù)據(jù)哈希值和加密密鑰的組合。這意味著引用將比標(biāo)準(zhǔn)無(wú)加密的 Swarm 引用長(zhǎng)一些(不是 32 個(gè)字節(jié),而是 64 個(gè)字節(jié))。
當(dāng)你的節(jié)點(diǎn)將你的內(nèi)容的加密塊與其他節(jié)點(diǎn)同步時(shí),它不與其他節(jié)點(diǎn)共享完整的引用(或任何方式的解密密鑰)。這意味著其他節(jié)點(diǎn)無(wú)法訪問(wèn)你的原始數(shù)據(jù),此外,它們也無(wú)法偵測(cè)到同步的塊是否經(jīng)過(guò)加密。
檢索數(shù)據(jù)時(shí),只在本地 Swarm 節(jié)點(diǎn)上將它解密。在整個(gè)檢索過(guò)程中,這些塊以加密的形式遍歷網(wǎng)絡(luò),參與的對(duì)等節(jié)點(diǎn)無(wú)法解密它們。它們只在用于下載的 Swarm 節(jié)點(diǎn)上進(jìn)行解密和重組。
注意事項(xiàng):
- Swarm 支持加密。由于無(wú)法撤銷上傳,因此強(qiáng)烈建議不上傳未加密的敏感和私密數(shù)據(jù)。用戶應(yīng)該避免上傳非法的、有爭(zhēng)議的或不道德的內(nèi)容。
- Swarm 目前即支持加密也支持未加密的 swarm up 命令,通過(guò)使用 --encrypt 參數(shù)來(lái)標(biāo)識(shí)。將來(lái)可能有變化。
- 加密功能是非確定性的(因?yàn)槊總€(gè)上傳請(qǐng)求生成的密鑰是隨機(jī)的),API 的用戶不應(yīng)該依賴結(jié)果的冪等性;這樣,在啟用加密的情況下,同樣的內(nèi)容兩次上傳到 Swarm 所產(chǎn)生的引用是不同的。
PSS
PSS(Postal Service over Swarm,Swarm 上的 Postal 服務(wù))是 Swarm 上的消息傳遞協(xié)議,具有強(qiáng)大的隱私功能。PSS API 通過(guò)在該 API Reference 中所描述的 JSON RPC 接口公開(kāi),我們?cè)谶@里只解釋基本概念和功能。
PSS 仍然是個(gè)實(shí)驗(yàn)性的功能,正在積極開(kāi)發(fā)中,可從 Swarm 的 POC3 開(kāi)始使用。預(yù)計(jì)有些事情會(huì)有所變化。
基礎(chǔ)知識(shí)
通過(guò) PSS,可以發(fā)送消息給 Swarm 網(wǎng)絡(luò)上的任何節(jié)點(diǎn)。消息的路由方式和塊的檢索申請(qǐng)方式一樣。PSS 消息不使用塊哈希引用,而是在覆蓋地址空間中指定目標(biāo),與消息的有效負(fù)載無(wú)關(guān)。如果該目標(biāo)是一個(gè)完整的覆蓋地址就可以將其描述為一個(gè)特定的節(jié)點(diǎn),或者如果它只部分指定其一,則可以描述為鄰居。消息通過(guò) DevP2P 對(duì)等連接使用 forwarding kademlia 算法進(jìn)行轉(zhuǎn)發(fā),forwarding kademlia 算法則通過(guò)使用 kademlia 路由的中繼節(jié)點(diǎn)之間的半***點(diǎn)對(duì)點(diǎn) TCP 連接傳遞消息。在目標(biāo)鄰居內(nèi),該消息利用 Gossip 進(jìn)行廣播。
由于 PSS 消息是加密的,因此,最終收件人可以解密該消息??梢杂梅菍?duì)稱或?qū)ΨQ加密方式進(jìn)行加密。
消息有效負(fù)載通過(guò)接收節(jié)點(diǎn)分發(fā)給消息處理器,并通過(guò) API 分發(fā)給訂閱用戶。
目前,PSS 不保證消息的訂購(gòu)(盡***努力傳遞),也不保證消息的傳遞(也即,不緩存和中繼給離線節(jié)點(diǎn)的消息)。
隱私功能
得益于端到端的加密,PSS 也適合私人通信。
PSS 使用了 forwarding kademlia 算法,對(duì)發(fā)送者進(jìn)行匿名化處理。
利用部分尋址,pss 提供收件人匿名的可調(diào)范圍:目標(biāo)鄰居越多,所顯示的預(yù)期收件人覆蓋地址的前綴越小,就越難識(shí)別真正的收件人。另一方面,由于暗路由(dark routing)效率低,因此在匿名性和消息傳遞延遲及帶寬(還有因此產(chǎn)生的成本)之間需要折衷,而這留給應(yīng)用程序來(lái)選擇。
如果使用 Handshakes 模塊,則提供前向保密。
DApp 注意事項(xiàng)
敏感內(nèi)容一定要加密!對(duì)于加密內(nèi)容,上傳的數(shù)據(jù)是“受保護(hù)的”,也即,只有那些知道對(duì)根塊(文件的 Swarm 哈希值和加密密鑰)引用的人可以訪問(wèn)該內(nèi)容。因?yàn)榘l(fā)布該引用(在 ENS 上或用 MRU)需要一個(gè)額外步驟,只要用戶使用加密,就可以輕松地得到保護(hù),防止粗心地發(fā)布。Swarm 會(huì)刪除沒(méi)有明確受到保護(hù)的內(nèi)容,這是因?yàn)?Swarm 中限制了存儲(chǔ)容量,Swarm 最終會(huì)將這些節(jié)點(diǎn)轉(zhuǎn)到垃圾箱內(nèi) 。
直到實(shí)施存儲(chǔ)保險(xiǎn)(請(qǐng)參 閱路徑圖 以了解更多)之前,測(cè)試網(wǎng)不保證持久保存上傳的內(nèi)容。所有參與的節(jié)點(diǎn)都被視為沒(méi)有任何義務(wù)的自愿服務(wù),以其意愿刪除內(nèi)容。這樣,在激勵(lì)系統(tǒng)運(yùn)行之前,用戶在任何情況下都不應(yīng)該將 Swarm 視作安全存儲(chǔ)介質(zhì)。
Swarm 是 持久數(shù)據(jù)結(jié)構(gòu)(Persistent Data Structure),因此,在 Swarm 中沒(méi)有刪除或移除操作的概念。這是因?yàn)閮?nèi)容被傳播到被激勵(lì)服務(wù)它的 Swarm 節(jié)點(diǎn)。
2. IPFS
狀態(tài):活躍(這是一個(gè)激勵(lì)系統(tǒng),“Filecoin”是不活躍的)
說(shuō)明:
IPFS(Interplanetary File System,星際文件系統(tǒng)),是點(diǎn)對(duì)點(diǎn)(peer-to-peer,簡(jiǎn)稱 p2p)文件共享系統(tǒng),旨在從根本上改變信息在全球范圍內(nèi)的傳播方式。它跟 Swarm 有點(diǎn)類似,或者,我們也可以說(shuō) Swarm 跟 IPFS 有點(diǎn)類似。
IPFS 包含了通信協(xié)議和分布式系統(tǒng)的幾個(gè)創(chuàng)新,它們的組合產(chǎn)生了與眾不同的文件系統(tǒng)。因此,為了理解 IPFS 所要嘗試達(dá)到的廣度和深度,重要的是,理解使其變得可能的技術(shù)突破和所有它在嘗試解決的問(wèn)題。
IPFS 自詡要取代 HTTP。那么,我們來(lái)看看如今互聯(lián)網(wǎng)的工作原理。
簡(jiǎn)而言之,現(xiàn)在的互聯(lián)網(wǎng)是協(xié)議的集合,這些協(xié)議描述了數(shù)據(jù)是如何在整個(gè)網(wǎng)絡(luò)中移動(dòng)的。隨著時(shí)間的推移,開(kāi)發(fā)人員使用著不同的協(xié)議,并在該基礎(chǔ)設(shè)施上構(gòu)建他們的應(yīng)用程序。在這些協(xié)議中,其中一個(gè)是 Web 的骨架,即 HTTP 或超文本傳輸協(xié)議(HyperText Transfer Protocol)。它是由 Tim Berners-Lee 于 1991 年發(fā)明的。
HTTP 是請(qǐng)求 - 響應(yīng)協(xié)議??蛻舳?例如 web 瀏覽器)發(fā)送一個(gè)請(qǐng)求給外部服務(wù)器。該外部服務(wù)器隨后返回一個(gè)響應(yīng)消息,例如,把谷歌的主頁(yè)返回給客戶端。這是位置尋址協(xié)議,這意味著,當(dāng)在瀏覽器中鍵入 google.com 時(shí),它被翻譯成某個(gè)谷歌服務(wù)器的 IP 地址,接著,該服務(wù)器啟動(dòng)請(qǐng)求 - 響應(yīng)周期。
HTTP 的問(wèn)題
假設(shè)你正坐在課堂上,教授要求你訪問(wèn)某個(gè)特定的網(wǎng)站。課堂上的每個(gè)學(xué)生都向該網(wǎng)站發(fā)出請(qǐng)求,并獲得響應(yīng)。這意味著,完全相同的數(shù)據(jù)被單獨(dú)發(fā)送給課堂上的每個(gè)學(xué)生。如果有 100 個(gè)學(xué)生,那么就有 100 個(gè)請(qǐng)求和 100 個(gè)響應(yīng)。很顯示,這不是最有效的方法。理想的話,這些學(xué)生將能夠利用他們的物理位置接近度以更有效地檢索他們所需的信息。
如果網(wǎng)絡(luò)通信線路有問(wèn)題,那么 HTTP 也會(huì)出大問(wèn)題,客戶端就無(wú)法連接服務(wù)器。如果 ISP 發(fā)生中斷、某個(gè)國(guó)家屏蔽了某些內(nèi)容,或者,如果內(nèi)容只是被刪除了或移走了,都會(huì)發(fā)生這樣的事情。在 HTTP web 上到處都有這些類型的斷連。
HTTP 基于位置的尋址模型鼓勵(lì)集中化。這便于信任少數(shù)擁有我們?nèi)繑?shù)據(jù)的應(yīng)用程序,但是,因?yàn)檫@個(gè)原因,在 web 上的大量數(shù)據(jù)被浪費(fèi)了。這也使得這些供應(yīng)商對(duì)我們的信息負(fù)有巨大的責(zé)任以及擁有巨大的權(quán)力(比如臉書(shū))。
HTTP 非常適合加載網(wǎng)站,但是,它不是設(shè)計(jì)用來(lái)傳輸大量的數(shù)據(jù)(像音頻和視頻文件)。這些缺陷可能使得像 Napster(音樂(lè)共享軟件)和 BitTorrent(電影及幾乎任何東西的共享軟件)這些文件共享系統(tǒng)的替代品出現(xiàn)并成功成為主流。
時(shí)間快進(jìn)到 2018 年,按需高清視頻流和大數(shù)據(jù)正變得無(wú)處不在;我們繼續(xù)生產(chǎn) / 消費(fèi)越來(lái)越多的數(shù)據(jù),同時(shí)開(kāi)發(fā)越來(lái)越強(qiáng)大的計(jì)算機(jī)來(lái)處理它們。云計(jì)算中的重大進(jìn)步有助于維持這種轉(zhuǎn)變,但是,用于分發(fā)所有這些數(shù)據(jù)的基礎(chǔ)設(shè)施基本沒(méi)有變化。
解決方案
IPFS 最初是由 Juan Benet 努力構(gòu)建的系統(tǒng),該系統(tǒng)可以快速移動(dòng)版本化科學(xué)數(shù)據(jù)。它是經(jīng)過(guò)互聯(lián)網(wǎng)技術(shù)(DHTs、Git 版本系統(tǒng)和 Bittorrent)綜合測(cè)試的綜合體。它創(chuàng)造了允許交換 IPFS 對(duì)象的 P2P Swarm 。所有的 IPFS 對(duì)象形成了加密身份認(rèn)證的數(shù)據(jù)結(jié)構(gòu)(Merkle DAG),同時(shí),該數(shù)據(jù)結(jié)構(gòu)能夠用于構(gòu)建很多其他數(shù)據(jù)結(jié)構(gòu)?;蛘?,換句話說(shuō),就是:
“IPFS 是個(gè)分布式文件系統(tǒng),它旨在用同一個(gè)文件系統(tǒng)來(lái)連接所有的計(jì)算設(shè)備。在某些方面,這和 Web 最初的目標(biāo)類似,但是,IPFS 事實(shí)上更類似于一個(gè)交換 Git 對(duì)象的 Bittorrent Swarm。IPFS 能夠成為互聯(lián)網(wǎng)新的重要子系統(tǒng)。如果構(gòu)建正確,它能夠補(bǔ)充或取代 HTTP。它能夠補(bǔ)充或取代更多東西。這聽(tīng)起來(lái)很瘋狂。沒(méi)錯(cuò),它的確很瘋狂。”
IPFS 本質(zhì)上是版本化的文件系統(tǒng),能夠接收文件并管理它們,也可以把它們存儲(chǔ)在某個(gè)地方,然后隨著時(shí)間的推移,跟蹤它們的版本。IPFS 也記錄了這些文件在網(wǎng)絡(luò)中的移動(dòng)方式,因此,它也是個(gè)分布式文件系統(tǒng)。
IPFS 有管理數(shù)據(jù)和內(nèi)容在網(wǎng)絡(luò)上移動(dòng)方式的規(guī)則,本質(zhì)上和 Bittorrent 類似。該文件系統(tǒng)層提供了非常有趣的屬性,如:
- 網(wǎng)站是完全分布式的。
- 網(wǎng)站沒(méi)有源服務(wù)器。
- 網(wǎng)站可以完全在客戶端的瀏覽器上運(yùn)行。
- 網(wǎng)站不必和任何服務(wù)器有聯(lián)系。
我們來(lái)看看這些不同的技術(shù)突破是如何協(xié)同工作的。
分布式哈希表(Distributed Hash Tables)
哈希表 是一種數(shù)據(jù)結(jié)構(gòu),它以鍵 / 值對(duì)來(lái)存儲(chǔ)信息。在分布式哈希表(distributed hash tables,簡(jiǎn)稱 DHT)中,數(shù)據(jù)分布在計(jì)算機(jī)網(wǎng)絡(luò)中,以便有效地協(xié)調(diào)以實(shí)現(xiàn)節(jié)點(diǎn)之間的有效訪問(wèn)和查找。
DHT 的主要優(yōu)點(diǎn)在于去中心化、容錯(cuò)和可擴(kuò)展性。節(jié)點(diǎn)無(wú)需中心協(xié)調(diào),系統(tǒng)能夠可靠地運(yùn)作,即使節(jié)點(diǎn)發(fā)生故障或下線,并且,DHT 能夠擴(kuò)展以容納數(shù)百萬(wàn)個(gè)節(jié)點(diǎn)?;谶@些特性,使得 Swarm 比客戶端 - 服務(wù)器結(jié)構(gòu)更具有彈性。
區(qū)塊交換(Block Exchanges)
流行的文件共享系統(tǒng) Bittorrent 能夠成功地協(xié)調(diào)數(shù)百萬(wàn)節(jié)點(diǎn)之間的數(shù)據(jù)傳輸,這是通過(guò)依靠創(chuàng)新的數(shù)據(jù)交換協(xié)議完成的,但是,這只限于種子生態(tài)系統(tǒng)。IPFS 實(shí)現(xiàn)了該協(xié)議的通用版本,稱為 BitSwap,作為任意類型的數(shù)據(jù)市場(chǎng)來(lái)運(yùn)營(yíng)。該市場(chǎng)是 Filecoin 的基礎(chǔ),F(xiàn)ilecoin 是構(gòu)建于 IPFS 之上的 p2p 存儲(chǔ)市場(chǎng)。
Merkle DAG
Merkle DAG 是 Merkle 樹(shù) 和有向無(wú)環(huán)圖(Directed Acyclic Graph,簡(jiǎn)稱 DAG)的混合體。Merkle 樹(shù)確保在 p2p 網(wǎng)絡(luò)上交換的數(shù)據(jù)塊是正確的、沒(méi)有受到損害的和未被修改的。這個(gè)驗(yàn)證是利用 加密哈希 函數(shù)數(shù)據(jù)塊來(lái)完成的。這只是一個(gè)函數(shù),接收輸入,計(jì)算出與輸入相應(yīng)的一個(gè)***的字母數(shù)字字符串(哈希)。對(duì)于給定的哈希值,容易檢查輸入是否能得出同樣的值,但是,難以從哈希值推算出輸入。
單獨(dú)的數(shù)據(jù)塊被稱為“葉節(jié)點(diǎn)”,它們被哈希后,形成“非葉節(jié)點(diǎn)”。這些非葉節(jié)點(diǎn)然后能夠組合在一起進(jìn)行哈希,直到所有的數(shù)據(jù)塊可以用單獨(dú)一個(gè)根哈希值表示。這是更簡(jiǎn)單的概念化方法:
DAG 是一種無(wú)周期拓?fù)湫蛄行畔⒔5姆椒?。DAG 的一個(gè)簡(jiǎn)單例子就是家族樹(shù)。Merkle DAG 基本上是個(gè)數(shù)據(jù)結(jié)構(gòu),其中哈希被用來(lái)在 DAG 中引用數(shù)據(jù)塊和對(duì)象。這創(chuàng)造了一些有用的功能:IPFS 上的所有內(nèi)容能夠被唯一地標(biāo)識(shí),因?yàn)槊總€(gè)數(shù)據(jù)塊有***的哈希值。此外,數(shù)據(jù)是防篡改的,因?yàn)閿?shù)據(jù)的更改會(huì)改變哈希值,如下圖所示:
IPFS 的核心原則是對(duì)生成的 Merkle DAG 上的所有數(shù)據(jù)建模。這種安全功能的重要性簡(jiǎn)直難以用言語(yǔ)來(lái)形容。打個(gè)比方吧,該原則可以保護(hù)價(jià)值數(shù)萬(wàn)億美元的資產(chǎn),可見(jiàn)該想法有多么強(qiáng)大了吧。
版本控制系統(tǒng)
Merkle DAG 結(jié)構(gòu)的另一個(gè)強(qiáng)大的功能是,它允許構(gòu)建分布式版本控制系統(tǒng)(version control system,簡(jiǎn)稱 VCS)。其典型的一個(gè)例子是 GitHub,它允許開(kāi)發(fā)人員輕松地同時(shí)協(xié)作項(xiàng)目。GitHub 上的文件利用 Merkle DAG 存儲(chǔ)和版本化。它允許用戶獨(dú)立復(fù)制和編輯一個(gè)文件的多個(gè)版本,并進(jìn)行存儲(chǔ),稍后可以把編輯過(guò)的版本和原始文件合并。
IPFS 對(duì)數(shù)據(jù)對(duì)象使用類似的模型:只要對(duì)應(yīng)于原始數(shù)據(jù)的對(duì)象和任何新版本都可以訪問(wèn)時(shí),就可以檢索整個(gè)文件歷史。鑒于數(shù)據(jù)塊通過(guò)網(wǎng)絡(luò)進(jìn)行本地存儲(chǔ),并可以***期緩存,這意味著,IPFS 對(duì)象能***存儲(chǔ)。
此外,IPFS 不依賴于對(duì)互聯(lián)網(wǎng)協(xié)議的訪問(wèn)。數(shù)據(jù)可以分布在 覆蓋網(wǎng)絡(luò) 中,覆蓋網(wǎng)絡(luò)只是構(gòu)建在另一個(gè)網(wǎng)絡(luò)上的網(wǎng)絡(luò)。這些功能值得注意,因?yàn)樗鼈兪强箤彶榫W(wǎng)絡(luò)的 核心要素。它可以成為促進(jìn)自由言論以對(duì)抗全球互聯(lián)網(wǎng)審查普及制度的工具,但是,我們也應(yīng)該認(rèn)識(shí)到不良行為者濫用言論的可能性。
自證明的文件系統(tǒng)
我們將要介紹的 IPFS 的***一個(gè)重要組成部分是自證明文件系統(tǒng)(Self-certifying File System,簡(jiǎn)稱 SFS)。它是分布式文件系統(tǒng),無(wú)需請(qǐng)求特殊權(quán)限進(jìn)行數(shù)據(jù)交換。它是“自證明”的,因?yàn)樘峁┙o客戶端的數(shù)據(jù)是通過(guò)文件名來(lái)進(jìn)行身份驗(yàn)證的。結(jié)果就是能夠利用本地存儲(chǔ)的透明度安全地訪問(wèn)遠(yuǎn)程內(nèi)容。
IPFS 以此概念為基礎(chǔ),創(chuàng)建了星際命名空間(InterPlanetary Name Space,簡(jiǎn)稱 IPNS)。它是個(gè) SFS,使用 公鑰加密 以自證明通過(guò)網(wǎng)絡(luò)用戶發(fā)布的對(duì)象。我們之前提到,IPFS 上的所有對(duì)象可以唯一標(biāo)識(shí),但是,這也擴(kuò)展到節(jié)點(diǎn)。網(wǎng)絡(luò)上的每個(gè)節(jié)點(diǎn)有一套公鑰、私鑰和節(jié)點(diǎn) ID,節(jié)點(diǎn) ID 是其公鑰的哈希值。因此,節(jié)點(diǎn)可以使用它們的私鑰來(lái)“簽署”它們發(fā)布的任何數(shù)據(jù)對(duì)象,并利用發(fā)件人的公鑰來(lái)驗(yàn)證該數(shù)據(jù)的真實(shí)性。
以下是對(duì)關(guān)鍵 IPFS 組成部分的快速回顧:
- 通過(guò)分布式哈希表,節(jié)點(diǎn)可以存儲(chǔ)和共享數(shù)據(jù),而無(wú)需中央?yún)f(xié)調(diào)
- IPNS 允許交換的數(shù)據(jù)立即進(jìn)行預(yù)驗(yàn)證,并使用公鑰密碼進(jìn)行驗(yàn)證。
- Merkle DAG 可實(shí)現(xiàn)唯一標(biāo)識(shí)、防篡改和***存儲(chǔ)的數(shù)據(jù)
可以通過(guò) ConsenSys 寫(xiě)的 文章 來(lái)查看網(wǎng)絡(luò)中文件是如何被分發(fā)的更多細(xì)節(jié)(深入了解一下)。另外,還可以查看一下 IPFS 的 白皮書(shū)。
注意事項(xiàng):
- 始終對(duì)敏感內(nèi)容進(jìn)行加密!對(duì)加密的內(nèi)容,上傳的數(shù)據(jù)是“受保護(hù)的”,也即,只有知道對(duì)根哈希值(文件的根哈希值和加密密鑰)引用的人才能訪問(wèn)內(nèi)容。
- IPFS 是 持久性數(shù)據(jù)結(jié)構(gòu),因此,IPFS 中沒(méi)有刪除或移除操作的概念。這是因?yàn)閮?nèi)容被傳播到受激勵(lì)而服務(wù)于它的節(jié)點(diǎn)。
- 無(wú)法保證上傳的數(shù)據(jù)在網(wǎng)絡(luò)上持久地存在。所有參與節(jié)點(diǎn)應(yīng)該被視為沒(méi)有正式義務(wù)的志愿服務(wù),并且可以按照它們的意愿刪除內(nèi)容。因此, 直到任何激勵(lì)系統(tǒng)(Filecoin)正常運(yùn)行之前,用戶不應(yīng)該在任何情況下,把 IPFS 視為安全存儲(chǔ)。
作者簡(jiǎn)介
Vaibhav Saini 是 TowardsBlockchain 的聯(lián)合創(chuàng)始人,TowardsBlockchain 是麻省理工劍橋創(chuàng)新中心孵化的初創(chuàng)公司。他是一位高級(jí)區(qū)塊鏈開(kāi)發(fā)人員,參與多個(gè)區(qū)塊鏈平臺(tái)的工作,其中包括:以太坊、Quorum、EOS、Nano、Hashgraph 以及 IOTA 等等。目前,他是德里 印度理工學(xué)院 二年級(jí)的學(xué)生。
閱讀英文原文:https://hackernoon.com/storagepedia-an-encyclopedia-of-5-blockchain-storage-platform-8aa13c630ace