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)

IPFS的文件存储模式相关推荐

  1. java ipfs文件存储_原来IPFS是这样存储文件的

    概述 CID 在介绍IPFS存储文件的远离之前,先介绍一个重要的标识--CID(Content-ID),CID是IPFS中用来表示内容的标识,可以用来表示一个文件,也可以用来表示一个文件块.如下所示, ...

  2. 云视通手机下载的文件存储位置_小白版丨IPFS网络怎么存储、下载文件?怎么托管网站?...

    IPFS是一种用于文件存储的对等网络协议,采用的是基于内容的寻址,而非基于位置.这意味着要查找文件,我们不需要知道它在哪里(abc.com/cat.png),而是它包含的内容(QmSNssW5a9S3 ...

  3. Ceph存储的三种模式 部署MDS文件存储 RBD块存储 RGW对象存储

    mds文件存储接口 服务端操作 1. 将监控节点制作成文件系统 我们这里是考虑到虚拟机环境,所以将监控节点制作成文件系统,生产环境中尽量不要这么做. - 在管理端admin节点操作 cd /etc/c ...

  4. android 读取内部存储文件格式,Android中的数据储存之文件存储

    当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互 例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢 ...

  5. android studio 读取内存txt文件_SharedPreference与文件存储

    Android常用数据存储方式有SharedPreferences存储数据(虽然还是属于内部存储).文件存储(内部,外部).SQLite数据库存储.ContentProvider存储数据.网络存储数据 ...

  6. 块存储、文件存储、对象存储这三者和分布式文件存储系统的本质区别

    块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based St ...

  7. Android入门(九)文件存储与SharedPreferences存储

    原文链接:http://www.orlion.ga/578/ Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储.SharedPreference存储以及数据库存储.当然, ...

  8. [ Android 五种数据存储方式之二 ] —— 文件存储数据

    关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. 文件可用来存放大量数据,如文本.图片.音 ...

  9. Redis-序列化和存储模式

    Redis中数据存储模式有2种:cache-only,persistence; • cache-only即只做为"缓存"服务,不持久数据,数据在服务终止后将消失,此模式下也将不存在 ...

最新文章

  1. java输入输出及文件_java输入输出流及文件操作
  2. API for org.eclipse.paho.client.mqttv3
  3. 华为「硬」生生把AI搞出暴力美学
  4. SpringBoot demo初始
  5. bootstrap3中select2的默认值和下拉框的禁用
  6. vue项目,webpack中配置src路径别名及使用
  7. OJ1160: 矩阵的最大值(指针专题)(C语言)
  8. Linux telnet命令
  9. ZOJ 1914 Arctic Network
  10. 7.2.5 dps 测试软件,魔兽世界7.2.5兽王猎DPS有什么改动测试
  11. 查看Jquery版本
  12. 这10个免费电子书网站合集赶紧收藏了!
  13. 南审计算机科学与技术学什么,南京审计大学是几本?是一本、二本还是三本?
  14. # D - Staircase Sequences
  15. 游戏中找CALL的万能方法
  16. 【C语言进阶】C语言实现通讯录
  17. 天载免息股票热点轮动太快
  18. oracle分区注意点,ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项
  19. ROS意外崩掉解决方案
  20. 送给所有程序员的新年祝福新年愿望

热门文章

  1. php获取网页输出,PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)_PHP教程
  2. 【转】VS2005 CTP 版本这个CTP是什么意思
  3. 【转】什么是staging server
  4. GPS/轨迹追踪、轨迹回放、围栏控制
  5. 一步步编写操作系统 48 加载内核1
  6. JS 给某个对象添加专属方法
  7. 【LeetCode - 227】基本计算器 II(栈)
  8. 【Python学习】内置函数(不断更新)
  9. 【EOJ Monthly 2019.02 - D】进制转换(思维,取模,高精度大数)
  10. 【CodeForces - 271B 】Prime Matrix (素数,预处理打表,思维)