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)