淺談 | IPFS數(shù)據(jù)存儲原理

鏈存云
鏈存云
IPFS在數(shù)據(jù)存儲方面采用的是分散式的文件存儲,區(qū)別于HTTP協(xié)議的位置尋址,IPFS是基于內(nèi)容尋址,當文件上傳到IPFS節(jié)點存儲時,節(jié)點會對文件進行Merkle DAG(默克爾有向無環(huán)圖)的格式組織分塊存儲,在存儲完畢后,文件將以Merkle DAG的根哈希數(shù)來表示該文件,用戶可以從IPFS構(gòu)建的網(wǎng)絡(luò)中以DHT(分布式哈希表)的方式獲取文件。

01.IPFS對于數(shù)據(jù)存儲的解決方案

IPFS在數(shù)據(jù)存儲方面采用的是分散式的文件存儲,區(qū)別于HTTP協(xié)議的位置尋址,IPFS是基于內(nèi)容尋址,當文件上傳到IPFS節(jié)點存儲時,節(jié)點會對文件進行Merkle DAG(默克爾有向無環(huán)圖)的格式組織分塊存儲,在存儲完畢后,文件將以Merkle DAG的根哈希數(shù)來表示該文件,用戶可以從IPFS構(gòu)建的網(wǎng)絡(luò)中以DHT(分布式哈希表)的方式獲取文件。

此外,在數(shù)據(jù)存儲架構(gòu)上,IPFS還采用了CID字庫技術(shù)來驗證數(shù)據(jù)的重復(fù)性,此功能將會有助于對IPFS網(wǎng)絡(luò)進行重復(fù)數(shù)據(jù)的刪除,確保存儲在網(wǎng)絡(luò)上的數(shù)據(jù)唯一性,因此,具有相同內(nèi)容的文件是無法提交兩次。

這樣的數(shù)據(jù)存儲架構(gòu)在一定程度上不僅能優(yōu)化存儲要求,還可以提高整個網(wǎng)絡(luò)性能。

2345截圖20200908083720.png

注*什么是默克爾樹

默克爾樹(或簡單的“哈希樹”)是一種數(shù)據(jù)結(jié)構(gòu),其中每一個節(jié)點被散列。在默克爾樹中,節(jié)點通過其內(nèi)容地址(哈希)指向其他節(jié)點。(請記住,當我們通過加密哈希來運行數(shù)據(jù)時,我們會獲得一個我們可以認為是鏈接的“哈希”或“內(nèi)容地址”,因此默克爾樹是鏈接節(jié)點的集合。)如前所述,所有內(nèi)容地址對于它們表示的數(shù)據(jù)都是唯一的。在上圖中,node E包含對node F和的哈希的引用node G。這意味著的內(nèi)容地址(哈希)對于node E包含這些地址的節(jié)點是唯一的。迷路?讓我們將其想象為一組目錄或文件夾。如果在包含子目錄F和G的情況下通過哈希算法運行目錄E,則返回的內(nèi)容派生哈希將包含對這兩個目錄的引用。如果我們刪除目錄G,就像Grace從她的小貓照片中刪除該胡須一樣。目錄E不再具有相同的內(nèi)容,因此將獲得一個新的哈希。構(gòu)建上面的樹后,根節(jié)點的最終內(nèi)容地址(哈希)對于一棵樹是唯一的,該樹包含該樹下所有節(jié)點。如果任何節(jié)點中的數(shù)據(jù)甚至要改變一個字節(jié),那么更改后的節(jié)點的哈希值就會改變,其所有父節(jié)點的哈希值也會改變。

02.IPFS文件存儲分發(fā)具體實現(xiàn)過程

IPFS數(shù)據(jù)存儲共有8個組合:節(jié)點身份、Pinning(固定CID的管理器)、Blockstore、BaseBlocks、GCLocker、Blocks、Merkle DAG、DHT。

每個節(jié)點采用nodeID作為身份識別,節(jié)點存儲著公鑰和加密過的私鑰,技術(shù)上使用基于S/Kademlia和Coral的分布式松散哈希表DSHT來尋找匹配的節(jié)點和特定節(jié)點的地址信息,小值(等于或小于1KB)直接存儲在DHT上生成一個NodeID,對于更大的值,IPFS會拆成小塊,DHT存儲擁有這些塊的節(jié)點NodeIds。

數(shù)據(jù)交換使用基于BitTorrent的BitSwap協(xié)議來發(fā)送和接收分布式數(shù)據(jù)區(qū)塊。BitSwap維持著兩個列表,想要獲得的塊和已保存的塊。但與BitTorrent不同的是,BitSwap不限于一個torrent中的塊。BitSwap節(jié)點可以從整個IPFS網(wǎng)絡(luò)獲取所需的塊,而不管這些塊屬于哪些文件,這大大提高了下載效率。同時,網(wǎng)絡(luò)中存在一些激勵節(jié)點會主動緩存和傳播稀有的文件片段。

DHT和BitSwap技術(shù)讓IPFS形成一個用于快速而強大的存儲和分發(fā)塊的P2P系統(tǒng)。在此之上,IPFS還構(gòu)建了一種有向無環(huán)圖Merkle DAG,使用嵌入數(shù)據(jù)源中的目標哈希散列構(gòu)建對象之間的鏈接。Merkle DAGs為IPFS提供了許多有用的屬性,包括:

1.內(nèi)容尋址:所有內(nèi)容都由其多哈希校驗和進行獨立標識

2.防篡改:所有內(nèi)容都使用其校驗和進行驗證。如果數(shù)據(jù)被篡改或損壞,IPFS則會檢測到該數(shù)據(jù)。

3.去冗余:所有內(nèi)容完全相同的對象,只存儲一次。

IPFS并不會要求每一個節(jié)點都存儲所有的內(nèi)容,節(jié)點的所有者可以自由選擇想要維持的數(shù)據(jù),在備份了自己的數(shù)據(jù)之外,自愿的為其他的關(guān)注的內(nèi)容提供服務(wù)。

THEEND

最新評論(評論僅代表用戶觀點)

更多
暫無評論