什么是DAG,DAG应该归类到区块链里面吗?
扫描二维码
随时随地手机看文章
最近有人问DAG相关的东西,今天就来说说关于DAG的话题,DAG是一个数据结构名词,有项目用了这种复杂的结构来存储交易数据,本文只能粗略探讨一下
如果你还记得大学开设的《数据结构》科目,DAG出现在那本书的最后一章“图论”中,图应该是最复杂的数据结构了,所以当时我们学校并没有教最后一章,只是让感兴趣的人自学,由于后来的工作中最多用到B+树,对于图的学习只是停留在表面,只是记得存储图最好的方式是采用“邻接多重表”这种结构。
什么是DAG图和树一样,是一种数据结构,在计算机科学中往往为了避免复杂的数据结构影响开发和数学建模会将结构进行简化或者约束,比如“树”这种结构其实根据定义也是很复杂的,当时真正用的时候“二叉树”用的最广泛,二叉树就是规定一个根只能有两个叶子。
所以在图论中,为了简化这种结构,分为有向图和无向图两大类,在无向图中进一步进行约束形成了DAG(有向无环图),所谓无环是指它是由集合的顶点和有向边构成,每条边连接一个顶点到另一个,这样,在一些顶点v开始,沿着有序的边,最终循环回再次到V是不可能的,其实图是树的一种泛化,真正在用的时候一般会通过深度优先或者广度优先规则把图拆成“森林”就是多颗“树”,而DAG图由于规则的定义更容易拆成一颗“树”,这也就是为什么图有很多种,而DAG应用最为广泛的原因。
上图从左到右分别是二叉树、DAG图、和普通有向图的图例,可以在最右侧的图明显看到存在一个“环”,此图可以非常容易的理解什么叫DAG图了。
DAG与区块链目前采用DAG作为存储结构的代表项目有dagcoin、Byteball、Iota,我看过前两个的白皮书,dagcoin和byteball白皮书在DAG部分完全一致看其中一个即可,很多人说采用了DAG已经不属于区块链了,因为传统区块链采用“链”式结构,其实传统区块链中存在多条链的分支更类似一棵树,而最终确认的是最长链,也就是在树的结构中找到一条合法的链而已。
而采用了DAG结构的项目,为了避免双花问题,还是有所谓的”主链“概念,其实就是经过见证人认定的最短路径了,所以我认为DAG还是应该归类到区块链范畴,其本质没有大的改变,只是采用了DAG结构,效率更好,对于没有”异议“的交易,可以采用DAG进行打包,Byteball将其定义为”球“,图论中有详细的描述,也是为了减少复杂度,如下图:
相比传统链式结构,采用DAG面临的双花问题会非常复杂,根据Byteball的描述,采用了见证人主链概念,维持一条公认的主链作为凭证,而其他分支只要不和主链冲突都可以视为有效交易,我个人认为采用DAG并不能减少目前区块链面临的存储空间问题,当然DAG可以提升效率,由于其数据结构非常复杂,对编码要求更高,安全性有待观察,对于算力攻击问题,我有个担忧,希望与DAG研究深入的人交流,就是传统链式结构,你必须保持持续的算力优势才能更改交易,否则最终长链可以将短期算力优势形成的链废掉,但是采用DAG分块的方式,你只需要在一定时间内的算力保持优先形成一个DAG块,那么是不是今后所有的交易都会继承这个错误呢?
区块链最让人感兴趣的地方就是不断的创新和敢于利用新技术,当然就数据结构理论从70年代以来基本上没有什么变化,只是传统的软件项目很少利用到这些理论,计算机图形学是我看到的利用复杂数据结构最多的地方,而且商业项目能用到B+树已经是极限了,而区块链的发展让人惊喜,理论联系实际的好榜样!
最后说一句,区块链技术终究是计算机技术的一种,没有必要将其神话,所有的结构和实现都可以在《数据结构》本科教材中找到,但是要灵活运用在业务场景中,需要取舍和经过实践检验。