Conflux的自我進化:從DAG到樹圖

買賣虛擬貨幣
受訪者:Conflux CTO 伍鳴      採訪 &.撰文:李畫這是一次特別的採訪。採訪前我們想要Conflux的技術長伍鳴博士幫我們解答的疑問是:「DAG」與「鏈」的本質區別是什麼?我們為什麼要用它?它自身的侷限性又在哪裡?採訪時伍鳴卻告訴我們,Conflux已不再把自己歸類為DAG,它的新身份是樹圖(Tree-Graph)。不過我們的疑問依然被解答了,因為最有趣的地方就在於,Conflux從DAG類別變更為樹圖類別的原因,恰恰能回答採訪前我們想要弄明白的那三個問題。甚至因為引入了樹圖概念,我們能從一個更高的角度來理解這些問題。
區塊鏈賬本的結構反映的是區塊與區塊之間的連線關係,而這種連線關係是由「指標」決定的。更科學的賬本分類方法不是基於它的形狀,而是基於其「指標」的類別、數量。我們的採訪物件伍鳴是Conflux的聯合創始人,在加入Conflux之前任微軟亞洲研究院系統組資深研究員,主要的研究方向為分散式事務處理系統、圖計算引擎和人工智慧平臺,他在分散式系統的設計和實現上擁有豐富的專業知識。Conflux是使用樹圖結構的公有鏈,其團隊成員大多擁有美國一流大學的留學背景和在矽谷、華爾街的多年工作經驗,有著突出的科研能力與技術能力。姚期智院士是Conflux團隊的首席科學家。鏈、DAG、樹圖:結構不同能力不同 問:DAG、樹圖這些非鏈式的賬本結構能被認為是區塊鏈嗎?伍鳴:不管是鏈、DAG,還是樹圖,我們要透過它們解決的問題其實是一樣的,我們可以用區塊鏈技術這個詞把它們概括起來。
問:鏈結構、DAG結構、樹圖結構的本質區別是什麼?為什麼Conflux是樹圖而不是DAG?伍鳴:你可以認為在鏈結構裡,每個區塊只能有一個指標,這個指標是指向其父親區塊的,那麼所有區塊就會一個接一個連起來,形成一個鏈狀的結構。DAG結構概括來講是指每個區塊有多於一個的指標,可以指向多於一個的其他區塊,形成的是一個有向無環的圖狀結構。Conflux的樹圖結構不同於鏈或DAG只有一類指標,它的每個區塊都有兩種指標,一種指標指向父親區塊,且只能有一個父親,與傳統的鏈式結構一樣;一種指標指向引用區塊,需要引用多個區塊,表達不同區塊間的happens-before(先行發生)關係。所以,在 Conflux 裡有兩種型別的邊,父邊(父親指標確定的邊)和引用邊(引用指標確定的邊)。如果只看父邊,賬本的結構是一棵樹;如果同時看父邊和引用邊,賬本的結構是一個圖。樹圖結構就是指在圖中包含了一棵樹的這樣一種結構。我們覺得如果繼續叫DAG 可能會讓大家產生誤解,因為目前其他基於DAG的區塊鏈系統都只有一種型別的連線區塊或交易的邊,因此有了樹圖這個概念。樹圖它更接近於Conflux賬本結構的本質。
問:Conflux為什麼要引入兩種指標?三種不同賬本結構的區塊鏈系統會有何不同?伍鳴:三種不同賬本結構下的區塊鏈系統最大的不同在於,它們對全序的支援或實現方式是不一樣的。鏈結構支援全序,DAG結構天然形成的是偏序,樹圖結構支援全序。鏈結構中捨棄了分叉上的區塊,其主鏈上的區塊都有著唯一的父子關係,天然形成一個確定的順序,所有人都可以按照這個順序執行區塊裡的交易,所有人最後都能夠達到一個一致的狀態。DAG結構中天然形成的是一個偏序。偏序的意思是說如果圖中的兩個區塊之間沒有直接的邊,或者兩個區塊之間不存在一條路徑,就沒有辦法確定這兩個區塊及它們所包含的交易間的順序。不過DAG可以透過設計為區塊排出全序,現有的DAG有些支援全序有些不支援全序。
樹圖結構透過引入主鏈和Epoch的概念,實現了對區塊全序的支援,這也是Conflux有兩種指標的原因。(如何實現全序將在下一節詳細介紹)問:為什麼要排全序,偏序會帶來什麼問題?伍鳴:一個區塊鏈系統,如果只需要處理普通的轉賬交易,又能透過指標保證併發交易間沒有因果關係,那它也許可以用偏序。因為這種系統只需要處理加減操作,而加減操作是滿足交換律和結合律的,交易的執行順序對系統狀態沒有影響,系統最終的狀態是一致的。但偏序不能支援智慧合約,因為智慧合約是圖靈完備的,它需要表達複雜的邏輯計算,它有乘法,一旦有乘法和加法就不會滿足交換律了。也就是說,兩筆交易A和B,先執行A後執行B得到的狀態與先執行B後執行A得到的狀態是不一樣的。偏序下兩筆交易有可能以任意的順序執行,那麼不同的礦工就會得到不同的系統狀態,就無法取得共識。
如果一條鏈想要支援智慧合約,就要支援全序。問:既然為了實現全序要多做工作,為什麼使用DAG或樹圖,而不是鏈結構?伍鳴:區塊鏈會產生很多分叉,鏈結構是無法定義分叉上的區塊的執行順序的,它只能選擇丟掉分叉。丟掉分叉會犧牲掉一些區塊,不僅浪費了資源,還制約了吞吐率;丟掉分叉也會犧牲一些安全性,因為在最長鏈共識機制下,分叉上的區塊是不能為最長鏈共識作出貢獻的,比如有很多好人區塊分叉的話,這些區塊就不能用來貢獻最長鏈,也就不能用來貢獻鏈的安全,壞人可以用更少的算力攻擊這條鏈。樹圖和實現了全序的DAG把分叉區塊加入到賬本中,並定義了分叉上區塊的執行順序。把所有的區塊都算進來,也就讓所有區塊都貢獻到系統的吞吐率上,這使得系統的瓶頸就不再是共識機制,而是網路本身。只要網路足夠快,系統的效能就還能再高,從而使得整個系統在不犧牲安全性的同時獲得更高的吞吐率。
Conflux如何實現全序問:Conflux如何實現全序?伍鳴:Conflux是透過引入主鏈這個概念最終實現全序的。我們之前講過每個區塊都有兩種指標,其中一種是指向父親區塊的,這種指標決定的賬本結構是一棵樹,透過這棵樹可以確定一條主鏈。具體實現上,Conflux採用了Ghost和Epoch這兩種規則。Ghost規則用來確定主鏈,Epoch規則用來確定區塊的順序,兩者結合,就能實現區塊的全序。問:Ghost如何確定主鏈?伍鳴:Ghost從創世區塊開始,迭代的去從孩子區塊中選擇放在主鏈上的下一個區塊,選擇規則是挑選擁有最大子樹的孩子區塊為主鏈區塊。

如下圖所示,區塊A和區塊B是創世區塊的兩個孩子區塊。A子樹有6個區塊,B子樹有5個區塊,所以選擇區塊A作為緊接著創世區塊的主鏈上的區塊。根據同樣的規則,把區塊C,E,H,都選擇進了主鏈。

問:Epoch如何實現對區塊的排序?

伍鳴:Conflux中的每個新區塊在產生時,除了選擇主鏈(該區塊觀察到的主鏈)上的最後一個區塊作為自己的父親區塊外,還必須把所有自己觀察到的但還沒有被其他區塊引用的區塊引用起來,表達不同區塊之間的happens-before的關係。

如上圖所示,如果一個機器節點在產生區塊E的時候,發現系統中已經有了區塊D,而且這個時候區塊D還未被任何其他區塊引用,那麼區塊E就把自己的引用指標指向區塊D,也就是說在區塊E和區塊D之間加上一個有向的引用邊,表示D是在E之前產生的。

主鏈上的每一個區塊確定一個Epoch。在分叉上的區塊屬於哪個Epoch,是由第一個產生在它之後的主鏈區塊所在的Epoch決定的。比如區塊D屬於Epoch E,因為D最先被E引用,所以產生在E之前,但是D並不產生在C之前。

問:在同一個Epoch內,區塊間的順序是如何確定的?

伍鳴:在每一個Epoch內部,Conflux用拓撲排序確定區塊間的順序。如果出現平局,再根據區塊的雜湊值來排序。

如此一來,透過Ghost規則確定主鏈,透過Epoch規則確定區塊的大體順序,透過拓撲和雜湊排序實現同一Epoch內區塊的順序,最終,Conflux的樹圖結構賬本提供了一個一致的區塊全序。

DAG和樹圖引發的思考

問:如果多個節點同時出塊,這些區塊又都有效,會不會同一時間段產生大量區塊?這樣一來,每個區塊中引用指標佔的空間會不會變得很大? 

伍鳴:不會的,實際上整個系統的出塊率是固定的,我們會動態的去調整出塊難度,出塊率很高,我們就增加難度把它降下來,出塊率很低,我們就減少難度讓它增上去。

問:如果多個節點同時出塊,併發區塊中應該會包含相同的交易,怎麼解決重複打包交易的問題?

伍鳴:Conflux採用的是混合策略(Mixed-Strategy,博弈論中的一種策略),礦工們根據交易費的選擇權重隨機地從交易等待池中選取交易。隨機是比較抽象的一個描述,它實際上很複雜,礦工會跟隨這種隨機方法選取交易,讓自己打包交易獲得的回報最大化。

當然不可能完全避免重複,交易池的交易越多重複概率越小,在正常情況下可能有30%左右的交易重複。如果交易池裡的交易很少,比如說最極端的情況,只有一個交易,那當然是會重複的,因為所有人都會打包這個交易。

問:如果多個節點同時出塊,有沒有可能發生交易衝突的問題?

伍鳴:一般我們說的交易衝突是指上一個交易把錢花光沒有餘額了,但後面還有交易。Conflux透過區塊全序保證了交易的執行順序,就會避免這個問題,如果發生在前邊的交易把錢花光了,就會讓它後邊的交易變為無效。

另一種情況是相同的交易有可能被打包到不同的區塊裡,在這種情況下,Conflux只接受在區塊全序中排在最開始位置的這筆交易,而把後面的交易變為無效。

問:因為賬本結構的複雜性,會不會出現不同節點賬本不一致的情況?

伍鳴:肯定是有的,但經過一段時間以後就能確定賬本。有一個公式可以算出主鏈區塊被統一的概率,大概五、六個Epoch後,賬本就能一致。

問:樹圖在51%攻擊上的安全性是怎麼樣的?

伍鳴:Conflux中只要主鏈定了,交易的全序就定了,攻擊者想發動51%攻擊、想改變交易的順序,就必須改變主鏈的順序。

因此在51%攻擊上,樹圖的安全性和Ghost鏈的安全性是差不多的。

Ghost規則比最長鏈規則安全,Ghost看的是子樹的權重,把分叉上的區塊也考慮到了,所有的區塊、所有的算力都貢獻到主鏈的選擇上,能夠嚴格地滿足51%這個概念。但最長鏈規則沒有考慮分叉鏈上算力的浪費。

問:在對礦工的激勵機制上,樹圖跟鏈式結構有什麼不同?

伍鳴:有一種情況是樹圖中才會出現的。樹圖需要區塊去引用其他區塊,表達不同區塊之間的happens-before的關係,那有的區塊可能不去正常引用其他區塊,就是說看到其他區塊也不引用。這是我們不希望看到的情況。

另一種發生在樹圖上的欺騙行為在傳統的鏈上也會發生,就是產生區塊但不廣播,偷偷挖一個私有的鏈,等到某個時機再放出去。

在這兩種情況下,這些不正常區塊的併發區塊會變得很多,因為它們和其他區塊之間缺少happens-before關係。Conflux以此為依據去懲罰這兩種行為:併發區塊的個數越多,礦工獲得的獎勵越少。

結束語

鏈式結構放棄了分叉上的區塊,這樣做雖然犧牲了一定的吞吐率,卻保證了交易的全序。DAG把分叉上的區塊都納入到賬本中,這樣做雖然不再浪費算力,卻引入了一個如何對區塊排序的難題。

有的DAG乾脆不對區塊排序,因為在一些應用場景下,交易的全序可能並不那麼重要,比如IOTA。其他DAG則需要設計一種方法,實現對區塊的排序。比如Byteball 、Hashgraph。

當我們深入地去了解不排全序的DAG、排全序的DAG、排全序DAG的不同排序方法,以及這些DAG採用的不同賬本結構,就會發現它們是截然不同的。

或許正因如此,Conflux不再把自己歸類為DAG,而具有兩種不同類別指標的它也確實與DAG有著不小的區別,樹圖也許更接近其本質。

於是,這次帶著弄清DAG與鏈的差別開始的採訪,最後得出的結論是:不同DAG專案的差別,比DAG與鏈的差別都大。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;