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