IPFS是如何進行文件存儲的
- IPFS采用的索引結構是DHT(分布式哈希表),數據結構是MerkleDAG(Merkle有向無環圖)
DHT(分布式哈希表)
- 參考鏈接
?MerkleDAG(Merkle有向無環圖)
- 參考鏈接
MerkleDAG功能
- 內容尋址:使用多重哈希來唯一識別一個數據塊的內容
- 防篡改:可以方便的檢查哈希值來確認數據是否被篡改,如果數據被篡改或損壞,IPFS會檢測到
- 去重:由于內容相同的數據塊哈希是相同的,可以很容去掉重復的數據,節省存儲空間
?IPFS的單文件存儲
步驟
- 1、把單個文件拆分成若干個256KB大小的塊(block);
- 2、逐塊(block)計算blockhash,hashn=hash(blockn);
- 3、把所有的blockhash拼湊成一個數組,再計算一次hash,便得到了文件最終的hash,hash(file)=hash(hash1……n),并將這個hash(file)和blockhash數組“捆綁”起來,組成一個對象,把這個對象當做一個索引結構;
- 4、把block,索引結構全部上傳給IPFS節點,文件便同步到了IPFS網絡了;
注意
- 小文件(小于1KB)的文件,IPFS會把數據內容直接和Hash(索引)放在一起上傳給IPFS節點,不會再額外的占用一個block的大小
- 如果對于大的文件進行數據的追加操作,僅僅是新增1KB的數據,也需要重新上傳嗎?事實并非如此,IPFS在儲存數據的時候,同一份數據只存儲一次,文件是分塊(block)存儲的,hash相同的block,只會存儲一次,也就說,前面1G的內容沒有發生改變,其實IPFS并不會為這些數據分配新的空間,只會為最后1K的數據分配一個新的block,再重新上傳hash,實際占用的空間是:1G+1K;
- 即使是不同文件的相同部分也僅僅會存儲一份,比如電影資源的影音部分相同,但是只有字幕部分不一樣,那么不同的字幕會和音影資源拼接,形成新的文件資源。這樣一來就可能會有很多文件的索引指向同一個block,就構成了前面提到的一個數據結構——MerkleDAG。
參考鏈接
- DHT 分布式哈希表
- Merkle trees and directed acyclic graphs (DAG)
?