IPFS的檔案儲存模式

2020-10-21 12:00:36

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。

參考連結