DAG(有向无环图)技术
什么是DAG?
DAG的全称为“Directed Acyclic Graph”,中文意思为:有向无环图,它由有限个顶点和“有向边”组成,从任意顶点出发,经过若干条有向边,都无法回到该顶点,这种图就是有向无环图。

DAG 在图论中的本意?
先从区块链说起。如果你有编程知识背景,肯定知道链表的概念,链表就是一条很多节点链接成的一条链,每个节点中包含指向前一个节点的链接。区块链之所以能连成一条链,是因为新区块中有指向上一个区块的指针,所以说区块链的数据结构是一个链表。但是区块链的问题就在于它是一条线,假设一个区块生成的时间是固定的,那么这样一条线的结构就会造成性能瓶颈。因为每隔这个固定时间,只允许有一个区块添加到链上。所以要提升区块链的性能,大概有两个思路,一个是缩短生成一个区块的时间,而对于采用了 DAG 技术的区块链项目,走的就是另外一个思路了,也就是改变数据的结构,让新数据的添加可以平行进行。
DAG 数据结构不是链表,而是 Graph 图。Graph 上有很多节点,也叫做 Vertices 顶点,连接两个节点的叫做 edges 边。链表,Tree ,图是三个复杂度递进的数据结构。链表就是一条有方向的线。Tree 是有分叉的,但是任意两个节点间只有一条路径能到达另外一点,也就是不能形成闭合的图形。而图是可以有闭合的图形的。当然,深入一点说,Tree 也属于 Graph 的一个特例。
区块链中使用 DAG 的基本方式?
- 第一个功能,交易验证。常见的做法是,DAG 项目会要求后发起交易的人必须选择一个或多个之前的交易来验证。DAG 项目中不会把交易打包成区块,这样每个交易就是一个节点,交易之间的指针就是边,交易历史就形成了一个 DAG 。

- 第二个是交易验证。如何有人发恶意交易,出现了各种争端,谁来解决呢?基本的共识思路是通过某种规则选择出几十个见证人,让见证人通过 BFT 协议或者其他规则来见证交易。Byteball 项目规则是选出12个实名制的见证人,IOTA 则采用了一个临时的中心化 Coordinator 机制。
第三个是激励。DAG 类的项目中一般没有挖矿,通常的做法是一次性发行所有币。例如,Nano 项目就是通过在创世账户中直接发放的形式,来一次性发行所有的币的。参与验证的机器会获得代币激励。
DAG技术有什么特点?
- 交易速度快:DAG实现的局部处理和并行结算,可以使得交易速度大幅度提升。
- 拓展性强:因为各个节点,无需等待同步其他的节点数据,使得节点很容易答复延展,因此DAG很适用于物联网类项目。
- 作恶难度更大:相比于链式结构,在DAG图式结构中恶意修改的难度会大很多,因为DAG拥有着很多的出度和入度,假如要修改某一个节点,那么对应的出入度都要进行修改。
DAG的优缺点?
- 优点:最明显的就是高速度零费用。DAG 条件下,交易不会打包成区块。每笔交易都是单独被验证的,所以大量的交易验证都可以并行进行。理论上交易吞吐量是没有上限的。用户互相之间互相验证交易,于是 DAG 项目可以实现0手续费交易。这些优点对于 IOTA 这样的服务物联网的区块链项目是非要必要的,因为 IOTA 要处理的是机器和机器之间的交易,通常都是非常高频和小额的交易,如果过程中再收取手续费,就没法进行了。
- 缺点:DAG 这个思路应该说安全性还是有待验证的,各种安全漏洞不断的被曝出。中心化问题也相对比较严重,这一点从上面提过的几个项目达成共识的方式可以看到。
DAG(有向无环图)技术的更多相关文章
- JavaScript + SVG实现Web前端WorkFlow工作流DAG有向无环图
一.效果图展示及说明 (图一) (图二) 附注说明: 1. 图例都是DAG有向无环图的展现效果.两张图的区别为第二张图包含了多个分段关系.放置展示图片效果主要是为了说明该例子支持多段关系的展现(当前也 ...
- [转帖]算法精解:DAG有向无环图
算法精解:DAG有向无环图 https://www.cnblogs.com/Evsward/p/dag.html DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用 ...
- 算法精解:DAG有向无环图
DAG是公认的下一代区块链的标志.本文从算法基础去研究分析DAG算法,以及它是如何运用到区块链中,解决了当前区块链的哪些问题. 关键字:DAG,有向无环图,算法,背包,深度优先搜索,栈,BlockCh ...
- Python 随即生成DAG(有向无环图)
给校队选拔赛出了道DAG上的背包问题,需要生成DAG数据. 最开始使用的方法是先随机生成再判环,如果有环就重新生成.这种方法得到DAG的概率随着点数和边数的增加而急速降低,为了一个DAG要生成很多次, ...
- [转帖]MerkleDAG全面解析 一文读懂什么是默克尔有向无环图
MerkleDAG全面解析 一文读懂什么是默克尔有向无环图 2018-08-16 15:58区块链/技术 MerkleDAG作为IPFS的核心数据结构,它融合了Merkle Tree和DAG的优点,今 ...
- 拓扑排序-有向无环图(DAG, Directed Acyclic Graph)
条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...
- PGM学习之六 从有向无环图(DAG)到贝叶斯网络(Bayesian Networks)
本文的目的是记录一些在学习贝叶斯网络(Bayesian Networks)过程中遇到的基本问题.主要包括有向无环图(DAG),I-Maps,分解(Factorization),有向分割(d-Separ ...
- Taxi Cab Scheme UVALive - 3126 最小路径覆盖解法(必须是DAG,有向无环图) = 结点数-最大匹配
/** 题目:Taxi Cab Scheme UVALive - 3126 最小路径覆盖解法(必须是DAG,有向无环图) = 结点数-最大匹配 链接:https://vjudge.net/proble ...
- C#实现有向无环图(DAG)拓扑排序
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...
随机推荐
- 论文翻译:2021_Semi-Blind Source Separation for Nonlinear Acoustic Echo Cancellation
论文地址:https://ieeexplore.ieee.org/abstract/document/9357975/ 基于半盲源分离的非线性回声消除 摘要: 当使用非线性自适应滤波器时,数值模型与实 ...
- 初识python: 装饰器
定义: 本质是函数,功能是"装饰"其它函数,即为其他函数添加附加功能原则: 1.不能修改被装饰函数的源代码: 2.不能修改被装饰函数的调用方式实现装饰器知识储备: 1.函数即&qu ...
- Python 国内镜像源
让 python pip 使用国内镜像源 国内镜像源: 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.co ...
- 【填坑往事】使用Rxjava2的distinct操作符处理自定义数据类型去重的问题
最近碰到一个问题,自定义数据类型列表中出现了重复数据,需要去重.处理去重的办法很多,比如借助Set集合类,使用双重循环拿每一个元素和其他元素对比等.这里介绍一种简单而且比较优雅的方式:使用Rxjava ...
- Web发送邮件
1.首先注册一个163邮箱 自己的邮箱地址是xyqq769552629@163.com 登陆的密码是自己设定 使用邮箱发邮件,邮件必须开启pop和smtp服务,登陆邮件 开启SMTP服务,这个时候提示 ...
- Antd使用timePicker封装时间范围选择器(React hook版)
antd中提供了是日期范围选择器及datepaicker封装日期范围选择器的示例,但是没有时间选择范围的组件,这里使用两个timePicker组合一个事件范围选择器,通过disabled属性限定时间可 ...
- git文件管理与索引,深入理解工作原理
前言 这一夜,注定是个不眠之夜,小白和cangls的对话已然进入了白热化.小白孜孜不倦的咨询关于git方面的知识,对索引越来越感兴趣.小白以前存的小电影文件可以进行版本的对比,探索哪个版本画质更好. ...
- 【reverse】逆向5 标志寄存器
[reverse]逆向5 标志寄存器 1.引言 通过一个creak.exe文件的爆破,引出现阶段需要学习的知识 2.标志寄存器 标志寄存器有上图这么多个 记住这几个寄存器的位置和名称 下面是6个状态标 ...
- wordcount报错:org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist:
Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: In ...
- golang中的标准库time
时间类型 time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息.示例代码如下: func main() { current := ...