Conflux的自我进化:从DAG到树图| 对话伍鸣
Conflux的身份不再是DAG,它是樹圖。
受訪者:Conflux CTO 伍鳴
采訪 &.撰文:李畫
這是一次特別的采訪。
采訪前我們想要Conflux的首席技術(shù)官伍鳴博士幫我們解答的疑問是:「DAG」與「鏈」的本質(zhì)區(qū)別是什么?我們?yōu)槭裁匆盟?#xff1f;它自身的局限性又在哪里?
采訪時伍鳴卻告訴我們,Conflux已不再把自己歸類為DAG,它的新身份是樹圖(Tree-Graph)。
不過我們的疑問依然被解答了,因為最有趣的地方就在于,Conflux從DAG類別變更為樹圖類別的原因,恰恰能回答采訪前我們想要弄明白的那三個問題。甚至因為引入了樹圖概念,我們能從一個更高的角度來理解這些問題。
區(qū)塊鏈賬本的結(jié)構(gòu)反映的是區(qū)塊與區(qū)塊之間的連接關(guān)系,而這種連接關(guān)系是由「指針」決定的。更科學(xué)的賬本分類方法不是基于它的形狀,而是基于其「指針」的類別、數(shù)量。
我們的采訪對象伍鳴是Conflux的聯(lián)合創(chuàng)始人,在加入Conflux之前任微軟亞洲研究院系統(tǒng)組資深研究員,主要的研究方向為分布式事務(wù)處理系統(tǒng)、圖計算引擎和人工智能平臺,他在分布式系統(tǒng)的設(shè)計和實現(xiàn)上擁有豐富的專業(yè)知識。
Conflux是使用樹圖結(jié)構(gòu)的公有鏈,其團(tuán)隊成員大多擁有美國一流大學(xué)的留學(xué)背景和在硅谷、華爾街的多年工作經(jīng)驗,有著突出的科研能力與技術(shù)能力。姚期智院士是Conflux團(tuán)隊的首席科學(xué)家。
01
鏈、DAG、樹圖:結(jié)構(gòu)不同能力不同?
問:DAG、樹圖這些非鏈?zhǔn)降馁~本結(jié)構(gòu)能被認(rèn)為是區(qū)塊鏈嗎?
伍鳴:不管是鏈、DAG,還是樹圖,我們要通過它們解決的問題其實是一樣的,我們可以用區(qū)塊鏈技術(shù)這個詞把它們概括起來。
問:鏈結(jié)構(gòu)、DAG結(jié)構(gòu)、樹圖結(jié)構(gòu)的本質(zhì)區(qū)別是什么?為什么Conflux是樹圖而不是DAG?
伍鳴:你可以認(rèn)為在鏈結(jié)構(gòu)里,每個區(qū)塊只能有一個指針,這個指針是指向其父親區(qū)塊的,那么所有區(qū)塊就會一個接一個連起來,形成一個鏈狀的結(jié)構(gòu)。
DAG結(jié)構(gòu)概括來講是指每個區(qū)塊有多于一個的指針,可以指向多于一個的其他區(qū)塊,形成的是一個有向無環(huán)的圖狀結(jié)構(gòu)。
Conflux的樹圖結(jié)構(gòu)不同于鏈或DAG只有一類指針,它的每個區(qū)塊都有兩種指針,一種指針指向父親區(qū)塊,且只能有一個父親,與傳統(tǒng)的鏈?zhǔn)浇Y(jié)構(gòu)一樣;一種指針指向引用區(qū)塊,需要引用多個區(qū)塊,表達(dá)不同區(qū)塊間的happens-before(先行發(fā)生)關(guān)系。
所以,在 Conflux 里有兩種類型的邊,父邊(父親指針確定的邊)和引用邊(引用指針確定的邊)。如果只看父邊,賬本的結(jié)構(gòu)是一棵樹;如果同時看父邊和引用邊,賬本的結(jié)構(gòu)是一個圖。樹圖結(jié)構(gòu)就是指在圖中包含了一棵樹的這樣一種結(jié)構(gòu)。
我們覺得如果繼續(xù)叫DAG 可能會讓大家產(chǎn)生誤解,因為目前其他基于DAG的區(qū)塊鏈系統(tǒng)都只有一種類型的連接區(qū)塊或交易的邊,因此有了樹圖這個概念。樹圖它更接近于Conflux賬本結(jié)構(gòu)的本質(zhì)。
問:Conflux為什么要引入兩種指針?三種不同賬本結(jié)構(gòu)的區(qū)塊鏈系統(tǒng)會有何不同?
伍鳴:三種不同賬本結(jié)構(gòu)下的區(qū)塊鏈系統(tǒng)最大的不同在于,它們對全序的支持或?qū)崿F(xiàn)方式是不一樣的。
鏈結(jié)構(gòu)支持全序,DAG結(jié)構(gòu)天然形成的是偏序,樹圖結(jié)構(gòu)支持全序。
鏈結(jié)構(gòu)中舍棄了分叉上的區(qū)塊,其主鏈上的區(qū)塊都有著唯一的父子關(guān)系,天然形成一個確定的順序,所有人都可以按照這個順序執(zhí)行區(qū)塊里的交易,所有人最后都能夠達(dá)到一個一致的狀態(tài)。
DAG結(jié)構(gòu)中天然形成的是一個偏序。偏序的意思是說如果圖中的兩個區(qū)塊之間沒有直接的邊,或者兩個區(qū)塊之間不存在一條路徑,就沒有辦法確定這兩個區(qū)塊及它們所包含的交易間的順序。
不過DAG可以通過設(shè)計為區(qū)塊排出全序,現(xiàn)有的DAG有些支持全序有些不支持全序。
樹圖結(jié)構(gòu)通過引入主鏈和Epoch的概念,實現(xiàn)了對區(qū)塊全序的支持,這也是Conflux有兩種指針的原因。(如何實現(xiàn)全序?qū)⒃谙乱还?jié)詳細(xì)介紹)
問:為什么要排全序,偏序會帶來什么問題?
伍鳴:一個區(qū)塊鏈系統(tǒng),如果只需要處理普通的轉(zhuǎn)賬交易,又能通過指針保證并發(fā)交易間沒有因果關(guān)系,那它也許可以用偏序。
因為這種系統(tǒng)只需要處理加減操作,而加減操作是滿足交換律和結(jié)合律的,交易的執(zhí)行順序?qū)ο到y(tǒng)狀態(tài)沒有影響,系統(tǒng)最終的狀態(tài)是一致的。
但偏序不能支持智能合約,因為智能合約是圖靈完備的,它需要表達(dá)復(fù)雜的邏輯計算,它有乘法,一旦有乘法和加法就不會滿足交換律了。
也就是說,兩筆交易A和B,先執(zhí)行A后執(zhí)行B得到的狀態(tài)與先執(zhí)行B后執(zhí)行A得到的狀態(tài)是不一樣的。偏序下兩筆交易有可能以任意的順序執(zhí)行,那么不同的礦工就會得到不同的系統(tǒng)狀態(tài),就無法取得共識。
如果一條鏈想要支持智能合約,就要支持全序。
問:既然為了實現(xiàn)全序要多做工作,為什么使用DAG或樹圖,而不是鏈結(jié)構(gòu)?
伍鳴:區(qū)塊鏈會產(chǎn)生很多分叉,鏈結(jié)構(gòu)是無法定義分叉上的區(qū)塊的執(zhí)行順序的,它只能選擇丟掉分叉。
丟掉分叉會犧牲掉一些區(qū)塊,不僅浪費了資源,還制約了吞吐率;丟掉分叉也會犧牲一些安全性,因為在最長鏈共識機制下,分叉上的區(qū)塊是不能為最長鏈共識作出貢獻(xiàn)的,比如有很多好人區(qū)塊分叉的話,這些區(qū)塊就不能用來貢獻(xiàn)最長鏈,也就不能用來貢獻(xiàn)鏈的安全,壞人可以用更少的算力攻擊這條鏈。
樹圖和實現(xiàn)了全序的DAG把分叉區(qū)塊加入到賬本中,并定義了分叉上區(qū)塊的執(zhí)行順序。
把所有的區(qū)塊都算進(jìn)來,也就讓所有區(qū)塊都貢獻(xiàn)到系統(tǒng)的吞吐率上,這使得系統(tǒng)的瓶頸就不再是共識機制,而是網(wǎng)絡(luò)本身。只要網(wǎng)絡(luò)足夠快,系統(tǒng)的性能就還能再高,從而使得整個系統(tǒng)在不犧牲安全性的同時獲得更高的吞吐率。
02
Conflux如何實現(xiàn)全序
問:Conflux如何實現(xiàn)全序?
伍鳴:Conflux是通過引入主鏈這個概念最終實現(xiàn)全序的。我們之前講過每個區(qū)塊都有兩種指針,其中一種是指向父親區(qū)塊的,這種指針決定的賬本結(jié)構(gòu)是一棵樹,通過這棵樹可以確定一條主鏈。
具體實現(xiàn)上,Conflux采用了Ghost和Epoch這兩種規(guī)則。Ghost規(guī)則用來確定主鏈,Epoch規(guī)則用來確定區(qū)塊的順序,兩者結(jié)合,就能實現(xiàn)區(qū)塊的全序。
問:Ghost如何確定主鏈?
伍鳴:Ghost從創(chuàng)世區(qū)塊開始,迭代的去從孩子區(qū)塊中選擇放在主鏈上的下一個區(qū)塊,選擇規(guī)則是挑選擁有最大子樹的孩子區(qū)塊為主鏈區(qū)塊。
如下圖所示,區(qū)塊A和區(qū)塊B是創(chuàng)世區(qū)塊的兩個孩子區(qū)塊。A子樹有6個區(qū)塊,B子樹有5個區(qū)塊,所以選擇區(qū)塊A作為緊接著創(chuàng)世區(qū)塊的主鏈上的區(qū)塊。根據(jù)同樣的規(guī)則,把區(qū)塊C,E,H,都選擇進(jìn)了主鏈。
(圖中實線箭頭指向父親區(qū)塊,虛線箭頭指向引用區(qū)塊)
問:Epoch如何實現(xiàn)對區(qū)塊的排序?
伍鳴:Conflux中的每個新區(qū)塊在產(chǎn)生時,除了選擇主鏈(該區(qū)塊觀察到的主鏈)上的最后一個區(qū)塊作為自己的父親區(qū)塊外,還必須把所有自己觀察到的但還沒有被其他區(qū)塊引用的區(qū)塊引用起來,表達(dá)不同區(qū)塊之間的happens-before的關(guān)系。
如上圖所示,如果一個機器節(jié)點在產(chǎn)生區(qū)塊E的時候,發(fā)現(xiàn)系統(tǒng)中已經(jīng)有了區(qū)塊D,而且這個時候區(qū)塊D還未被任何其他區(qū)塊引用,那么區(qū)塊E就把自己的引用指針指向區(qū)塊D,也就是說在區(qū)塊E和區(qū)塊D之間加上一個有向的引用邊,表示D是在E之前產(chǎn)生的。
主鏈上的每一個區(qū)塊確定一個Epoch。在分叉上的區(qū)塊屬于哪個Epoch,是由第一個產(chǎn)生在它之后的主鏈區(qū)塊所在的Epoch決定的。比如區(qū)塊D屬于Epoch E,因為D最先被E引用,所以產(chǎn)生在E之前,但是D并不產(chǎn)生在C之前。
問:在同一個Epoch內(nèi),區(qū)塊間的順序是如何確定的?
伍鳴:在每一個Epoch內(nèi)部,Conflux用拓?fù)渑判虼_定區(qū)塊間的順序。如果出現(xiàn)平局,再根據(jù)區(qū)塊的哈希值來排序。
如此一來,通過Ghost規(guī)則確定主鏈,通過Epoch規(guī)則確定區(qū)塊的大體順序,通過拓?fù)浜凸E判驅(qū)崿F(xiàn)同一Epoch內(nèi)區(qū)塊的順序,最終,Conflux的樹圖結(jié)構(gòu)賬本提供了一個一致的區(qū)塊全序。
03
DAG和樹圖引發(fā)的思考
問:如果多個節(jié)點同時出塊,這些區(qū)塊又都有效,會不會同一時間段產(chǎn)生大量區(qū)塊?這樣一來,每個區(qū)塊中引用指針占的空間會不會變得很大??
伍鳴:不會的,實際上整個系統(tǒng)的出塊率是固定的,我們會動態(tài)的去調(diào)整出塊難度,出塊率很高,我們就增加難度把它降下來,出塊率很低,我們就減少難度讓它增上去。
問:如果多個節(jié)點同時出塊,并發(fā)區(qū)塊中應(yīng)該會包含相同的交易,怎么解決重復(fù)打包交易的問題?
伍鳴:Conflux采用的是混合策略(Mixed-Strategy,博弈論中的一種策略),礦工們根據(jù)交易費的選擇權(quán)重隨機地從交易等待池中選取交易。隨機是比較抽象的一個描述,它實際上很復(fù)雜,礦工會跟隨這種隨機方法選取交易,讓自己打包交易獲得的回報最大化。
當(dāng)然不可能完全避免重復(fù),交易池的交易越多重復(fù)概率越小,在正常情況下可能有30%左右的交易重復(fù)。如果交易池里的交易很少,比如說最極端的情況,只有一個交易,那當(dāng)然是會重復(fù)的,因為所有人都會打包這個交易。
問:如果多個節(jié)點同時出塊,有沒有可能發(fā)生交易沖突的問題?
伍鳴:一般我們說的交易沖突是指上一個交易把錢花光沒有余額了,但后面還有交易。Conflux通過區(qū)塊全序保證了交易的執(zhí)行順序,就會避免這個問題,如果發(fā)生在前邊的交易把錢花光了,就會讓它后邊的交易變?yōu)闊o效。
另一種情況是相同的交易有可能被打包到不同的區(qū)塊里,在這種情況下,Conflux只接受在區(qū)塊全序中排在最開始位置的這筆交易,而把后面的交易變?yōu)闊o效。
問:因為賬本結(jié)構(gòu)的復(fù)雜性,會不會出現(xiàn)不同節(jié)點賬本不一致的情況?
伍鳴:肯定是有的,但經(jīng)過一段時間以后就能確定賬本。有一個公式可以算出主鏈區(qū)塊被統(tǒng)一的概率,大概五、六個Epoch后,賬本就能一致。
問:樹圖在51%攻擊上的安全性是怎么樣的?
伍鳴:Conflux中只要主鏈定了,交易的全序就定了,攻擊者想發(fā)動51%攻擊、想改變交易的順序,就必須改變主鏈的順序。
因此在51%攻擊上,樹圖的安全性和Ghost鏈的安全性是差不多的。
Ghost規(guī)則比最長鏈規(guī)則安全,Ghost看的是子樹的權(quán)重,把分叉上的區(qū)塊也考慮到了,所有的區(qū)塊、所有的算力都貢獻(xiàn)到主鏈的選擇上,能夠嚴(yán)格地滿足51%這個概念。但最長鏈規(guī)則沒有考慮分叉鏈上算力的浪費。
問:在對礦工的激勵機制上,樹圖跟鏈?zhǔn)浇Y(jié)構(gòu)有什么不同?
伍鳴:有一種情況是樹圖中才會出現(xiàn)的。樹圖需要區(qū)塊去引用其他區(qū)塊,表達(dá)不同區(qū)塊之間的happens-before的關(guān)系,那有的區(qū)塊可能不去正常引用其他區(qū)塊,就是說看到其他區(qū)塊也不引用。這是我們不希望看到的情況。
另一種發(fā)生在樹圖上的欺騙行為在傳統(tǒng)的鏈上也會發(fā)生,就是產(chǎn)生區(qū)塊但不廣播,偷偷挖一個私有的鏈,等到某個時機再放出去。
在這兩種情況下,這些不正常區(qū)塊的并發(fā)區(qū)塊會變得很多,因為它們和其他區(qū)塊之間缺少happens-before關(guān)系。Conflux以此為依據(jù)去懲罰這兩種行為:并發(fā)區(qū)塊的個數(shù)越多,礦工獲得的獎勵越少。
04
結(jié)束語
鏈?zhǔn)浇Y(jié)構(gòu)放棄了分叉上的區(qū)塊,這樣做雖然犧牲了一定的吞吐率,卻保證了交易的全序。DAG把分叉上的區(qū)塊都納入到賬本中,這樣做雖然不再浪費算力,卻引入了一個如何對區(qū)塊排序的難題。
有的DAG干脆不對區(qū)塊排序,因為在一些應(yīng)用場景下,交易的全序可能并不那么重要,比如IOTA。其他DAG則需要設(shè)計一種方法,實現(xiàn)對區(qū)塊的排序。比如Byteball 、Hashgraph。
當(dāng)我們深入地去了解不排全序的DAG、排全序的DAG、排全序DAG的不同排序方法,以及這些DAG采用的不同賬本結(jié)構(gòu),就會發(fā)現(xiàn)它們是截然不同的。
或許正因如此,Conflux不再把自己歸類為DAG,而具有兩種不同類別指針的它也確實與DAG有著不小的區(qū)別,樹圖也許更接近其本質(zhì)。
于是,這次帶著弄清DAG與鏈的差別開始的采訪,最后得出的結(jié)論是:不同DAG項目的差別,比DAG與鏈的差別都大。
推薦閱讀:
豐水期不是礦場和礦商的救命稻草
區(qū)塊鏈該不該追求效率
波場正在引入審查
SEC明確代幣屬于證券的評估標(biāo)準(zhǔn)
R3黯然史
從貨幣經(jīng)濟(jì)學(xué)視角穿透穩(wěn)定幣
摩根大通背后的清算體系與區(qū)塊鏈網(wǎng)絡(luò)
揭秘頂級區(qū)塊鏈投資機構(gòu)Polychain
為什么匿名幣將統(tǒng)治下一個牛市?
官方社群已開通,歡迎加小編微信。
< END >
總結(jié)
以上是生活随笔為你收集整理的Conflux的自我进化:从DAG到树图| 对话伍鸣的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSP——炉石传说
- 下一篇: echarts二次渲染时宽高为0图表不显