什么是DAG,DAG應(yīng)該歸類到區(qū)塊鏈里面嗎?
最近有人問DAG相關(guān)的東西,今天就來說說關(guān)于DAG的話題,DAG是一個(gè)數(shù)據(jù)結(jié)構(gòu)名詞,有項(xiàng)目用了這種復(fù)雜的結(jié)構(gòu)來存儲(chǔ)交易數(shù)據(jù),本文只能粗略探討一下
如果你還記得大學(xué)開設(shè)的《數(shù)據(jù)結(jié)構(gòu)》科目,DAG出現(xiàn)在那本書的最后一章“圖論”中,圖應(yīng)該是最復(fù)雜的數(shù)據(jù)結(jié)構(gòu)了,所以當(dāng)時(shí)我們學(xué)校并沒有教最后一章,只是讓感興趣的人自學(xué),由于后來的工作中最多用到B+樹,對(duì)于圖的學(xué)習(xí)只是停留在表面,只是記得存儲(chǔ)圖最好的方式是采用“鄰接多重表”這種結(jié)構(gòu)。
什么是DAG圖和樹一樣,是一種數(shù)據(jù)結(jié)構(gòu),在計(jì)算機(jī)科學(xué)中往往為了避免復(fù)雜的數(shù)據(jù)結(jié)構(gòu)影響開發(fā)和數(shù)學(xué)建模會(huì)將結(jié)構(gòu)進(jìn)行簡(jiǎn)化或者約束,比如“樹”這種結(jié)構(gòu)其實(shí)根據(jù)定義也是很復(fù)雜的,當(dāng)時(shí)真正用的時(shí)候“二叉樹”用的最廣泛,二叉樹就是規(guī)定一個(gè)根只能有兩個(gè)葉子。
所以在圖論中,為了簡(jiǎn)化這種結(jié)構(gòu),分為有向圖和無向圖兩大類,在無向圖中進(jìn)一步進(jìn)行約束形成了DAG(有向無環(huán)圖),所謂無環(huán)是指它是由集合的頂點(diǎn)和有向邊構(gòu)成,每條邊連接一個(gè)頂點(diǎn)到另一個(gè),這樣,在一些頂點(diǎn)v開始,沿著有序的邊,最終循環(huán)回再次到V是不可能的,其實(shí)圖是樹的一種泛化,真正在用的時(shí)候一般會(huì)通過深度優(yōu)先或者廣度優(yōu)先規(guī)則把圖拆成“森林”就是多顆“樹”,而DAG圖由于規(guī)則的定義更容易拆成一顆“樹”,這也就是為什么圖有很多種,而DAG應(yīng)用最為廣泛的原因。
上圖從左到右分別是二叉樹、DAG圖、和普通有向圖的圖例,可以在最右側(cè)的圖明顯看到存在一個(gè)“環(huán)”,此圖可以非常容易的理解什么叫DAG圖了。
DAG與區(qū)塊鏈目前采用DAG作為存儲(chǔ)結(jié)構(gòu)的代表項(xiàng)目有dagcoin、Byteball、Iota,我看過前兩個(gè)的白皮書,dagcoin和byteball白皮書在DAG部分完全一致看其中一個(gè)即可,很多人說采用了DAG已經(jīng)不屬于區(qū)塊鏈了,因?yàn)閭鹘y(tǒng)區(qū)塊鏈采用“鏈”式結(jié)構(gòu),其實(shí)傳統(tǒng)區(qū)塊鏈中存在多條鏈的分支更類似一棵樹,而最終確認(rèn)的是最長(zhǎng)鏈,也就是在樹的結(jié)構(gòu)中找到一條合法的鏈而已。
而采用了DAG結(jié)構(gòu)的項(xiàng)目,為了避免雙花問題,還是有所謂的”主鏈“概念,其實(shí)就是經(jīng)過見證人認(rèn)定的最短路徑了,所以我認(rèn)為DAG還是應(yīng)該歸類到區(qū)塊鏈范疇,其本質(zhì)沒有大的改變,只是采用了DAG結(jié)構(gòu),效率更好,對(duì)于沒有”異議“的交易,可以采用DAG進(jìn)行打包,Byteball將其定義為”球“,圖論中有詳細(xì)的描述,也是為了減少?gòu)?fù)雜度,如下圖:
相比傳統(tǒng)鏈?zhǔn)浇Y(jié)構(gòu),采用DAG面臨的雙花問題會(huì)非常復(fù)雜,根據(jù)Byteball的描述,采用了見證人主鏈概念,維持一條公認(rèn)的主鏈作為憑證,而其他分支只要不和主鏈沖突都可以視為有效交易,我個(gè)人認(rèn)為采用DAG并不能減少目前區(qū)塊鏈面臨的存儲(chǔ)空間問題,當(dāng)然DAG可以提升效率,由于其數(shù)據(jù)結(jié)構(gòu)非常復(fù)雜,對(duì)編碼要求更高,安全性有待觀察,對(duì)于算力攻擊問題,我有個(gè)擔(dān)憂,希望與DAG研究深入的人交流,就是傳統(tǒng)鏈?zhǔn)浇Y(jié)構(gòu),你必須保持持續(xù)的算力優(yōu)勢(shì)才能更改交易,否則最終長(zhǎng)鏈可以將短期算力優(yōu)勢(shì)形成的鏈廢掉,但是采用DAG分塊的方式,你只需要在一定時(shí)間內(nèi)的算力保持優(yōu)先形成一個(gè)DAG塊,那么是不是今后所有的交易都會(huì)繼承這個(gè)錯(cuò)誤呢?
區(qū)塊鏈最讓人感興趣的地方就是不斷的創(chuàng)新和敢于利用新技術(shù),當(dāng)然就數(shù)據(jù)結(jié)構(gòu)理論從70年代以來基本上沒有什么變化,只是傳統(tǒng)的軟件項(xiàng)目很少利用到這些理論,計(jì)算機(jī)圖形學(xué)是我看到的利用復(fù)雜數(shù)據(jù)結(jié)構(gòu)最多的地方,而且商業(yè)項(xiàng)目能用到B+樹已經(jīng)是極限了,而區(qū)塊鏈的發(fā)展讓人驚喜,理論聯(lián)系實(shí)際的好榜樣!
最后說一句,區(qū)塊鏈技術(shù)終究是計(jì)算機(jī)技術(shù)的一種,沒有必要將其神話,所有的結(jié)構(gòu)和實(shí)現(xiàn)都可以在《數(shù)據(jù)結(jié)構(gòu)》本科教材中找到,但是要靈活運(yùn)用在業(yè)務(wù)場(chǎng)景中,需要取舍和經(jīng)過實(shí)踐檢驗(yàn)。