Merkle DAG的全称是Merkle Directed Acyclic Graph(默克有向无环图)。它是在Merkle Tree的基础上构建的,Merkle Tree由美国计算机学家Merkle于1979年申请了专利。

Merkle DAG跟 Merkle Tree

Merkle DAG跟Merkle Tree很相似,但不完全一样,Merkle DAG不需要进行树的平衡操作,非叶子节点允许包含数据等。ipfs add命令将从指定的文件中的数据中创建Merkle DAG。遵循unixfs数据格式(protobuf),意味着文件被分解成块,然后使用“链接节点”以树状结构排列,连接在一起,给定文件的“散列”实际上是DAG中根节点的散列。

当文件的内容超过256k或者add的是一个目录时,文件将会被拆分成block存储,并使用link nodes重排列成类似tree的一种结构。如何去理解unixfs数据格式呢,比如自己创建一个block,使用如下命令:

echo "block test" | ipfs block put

自己创建block不能用ipfs cat命令查看,因为ipfs cat查看的基于unixfs data格式的数据。

Merkle DAG的功能

Merkle DAG在功能上与Merkle Tree很大不同,Merkle Tree主要为了验证,例如验证数字签名,以及比特币Merkle Proof;对Merkle DAG而言,主要目的有如下三个:

  • 内容寻址:使用多种哈希来唯一识别一个数据块的内容。
  • 防篡改:方便的检查哈希值来确认数据是否被篡改。
  • 去重:相同内容的数据块有相同哈希值,可去掉重复的数据,节省存储空间。

其中第3条是IPFS系统最为重要的一个特性,在IPFS系统中,每个Blob的大小限制在256KB(暂定为256KB,这个值可以根据实际的性能需求进行修改)以内,那些相同的数据就能通过Merkle DAG过滤掉,只需增加一个文件引用,而不需要占据存储空间。

同时每个节点可以 ipfs pin 某个资源, 将其永久保存在本地, 提高全网的冗余度

默认情况下, 通过 ipfs add 添加的资源是自动固定在本地仓库空间中

数据对象格式

定义Merkle DAG的对象格式,IPFSObject是IPFSde存储结构,限制每个数据大小在256K以内,在IPFSObject对象里,保存两部分,一个是Link,用于保存其他的分块数据的引用,另一个是data为本对象内容。Link主要包含三部分,Link的名字,Hash和Size。Link只是对一个IPFSObject的引用。这样设计的好处是结合Git,Merkle DAG会极大减少存储空间消耗。如果对源文件进行部分修改,那么可能只是对很少的IPFSObject进行了修改,就没必要对全部内容进行读写修改。如下是IPFSObject和Link的数据结构:

type IPFSObject struct{links []IPFSLinkdata []byte
}
type IPFSLink struct{Name stringHash MultihashSize int
}

往期精彩回顾:
区块链知识系列
密码学系列
共识系列
公链调研系列
以太坊系列
EOS系列
智能合约系列
Token系列

IPFS系列 - 默克有向无环图(Merkle DAG)相关推荐

  1. java 有向无环图 树_拓扑排序-有向无环图(DAG, Directed Acyclic Graph)

    条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...

  2. 有向无环图(DAG)的温故知新

    当我们学习数据结构的时候,总是觉得很枯燥,而当我们解决实际问题的时候,又往往因为对数据结构了解的匮乏而束手无策.从问题中来,到问题中去,在某一点上的深入思考并且不断的实践积累,或许是个笨办法,但笨办法 ...

  3. 使用R语言绘制graph:无向图(ug)和有向无环图(dag)

    首先我们需要安装R语言,参考[软件]R语言-3.6.3 安装教程一文,安装完之后我们打开编辑器. 3.5版本之后,source命令不能用了,需要使用Bioconductor的话,我们需要在consol ...

  4. 有向无环图(DAG)技术白话解读

    区块链技术非常热门,但随着越来越多人使用比特币.以太坊等区块链,使得效率低下的问题越来越突出.尤其是2017年6月以来,ICO市场爆炸式增长,人们疯狂的购买以太坊用于投资ICO,导致以太坊网络经常严重 ...

  5. 有向无环图(DAG)可以描述含有公共子式的表达式

    补充: 有向树:如上图 有一个顶点的入度为0 ,其他顶点的入度为1. 定义:满足下列条件的有向图被称为有向树. (1)有且仅有一个结点的入度为0: (2)除树根外的结点入度为1: (3)从树根到任一节 ...

  6. 【笔试/面试】—— 有向无环图(DAG)的最短路径问题(动态规划)

    W:权重图 d[u]:u 到终点的距离 s.t:始点和终点 def dag_sp(W, s, t, d):if s == t:return 0if s not in d:d[s] = min(W[s] ...

  7. 算法精解:DAG有向无环图

    DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...

  8. 有向无环图描述表达式

    有向无环图(DAG) 有向无环图:若一个有向图中不存在环,则称为有向无环图,简称DAG图. DAG描述表达式 解题方法 对比一哈子 练习

  9. 有向无环图中的拓扑排序

    ´有向无环图(DAG),指不存在环的有向图 ´点的入度,指以这个点为结束点的边数 ´点的出度,指以这个点为出发点的边数 ´拓扑序就是对于节点的一个排列使得若(u,v)∈E,那么u在排列中出现的位置一定 ...

最新文章

  1. 2019年4月28日
  2. 实战篇一 python常用模块和库介绍
  3. MySQL高级查询语句
  4. Promise处理前端异步事件
  5. Dynamics版本历史演进及Dynamics 365重要功能介绍
  6. sql 两个表列包含_Oracle数据库扩展语言PL/SQL之运算符
  7. Oracle 以某字段分组,以某字段排序,取前几条
  8. 黑马程序员 Python学习笔记 之 名片管理系统
  9. 北斗导航 | BDS RTK高精度定位算法在形变检测中的应用(算法原理讲解)
  10. 小米原装系统镜像列表
  11. java文件保险柜,java
  12. ligerUi框架简单的表格展示
  13. 手Q游戏中心上线 完美释放娱乐基因
  14. rancher应用商店的使用
  15. 安卓开发(一)快速搭建Android开发环境
  16. 新零售未来的发展趋势怎么样?
  17. Django cms 教程五:添加内容
  18. SATA硬盘和IDE硬盘区别及优劣比较
  19. 初中语文教资,笔试技巧+面试技巧
  20. kali linux adb 安装教程,kali linux 使用scrcpy手机投屏

热门文章

  1. HTML5+CSS3小实例:富有弹性的导航栏标签
  2. 最大后验概率(MAP)- maximum a posteriori
  3. Android S 新特性:应用行为更改
  4. WAS上配置数据源连接失败
  5. android 上午零点格式,Android零点一度的区别——Matrix
  6. 数据库字段类型CHAR和INT
  7. call和calling的用法_英语词汇call的短语及用法
  8. mysql 执行顺序 SQL语句执行顺序分析
  9. 如何用PS制作一个小泡泡呢?
  10. 世界五百强背景,为啥到了保险行业就成了「小公司」?