首先來介紹一下IPFS中使用的Merkle DAG的數(shù)據(jù)結(jié)構(gòu)打厘,圖中1是這種圖的數(shù)據(jù)結(jié)構(gòu)示意圖,這個圖由節(jié)點和鏈接組成贺辰,節(jié)點存儲數(shù)據(jù)及數(shù)據(jù)的下級鏈接關(guān)系户盯,鏈接存儲的是數(shù)據(jù)的Hash值,正因為鏈接是數(shù)據(jù)的Hash值饲化,此數(shù)據(jù)結(jié)構(gòu)才被稱為Merkle DAG莽鸭。
圖中2給出了鏈接的數(shù)據(jù)結(jié)構(gòu),它由3部分組成:Name:下級數(shù)據(jù)的名稱吃靠;Size:下級數(shù)據(jù)的大辛蛘!;Cid:下級數(shù)據(jù)的hash索引巢块,通過該索引可以在IPFS全網(wǎng)查找數(shù)據(jù)礁阁。
圖中3表示節(jié)點的數(shù)據(jù)結(jié)構(gòu),它存儲了所有下級的鏈接數(shù)據(jù)族奢,一個節(jié)點本身的數(shù)據(jù)姥闭,一個全節(jié)點數(shù)據(jù)的封裝之后的數(shù)據(jù),封裝數(shù)據(jù)的方式有多種越走,在IPFS的IPLD相關(guān)源碼中有詳細(xì)描述棚品,這里可以簡單的理解為節(jié)點所有數(shù)據(jù)的一種序列號算法。另外還有就是這個序列化之后的數(shù)據(jù)的HASH值。這個Hash值用來保證數(shù)據(jù)的有效性南片。以上講的比較抽象掺涛,我們通過實例來講解。
上圖中我們創(chuàng)建了一個nbs目錄疼进,其然后再目錄下創(chuàng)建一個文本文件和另一個目錄薪缆,新目錄下也創(chuàng)建了一個文本文件。此目錄結(jié)構(gòu)比較簡單伞广。然后我們通過以下IPFS命令將其上傳到IPFS網(wǎng)絡(luò)中拣帽。
上傳成功之后的界面如上,這個界面清晰的給出了nbs目錄的上傳信息嚼锄。
根據(jù)剛才我們的數(shù)據(jù)結(jié)構(gòu)闡述减拭,nbs目錄的存儲方式如上圖。首先nbs整個目錄會有一個hash值区丑,因為這個目錄下有一個目錄和一個文件拧粪,一次氣links有兩個,這兩個links分別描述了下一個數(shù)據(jù)節(jié)點的名稱沧侥,大小和hash值可霎。本節(jié)點的data僅僅表明此數(shù)據(jù)節(jié)點表示的是一個目錄(CAE=)
接下來是1.txt文件對應(yīng)的節(jié)點數(shù)據(jù),因為它沒有下一級數(shù)據(jù)結(jié)構(gòu)宴杀,因此其links是空數(shù)組癣朗,其data實1.txt文本內(nèi)容的一種編碼之后的數(shù)據(jù)。
一次類推可以得到目錄a和文本2.txt的節(jié)點數(shù)據(jù)和鏈接數(shù)據(jù)旺罢。接下來我們通過IPFS相關(guān)命令來驗證一下數(shù)據(jù)旷余。
上圖是通過IPFS的DAG命令來查詢數(shù)據(jù)和鏈接的信息。你可以發(fā)現(xiàn)扁达,通過hash值加文件或者目錄名稱的方式也可以正確查詢出節(jié)點的相關(guān)信息正卧,也就是說直接通過link中hash或者通過link中name字段都可以查詢出相關(guān)的節(jié)點數(shù)據(jù)。這種方式有點類似于我們訪問網(wǎng)站時罩驻,我們可以通過IP地址訪問網(wǎng)站穗酥,也可以通過域名來訪問網(wǎng)站。這也是為什么Merkle DAG 層被稱作IPFS網(wǎng)絡(luò)協(xié)議架構(gòu)的IP層的原因惠遏。
接下來我們看一下關(guān)于Merkle DAG這一層的相關(guān)接口砾跃,我們僅以Get接口說明其實現(xiàn)邏輯:其部分接口如下圖
上圖中,當(dāng)Merkle DAG層接收到Get命令之后节吮,調(diào)用接口中的Get(cid)方法抽高,該方法會首先根據(jù)Cid信息查找本地存儲的數(shù)據(jù)中是否有相關(guān)的數(shù)據(jù)塊,如果查找失敗透绩,則調(diào)用數(shù)據(jù)交換的GetBlock(Cid)方法來通過網(wǎng)絡(luò)獲取數(shù)據(jù)翘骂,該方法在前面的章節(jié)中已經(jīng)介紹壁熄,不再贅述。
用來實現(xiàn)Merkle DAG的數(shù)據(jù)結(jié)構(gòu)中已經(jīng)定義了一個數(shù)據(jù)交換層的接口對象如下圖
小節(jié)碳竟,本章節(jié)的內(nèi)容比較容易理解草丧,重點是數(shù)據(jù)結(jié)構(gòu)的設(shè)計以及使用方式,在邏輯上并沒有很難實現(xiàn)的地方莹桅,但是卻相對重要昌执,其作用可以媲美TCP/IP協(xié)議的IP層,可見其重要程度诈泼。