我們知道,區(qū)塊鏈技術(shù)是一種鏈?zhǔn)綌?shù)據(jù)庫結(jié)構(gòu),每個區(qū)塊就像鐵鏈一樣,環(huán)環(huán)相扣。DAG其實(shí)與數(shù)組、排列、區(qū)塊鏈一樣,也是一種數(shù)據(jù)結(jié)構(gòu)。
但與區(qū)塊鏈不同,DAG將最長鏈共識改成最重鏈共識。傳統(tǒng)區(qū)塊鏈上,新發(fā)布的區(qū)塊會加入到原先的最長鏈之上,并且以所有節(jié)點(diǎn)都認(rèn)為最長的鏈為準(zhǔn),依次無限蔓延。而DAG中,每個新加入的單元,不僅僅只加入到長鏈里的一個區(qū)塊,而是加入到之前的所有區(qū)塊。假設(shè)當(dāng)你發(fā)布新交易時,前面有兩個有效區(qū)塊,那么你的區(qū)塊會主動同時鏈接到前面兩個之中,DAG 中的每個新單元,驗(yàn)證并確認(rèn)其父單元,以及父單元的父單元,慢慢可達(dá)創(chuàng)世單元,并將其父單元的哈希包含到自己的單元里面。隨著時間遞增,所有交易的區(qū)塊鏈相互連接,形成圖狀結(jié)構(gòu),如若要更改數(shù)據(jù),那就不僅僅是幾個區(qū)塊的問題了,而是整個區(qū)塊圖的數(shù)據(jù)更改。DAG這個模式相比來說,要進(jìn)行的復(fù)雜度更高,更難以被更改。下圖是一個網(wǎng)狀的DAG結(jié)構(gòu):
最著名的應(yīng)用DAG技術(shù)的項(xiàng)目是IOTA,IOTA改進(jìn)了DAG,并提出了Tangle(纏繞)方案。即要驗(yàn)證新的交易前,只要直接驗(yàn)證之前的兩個交易,這也使得在這兩個交易之前所有被驗(yàn)證過的交易得到間接驗(yàn)證。在IOTA的Tangle中,有一個權(quán)重積分的概念,所謂權(quán)重積分是指它自身的權(quán)重與它驗(yàn)證過的所有交易的自身權(quán)重之和。在DAG 結(jié)構(gòu)中,交易總是自己創(chuàng)建并發(fā)布。從理論上看,攻擊者總是可以建構(gòu)比它要推翻掉的那個交易權(quán)重更高的交易用以雙花。
在圖論中,如果一個有向圖從任意頂點(diǎn)出發(fā)無法經(jīng)過若干條邊回到該點(diǎn),則這個圖是一個有向無環(huán)圖。
圖和樹一樣,都是一種數(shù)據(jù)結(jié)構(gòu),圖可以分為有向圖和無向圖,對有向圖進(jìn)一步約束則形成有向無環(huán)圖,有向圖由有限個頂點(diǎn)和有向邊組成,每條有向邊都從一個頂點(diǎn)指向另一個頂點(diǎn),無環(huán)則指的是從任意一個頂點(diǎn)出發(fā)都不能通過這些有向邊回到原來的頂點(diǎn)。
因?yàn)橛邢驁D中一個點(diǎn)經(jīng)過兩種路線到達(dá)另一個點(diǎn)未必形成環(huán),因此有向無環(huán)圖未必能轉(zhuǎn)化成樹,但任何有向樹均為有向無環(huán)圖。
在XDAG的網(wǎng)絡(luò)中,其實(shí)是一個個動態(tài)的“局域網(wǎng)”的組合,所有的交易用戶隸屬于不同的“局域網(wǎng)”,不同的“局域網(wǎng)”聯(lián)合起來構(gòu)成整個XDAG的網(wǎng)絡(luò)?!熬钟蚓W(wǎng)”建立的基礎(chǔ)是具有驗(yàn)證交易(挖礦)能力的節(jié)點(diǎn)(這個節(jié)點(diǎn)可以是單個礦工,也有可能是礦場或礦池),當(dāng)用戶發(fā)起交易時,會將交易發(fā)送到自己所在“局域網(wǎng)”的礦工,礦工會驗(yàn)證數(shù)字簽名、資產(chǎn)余額、數(shù)據(jù)格式、數(shù)據(jù)完整性等信息,當(dāng)遇到無效交易后,便會進(jìn)行標(biāo)記,然后礦工會打包確認(rèn)好的信息并向全網(wǎng)發(fā)送,其他“局域網(wǎng)”的礦工收到后會驗(yàn)證自己收到的這個數(shù)據(jù)包是不是合法的,如果都沒有問題,那么這些交易就會被承認(rèn)。
在XDAG的網(wǎng)絡(luò),主節(jié)點(diǎn)組成主鏈,主鏈?zhǔn)撬泄?jié)點(diǎn)難度加和最高的一條。和比特幣網(wǎng)絡(luò)一樣,所有的交易都需要排序,那么也就是所有的節(jié)點(diǎn)是需要排序的,主節(jié)點(diǎn)的功能就是確定順序,除此之外,主節(jié)點(diǎn)還負(fù)責(zé)記錄挖礦收益,在XDAG中,每64s出一個塊,出塊同時獎勵礦工1024個xdag,但是主節(jié)點(diǎn)不記錄其他任何交易,因此可以將主節(jié)點(diǎn)看成是一個空塊,而其他的節(jié)點(diǎn)才負(fù)責(zé)記錄交易。主節(jié)點(diǎn)的產(chǎn)生需要挖礦,交易節(jié)點(diǎn)是系統(tǒng)自動生成。
DAG相比于區(qū)塊鏈來說,其實(shí)是圖和鏈的區(qū)別,對于鏈而言,無法只處理一個局部,因?yàn)殒湹娜攵群统龆戎挥幸粋€,不能把鏈上的節(jié)點(diǎn)拆成好幾個節(jié)點(diǎn)去處理,但是對于圖卻可以,因?yàn)閳D可以有多個出度,那么可以同時處理多個出度連接的節(jié)點(diǎn)。
對于鏈?zhǔn)骄W(wǎng)絡(luò)而言,不是節(jié)點(diǎn)的處理能力不強(qiáng),只是鏈?zhǔn)浇Y(jié)構(gòu)不能并行計(jì)算,浪費(fèi)的時間其實(shí)主要為等待時間:一個是發(fā)起交易,需要將交易同步所有節(jié)點(diǎn),另一個是當(dāng)有一個節(jié)點(diǎn)確認(rèn),需要向全網(wǎng)同步。對于DAG而言則不存在這樣的問題,錢包發(fā)起交易時不需要等待自己之前有多少交易,只需要經(jīng)歷局部校驗(yàn)、全網(wǎng)廣播、其他局部校驗(yàn),相當(dāng)于是把交易確認(rèn)分散化,每一個節(jié)點(diǎn)都在做類似于拼圖的工作,把自己的和別人確認(rèn)的交易拼接起來。
交易速度快
DAG實(shí)現(xiàn)的局部處理和并行結(jié)算可以使得交易速度大幅度提升。
拓展性強(qiáng)
因?yàn)楦鱾€節(jié)點(diǎn)無需等待同步其他的節(jié)點(diǎn)的數(shù)據(jù)就可計(jì)算使得記賬節(jié)點(diǎn)很容易答復(fù)延展,因此DAG很適用于物聯(lián)網(wǎng)類項(xiàng)目,例如機(jī)器微支付。
作惡難度更大
相比于鏈?zhǔn)浇Y(jié)構(gòu),在DAG中惡意修改的難度會大很多,因?yàn)镈AG擁有著很多的出度和入度,假如要修改某一個節(jié)點(diǎn),那么對應(yīng)的出入度都要進(jìn)行修改。
盡管在前文中闡述了諸多DAG的優(yōu)點(diǎn),但事實(shí)上,DAG也有自身的缺陷,DAG類項(xiàng)目也在各自使用不同的技術(shù)手段進(jìn)行解決。
交易時長不可控
DAG本質(zhì)是一種異步通訊,異步通訊所帶來最大的問題在于一致性不可控,在DAG模型中則在于交易確認(rèn)時間完全未知。當(dāng)然,某種程度上同樣可以認(rèn)為在鏈?zhǔn)侥P椭?,一個區(qū)塊被超過2/3以上節(jié)點(diǎn)數(shù)接受才算全網(wǎng)最終確認(rèn),因此最終確認(rèn)時間同樣無法準(zhǔn)確判斷。針對以上問題,XDAG采用了POW+64s固定出塊的方式。
網(wǎng)絡(luò)傳輸數(shù)據(jù)量大幅度增加
鏈?zhǔn)浇Y(jié)構(gòu)中僅僅賬本節(jié)點(diǎn)記賬,大量的錢包節(jié)點(diǎn)僅僅向一個賬本節(jié)點(diǎn)通訊即可,因此全網(wǎng)絡(luò)賬本節(jié)點(diǎn)的數(shù)量遠(yuǎn)遠(yuǎn)小于錢包節(jié)點(diǎn)。在這種情況下,所有的數(shù)據(jù)同步均在賬本節(jié)點(diǎn)之間完成,假設(shè)網(wǎng)絡(luò)中有M個賬本節(jié)點(diǎn),每一條記錄在網(wǎng)絡(luò)中傳輸?shù)拇螖?shù)為M+1。
DAG結(jié)構(gòu),在全網(wǎng)存在N個設(shè)備節(jié)點(diǎn)時(N成千上萬倍大于M),每一個消息都需要在設(shè)備間進(jìn)行點(diǎn)對點(diǎn)通訊,因此對于任何消息的發(fā)送,網(wǎng)絡(luò)中都會存在N^2次數(shù)據(jù)發(fā)送(每一個節(jié)點(diǎn)都嘗試將信息發(fā)送給其他鄰居節(jié)點(diǎn))。在未來DAG接入大量的物聯(lián)網(wǎng)節(jié)點(diǎn)后,這會對于記賬節(jié)點(diǎn)產(chǎn)生很高的要求。
影子鏈攻擊
DAG 允許多重并行交易的特征,導(dǎo)致攻擊者可能暗中生成一條影子鏈,并且時不時地將影子鏈跟主鏈進(jìn)行對接以逃避檢測算法。極端情況下,這條影子鏈有可能代替主鏈成為全網(wǎng)的共識。XDAG本身機(jī)制決定了不會出現(xiàn)影子鏈攻擊,Byteball則是通過見證人模式來解決。
智能合約開發(fā)難度大
DAG的異步操作使得在運(yùn)行智能合約時,節(jié)點(diǎn)間所存儲的數(shù)據(jù)在運(yùn)行一段時間后可能出現(xiàn)偏差,從現(xiàn)實(shí)情況來看,目前還沒有能真正基于DAG網(wǎng)絡(luò)開發(fā)出智能合約的項(xiàng)目。