DAG(有向无环图)易懂介绍(*)

DAG是一种有向无环图数据结构,用于改进区块链的交易处理。在DAG中,新交易需验证两个未验证的交易(tip)。交易到达率和网络延迟会影响DAG结构,高交易到达率可能导致大量并发验证。策略上,新交易可通过概率或超权重策略选择验证的tip。DAG优点包括并发交易和无交易费用,但可能存在安全性和应用局限性,如不支持智能合约,且在小规模网络中需依赖中心化共识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DAG看他的结构挺唬人的,但是原理还是蛮简单的。DAG改变的是传统区块链的数据结构。首先简单介绍一下什么是图。一个图(graph)是由两部分组成:点(vertex)和边(edge)。所谓有向无环图其实就是:有方向的边;这些边在一个图中不会构成一个闭合的环路。
在这里插入图片描述
1. Tip的概念
在DAG中,如图所示,方块(vertex)表示的是一笔笔的交易,而虚线(edge)表示的是验证关系。每一个新加入的交易都需要挑两个没有被验证过的交易来验证这两个交易的合法性。方块6就是还未被验证过的交易,也称为tip。tip是DAG最重要的概念。

2. 交易到达率和网络延迟对DAG的影响
两个网络指标会对DAG的结构有影响,分别是:交易到达率\lambda和网络延迟\tau

我们假设交易到达率\lambda满足泊松过程(Poisson point rocess):其物理意义是在单位时间内有多少交易会到达DAG网络。

那么会存在两种特殊情况

当\lambda=0.1时,DAG就变成了区块链网络,如下图所示。因为新加入的交易只能验证一个未被验证过的tip,例如:新加入的交易11只能验证tip10。
在这里插入图片描述
当\lambda特别大时,且DAG网络只有一个创世区块时,就会发现如下图所示的情况。
在这里插入图片描述
那么为什么交易11不能验证交易1呢?这是因为网络时延\tau的存在,使得交易11不知道1的存在。灰色方块表示的是在网络延迟\tau内到达的数据,从而使得他们互相都不知道彼此的存在,因此不能够进行验证。

3.新交易的Tip选择策略
那么讨论完特殊情况,在一般情况下,一个新加入的交易是如何选择哪一个tip去验证呢?要设计一种策略,防止lazy tip的产生。所谓的lazy tip指的是喜欢验证旧的交易,而不是最近的交易。
在这里插入图片描述
那么有两种思维方式:基于概率的策略和非基于概率的策略。

(2)基于概率的策略
基于概率的策略在白皮书中指的是累积加权随机游走策略(当时实际情况可能会调整)。当一个新交易加入到DAG网络,他需要通过一定的策略来选择验证网络中哪一个最新出现的tip。

具体操作流程为:让一个walker从创世区块开始走,然后根据下一个交易的权重来计算选择概率,就这么不断选择不断走,直到到达tip。例如:Walker 从交易0开始走,他有四个选择(2,3,1,4),根据交易(2,3,1,4)的各自权重来计算其被Walker选择到的概率。

一个交易的权重的计算公式为:1 + 直接或者间接验证过他的交易的数目。如图所示,交易3的权重的计算方式为:1(红色线) +4(交易5 7 8 10)=5
在这里插入图片描述
(2)非基于概率的策略
那么如果不用基于概率的策略,而是采用非基于概率的策略,也就是超权重随机游走策略。其策略思想是:Walker只选择权重最大的交易,而不是以一定的概率来选择概率。这样做的会导致:
在这里插入图片描述
灰色代表的是tips,他会随着时间越积攒越多。

4. DAG的优缺点
根据区块链的不可能三角理论:分布式,安全性,高效性不可能同时兼得。DAG理论上可以实现分布式和高效性,因此安全性可能就会被诟病。

DAG优点:
(1)支持并发交易,所以吞吐量高。
(2)没有交易费用。

DAG缺点:
(1)天生不支持智能合约,限制了其应用场景。
(2)只有当形网络形成一定规模时,DAG才可以安全的被应用。现有的DAG的项目还是暂时采用的中心化的共识策略,因为网络规模不够。
(3)安全性有待验证。

<think>嗯,用户想了解DAG图的概念和实现方式。首先,我需要回忆一下DAG的定义。DAG有向无环图,也就是有方向但没有循环的图。这在数据结构中应该属于图的一种特殊类型。 用户提到了几个引用,比如引用[1]提到DAG用于提升吞吐量,但可能有确认时间的问题。引用[2]讲到了邻接表的存储方式,顶点用数组,边用链表。引用[3]则涉及AOV网和拓扑排序的应用。所以需要结合这些信息来回答。 首先,DAG的基本概念需要解释清楚:有向边,没有环路。然后,实现方式应该包括邻接矩阵和邻接表两种常见方法。根据引用[2],邻接表的具体实现是顶点数组加边链表,这样可以节省空间,尤其适合稀疏图。需要比较邻接矩阵和邻接表的优缺点,比如空间复杂度和查询效率的区别。 应用方面,引用[3]提到的拓扑排序和任务调度是DAG的重要应用,比如编译器的依赖管理或者项目管理中的任务排序。可能还需要提到其他应用,比如数据流分析、版本控制系统中的依赖关系等。 然后,用户可能需要相关的扩展问题,比如如何检测环,或者DAG的存储优化方法。根据引用中的内容,可能需要生成相关问题,比如DAG的应用场景,如何检测环,或者与普通有向图的区别。 要注意回答的结构,先讲概念,再讲实现方式,最后应用场景。确保每个部分都清晰,并且引用对应的引用资料。例如,在邻接表部分提到引用[2]的顶点数组和边链表结构,应用部分提到引用[3]的拓扑排序。 另外,用户可能想知道如何在实际中实现DAG,比如代码结构。可能需要给出邻接表的代码示例,比如顶点和边的结构体定义,或者Python中的类实现。例如,引用[2]中提到顶点表包含index、vertex和edge列表,边表包含到达顶点、下一条边和权值,这些可以作为代码结构的参考。 还需要注意用户提到的系统级指令,比如数学公式用$...$,独立公式用$$...$$,中文回答,生成相关问题。所以回答中如果有公式,比如邻接矩阵的表示,需要用正确的LaTeX格式。例如,邻接矩阵中的元素$a_{ij}$表示边是否存在,可以用$a_{ij} = 1$来表示有边。 总结一下,回答的结构应该是: 1. DAG的概念:定义,有向无环的特性。 2. 实现方式:邻接矩阵和邻接表,各自的优缺点,可能结合引用中的存储结构。 3. 应用场景:拓扑排序、任务调度、数据流等,引用[3]中的AOV网。 4. 代码示例:比如用Python类实现邻接表。 5. 相关问题:如应用场景,环检测,与普通图的区别等。 需要确保每个部分都自然引用对应的引用资料,比如在讲应用时提到引用[3],在存储结构时提到引用[2]。 可能还需要检查是否有遗漏的重要点,比如DAG的拓扑排序算法步骤,或者如何检测环的方法(比如DFS)。虽然用户的问题主要是概念和实现,但相关的问题可能会涉及这些,所以在生成的问题中可以包括这些内容。 总之,需要组织信息,确保准确引用,结构清晰,并且符合用户的格式要求。</think>### DAG图(有向无环图)的概念与实现 #### 一、DAG图概念 **DAG(Directed Acyclic Graph)** 是一种特殊的有向图,其核心特性为: 1. **有向性**:边具有方向,用 $<V_i, V_j>$ 表示从顶点 $V_i$ 指向 $V_j$; 2. **无环性**:图中不存在任何路径使得从某一顶点出发最终回到该顶点[^1]。 DAG常用于描述具有依赖关系的场景,例如任务调度、数据流分析等。其无环特性保证了操作的可终止性,例如在编译优化中依赖关系不会形成死循环[^3]。 --- #### 二、DAG的实现方式 DAG的实现主要基于图的两种经典存储结构:**邻接矩阵**和**邻接表**。 ##### 1. 邻接矩阵 - **原理**:用二维数组 $A[n][n]$ 表示顶点间的连接关系,若存在边 $<V_i, V_j>$,则 $A[i][j] = 1$,否则为 $0$。 - **特点**: - 优点:快速判断两顶点是否相邻,时间复杂度为 $O(1)$; - 缺点:空间复杂度为 $O(n^2)$,不适合稀疏图[^2]。 ##### 2. 邻接表(更常用) - **原理**:由**顶点表**和**边表**组成: - **顶点表**:数组存储顶点信息,每个顶点包含数据域 `vertex` 和指向第一条邻接边的指针; - **边表**:单链表存储顶点的邻接关系,每条边记录目标顶点下标、权值(可选)及下一条边的指针[^2]。 - **代码示例(Python类实现)**: ```python class Vertex: def __init__(self, index, data): self.index = index # 顶点下标 self.data = data # 顶点数据 self.edges = [] # 邻接边列表 class Edge: def __init__(self, target, weight=None): self.target = target # 目标顶点下标 self.weight = weight # 权值(可选) class DAG: def __init__(self): self.vertices = [] # 顶点表 def add_vertex(self, data): new_vertex = Vertex(len(self.vertices), data) self.vertices.append(new_vertex) return new_vertex def add_edge(self, source_idx, target_idx, weight=None): edge = Edge(target_idx, weight) self.vertices[source_idx].edges.append(edge) ``` --- #### 三、DAG的应用场景 1. **拓扑排序(AOV网)** 将工程活动抽象为DAG顶点,边表示活动的依赖顺序,通过拓扑排序生成合理的执行序列[^3]。 $$ \text{拓扑序列需满足:若存在边}<V_i, V_j>\text{,则}V_i\text{在序列中位于}V_j\text{之前} $$ 2. **数据流分析** 编译器利用DAG表示表达式的计算顺序,优化中间代码生成。 3. **版本控制系统** Git通过DAG管理提交历史,确保分支合并的无环性。 --- #### 四、DAG的局限 - **交易确认时间不可预测**:在异步系统中,DAG可能因节点间状态不一致导致交易确认时间不确定[^1]; - **操作顺序不一致**:分布式场景下无法保证所有节点对操作顺序达成一致[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值