我们知道,区块链技术是一种链式数据库结构,每个区块就像铁链一样,环环相扣。DAG其实与数组、排列、区块链一样,也是一种数据结构。
但与区块链不同,DAG将最长链共识改成最重链共识。传统区块链上,新发布的区块会加入到原先的最长链之上,并且以所有节点都认为最长的链为准,依次无限蔓延。而DAG中,每个新加入的单元,不仅仅只加入到长链里的一个区块,而是加入到之前的所有区块。假设当你发布新交易时,前面有两个有效区块,那么你的区块会主动同时链接到前面两个之中,DAG 中的每个新单元,验证并确认其父单元,以及父单元的父单元,慢慢可达创世单元,并将其父单元的哈希包含到自己的单元里面。随着时间递增,所有交易的区块链相互连接,形成图状结构,如若要更改数据,那就不仅仅是几个区块的问题了,而是整个区块图的数据更改。DAG这个模式相比来说,要进行的复杂度更高,更难以被更改。下图是一个网状的DAG结构:
最著名的应用DAG技术的项目是IOTA,IOTA改进了DAG,并提出了Tangle(缠绕)方案。即要验证新的交易前,只要直接验证之前的两个交易,这也使得在这两个交易之前所有被验证过的交易得到间接验证。在IOTA的Tangle中,有一个权重积分的概念,所谓权重积分是指它自身的权重与它验证过的所有交易的自身权重之和。在DAG 结构中,交易总是自己创建并发布。从理论上看,攻击者总是可以建构比它要推翻掉的那个交易权重更高的交易用以双花。
在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个有向无环图。
图和树一样,都是一种数据结构,图可以分为有向图和无向图,对有向图进一步约束则形成有向无环图,有向图由有限个顶点和有向边组成,每条有向边都从一个顶点指向另一个顶点,无环则指的是从任意一个顶点出发都不能通过这些有向边回到原来的顶点。
因为有向图中一个点经过两种路线到达另一个点未必形成环,因此有向无环图未必能转化成树,但任何有向树均为有向无环图。
在XDAG的网络中,其实是一个个动态的“局域网”的组合,所有的交易用户隶属于不同的“局域网”,不同的“局域网”联合起来构成整个XDAG的网络。“局域网”建立的基础是具有验证交易(挖矿)能力的节点(这个节点可以是单个矿工,也有可能是矿场或矿池),当用户发起交易时,会将交易发送到自己所在“局域网”的矿工,矿工会验证数字签名、资产余额、数据格式、数据完整性等信息,当遇到无效交易后,便会进行标记,然后矿工会打包确认好的信息并向全网发送,其他“局域网”的矿工收到后会验证自己收到的这个数据包是不是合法的,如果都没有问题,那么这些交易就会被承认。
在XDAG的网络,主节点组成主链,主链是所有节点难度加和最高的一条。和比特币网络一样,所有的交易都需要排序,那么也就是所有的节点是需要排序的,主节点的功能就是确定顺序,除此之外,主节点还负责记录挖矿收益,在XDAG中,每64s出一个块,出块同时奖励矿工1024个xdag,但是主节点不记录其他任何交易,因此可以将主节点看成是一个空块,而其他的节点才负责记录交易。主节点的产生需要挖矿,交易节点是系统自动生成。
DAG相比于区块链来说,其实是图和链的区别,对于链而言,无法只处理一个局部,因为链的入度和出度只有一个,不能把链上的节点拆成好几个节点去处理,但是对于图却可以,因为图可以有多个出度,那么可以同时处理多个出度连接的节点。
对于链式网络而言,不是节点的处理能力不强,只是链式结构不能并行计算,浪费的时间其实主要为等待时间:一个是发起交易,需要将交易同步所有节点,另一个是当有一个节点确认,需要向全网同步。对于DAG而言则不存在这样的问题,钱包发起交易时不需要等待自己之前有多少交易,只需要经历局部校验、全网广播、其他局部校验,相当于是把交易确认分散化,每一个节点都在做类似于拼图的工作,把自己的和别人确认的交易拼接起来。
交易速度快
DAG实现的局部处理和并行结算可以使得交易速度大幅度提升。
拓展性强
因为各个节点无需等待同步其他的节点的数据就可计算使得记账节点很容易答复延展,因此DAG很适用于物联网类项目,例如机器微支付。
作恶难度更大
相比于链式结构,在DAG中恶意修改的难度会大很多,因为DAG拥有着很多的出度和入度,假如要修改某一个节点,那么对应的出入度都要进行修改。
尽管在前文中阐述了诸多DAG的优点,但事实上,DAG也有自身的缺陷,DAG类项目也在各自使用不同的技术手段进行解决。
交易时长不可控
DAG本质是一种异步通讯,异步通讯所带来最大的问题在于一致性不可控,在DAG模型中则在于交易确认时间完全未知。当然,某种程度上同样可以认为在链式模型中,一个区块被超过2/3以上节点数接受才算全网最终确认,因此最终确认时间同样无法准确判断。针对以上问题,XDAG采用了POW+64s固定出块的方式。
网络传输数据量大幅度增加
链式结构中仅仅账本节点记账,大量的钱包节点仅仅向一个账本节点通讯即可,因此全网络账本节点的数量远远小于钱包节点。在这种情况下,所有的数据同步均在账本节点之间完成,假设网络中有M个账本节点,每一条记录在网络中传输的次数为M+1。
DAG结构,在全网存在N个设备节点时(N成千上万倍大于M),每一个消息都需要在设备间进行点对点通讯,因此对于任何消息的发送,网络中都会存在N^2次数据发送(每一个节点都尝试将信息发送给其他邻居节点)。在未来DAG接入大量的物联网节点后,这会对于记账节点产生很高的要求。
影子链攻击
DAG 允许多重并行交易的特征,导致攻击者可能暗中生成一条影子链,并且时不时地将影子链跟主链进行对接以逃避检测算法。极端情况下,这条影子链有可能代替主链成为全网的共识。XDAG本身机制决定了不会出现影子链攻击,Byteball则是通过见证人模式来解决。
智能合约开发难度大
DAG的异步操作使得在运行智能合约时,节点间所存储的数据在运行一段时间后可能出现偏差,从现实情况来看,目前还没有能真正基于DAG网络开发出智能合约的项目。