作者:密碼極客 / 來源:密碼朋克
這支清華姚班團隊,由國內唯一圖靈獎獲得者姚期智教授擔任首席科學家。但他們并不大愿意把自己的首席科學家拿來當噱頭。
和那些用心做實事的團隊一樣,Conflux團隊想要用 DAG 解決中本聰協議最大的挑戰,但也從不說自己達到百萬TPS。
為了把一個充滿學術氣息的團隊推到我們社群成員面前,密碼極客邀請了Conflux的CTO伍鳴博士,一位中科院計算機系統結構博士。
而接下來的內容,密碼極客提醒一下,“內容非常干貨,信息量極大”。畢竟密碼極客作為國內最權威的區塊鏈技術創投社群,走的一直是實力派技術路線。
如果你還是對DAG結構或者Conflux有疑問,歡迎在下方留言。
分享正式開始
大家好,今天很高興有機會來到密碼極客。我們Conflux是一個創新的公鏈系統,它主要的優勢特點是能夠將基于POW的中本聰共識機制的吞吐率提升到每秒上千條交易的量級。
我先簡單介紹一下Conflux的團隊。我們有很多成員來自清華姚班,而團隊大部分都曾經有信息學、數學物理奧賽取得優異成績的經歷。同時,我們部分成員在計算機領域有很強的學術背景。
我們將學術研究中一些嚴謹的作風帶給了團隊。所以我們雖然是在解決區塊鏈的擴容問題,但不會隨便說自己達到百萬TPS的言論。
當前區塊鏈領域面臨的最大問題之一,就是效率。目前基于 PoW 的區塊鏈系統,不管是比特幣還是以太坊,交易吞吐率都很低。
那么接下來我們再來看一下,為什么傳統基于POW共識機制的吞吐率會這么低下呢?
總的來說就是為了安全,不得不如此。
比特幣的共識機制
我們先來簡單看一下,這個比特幣中的共識機制是如何工作的?
在這個協議里面,交易是被打包到區塊里面的。所有的區塊形成了一個鏈,這個鏈表示了交易的歷史紀錄。每一個參與這個協議的機器節點都會想要去產生一個新的區塊并在該區塊里打包新的交易,并且通過將前一個區塊的哈希值存入新區塊的頭部信息來將新區快鏈在區塊鏈的尾部。
這個協議通過使用工作量證明以及最長鏈規則來讓所有的機器節點對區塊鏈的狀態達成共識。同時,它維持了一個很慢的全網的平均出塊率以及相對較小的區塊大小。
假設圖中是一個區塊鏈的當前的狀態,假設一個攻擊者想要逆轉區塊n-2中的一個交易,他就會想要從區塊n-3后面引入一個分叉來使區塊n-2變得無效。
但是與此同時,所有誠實的節點都會遵循最長鏈規則,從而將他們新產生出來的區塊鏈在最長鏈的尾部。由于系統維持了很低的出塊率和較小的塊大小,網絡延遲相對于出塊時間來講是比較小的,所以這些誠實的節點所產生的區塊基本上就是順序的。
這樣的話,只要誠實節點的總算力超過50%,攻擊者就不能夠使他自己產生的鏈成為最長鏈。
但是有人接下來可能會問,是不是可以通過增加出塊率或者增大區塊的大小來提高系統的吞吐率?
簡單在中本聰共識機制里面這樣去做是有問題的。因為不論是增大塊的大小還是增加出塊率都會使得區塊產生的時間和區塊在網絡上傳播的延遲相比變得相對較小。
這就使得一個新塊在產生以后還來不及傳播到全網就會有其他的節點產生另外的新塊,于是就在區塊鏈上產生了分叉。雖然整個系統最終會收斂到某一個最長的分叉上,但是出塊率和塊大小越大的話,分叉的情況就會越發嚴重,分叉也會進一步出現在已有的分叉上。所以最終區塊鏈的賬本就發展成這個樣子,就是有很多的分叉。
這就會像下圖一樣。
這帶來兩個問題。第一,這些分叉浪費了網絡和計算資源,因為只有最長鏈中的區塊才被認為是有效的。第二,它危害了安全性,因為整個區塊鏈里的最長鏈變短了,這使得攻擊者只需要少于50%的算力就可以產生出惡意的最長鏈了。
因此在比特幣或以太坊中,我們為了保證安全性,他需要保持一個很長的出塊時間,也就是很低的出塊率。或者維持一個很小的區塊大小,以減少這個區塊在網絡中傳播的延遲,從此來減少這個分叉出現的頻率。但同時也因此大大降低了系統的吞吐率。
Conflux的DAG如何產生
那么,如果我們選擇了另一個思路,即通過允許每個區塊選擇多個區塊作為自己的父親或祖先,哪怕在出塊速度很快的時候,也可以避免誠實區塊之間無意義的競爭。這樣,就繞開了中本聰共識中安全與效率兩難的困境。
我們注意到,在比特幣中的這種基于鏈的共識機制里,它本質上對交易的執行順序有一個嚴格的限制,也就是交易的執行順序要和他們所在的區塊的產生的順序是一致的。
但是在不同的區塊分叉之間,他們的順序是沒有辦法在全網的機制節點上達成統一的確定,因為他們是并發產生的。
但是我們如果仔細觀察的話,實際上區塊鏈的系統里面,很多的交易是沒有沖突,所以它們可以按任意的順序執行,只要所有的參與節點都同意一個順序就可以了。那么基于這樣一個觀察,我們Conflux的主要的核心想法就是這樣的。
我們首先樂觀的處理這些可能并發的區塊,然后我們把這些區塊組織成有向無環圖,也就是DAG。接下來我們讓所有的機器節點首先假設所有的交易相互之間都沒有沖突,從而決定一個一致的區塊順序。然后他們再根據區塊的順序進一步決定所有交易的執行順序,最后再依照這個交易的順序去解決交易的沖突問題。
接下來我們用一個具體的例子來說明這個想法。假設這個圖上顯示的是Conflux的賬本在某一時刻的狀態。每個區塊都有一個指向它的父親區塊的parent邊。那么這些區塊和它們的parent邊,就構成了一個樹形結構。除了指向父親的邊以外,每一個區塊還可以有多個引用邊。這個引用邊主要是記錄和表達區塊之間的happens-before關系。比如,如果一個機器節點在產生區塊E的時候,它已經有了區塊D,而且這個時候,D也沒有任何一個其他區塊引用了它。那么這個節點可以給E加上一個引用D的邊來表示D是在E之前產生的。
有了這些邊的定義,這個賬本結構就定下來了,這個結構會在全網節點進行廣播,所以,所有的節點最終都會得到一個一致的賬本。那么有了一致的賬本以后,所有的節點如何去決定一個一致的區塊全序呢?我們的核心想法是,首先,這些節點先在DAG中決定一個一致的主鏈,然后,再根據這個主鏈來決定一個一致的區塊的全序。
為了決定主鏈,Conflux使用了Ghost規則。具體來說就是,我們從創世塊開始,迭代的去從孩子區塊中選擇下一個在主鏈上的區塊。選擇的規則是挑選擁有最大子樹的孩子區塊。比如,區塊A和區塊B是創世區塊的兩個孩子區塊。A的子樹有6個區塊,B的子樹有5個區塊。所以我們選擇區塊A作為緊接著創世區塊的主鏈區塊。相應的我們根據相同的規則,將區塊C,E,H,都選進了主鏈。
(黃色的即選進去的主鏈區塊)
為了產生一個新的區塊,一個機器節點首先選擇主鏈上的最后一個區塊作為新區塊的父親,然后這個新區塊再把所有已經收到但還沒有被其他區塊所引用的區塊引用起來。
比如像里面的區塊K。
這里之所以使用Ghost規則而不是最長鏈規則來選主鏈,是因為Ghost規則中所有的區塊,包括那些在分叉上的區塊,都會對主鏈的選擇做出貢獻。這樣的話,就保證了只要攻擊者的算力沒有超過50%, 就無法改變由誠實節點確定的主鏈。
現在我們有了讓所有機器節點對主鏈產生共識的機制。那接下來,這些節點如何對區塊的全序達成共識呢?為了做到這一點,我們引入一個Epoch的概念。在主鏈上的每一個區塊就確定了一個Epoch。在分叉上的區塊屬于哪個Epoch,是由第一個產生在它之后的主鏈區塊所在的Epoch決定的。比如,區塊D屬于Epoch E,因為D最先被E引用,所以產生在E之前,但是D并不產生在C之前。
所以,在Conflux中,我們首先按照Epoch的順序來給區塊排個序。然后在每一個Epoch內部,我們再按照拓撲排序來確定區塊的順序。如果出現平局的情況,我們再根據區塊的哈希值來打破平局。
所以這個圖中的區塊排好序以后就是這樣的。
接下來我們要為交易排序,Conflux首先按照區塊的順序去給交易排序。然后在每個區塊內部,我們就按照交易在區塊里所在的位置來排就可以了。
交易可能會沖突。比如這個例子里面的交易2和交易3。因為交易2執行過以后,賬戶X里面就沒有足夠的余額來完成交易3了,因為在這個交易的全序里面,交易3是發生在交易2之后的,所以我們會讓交易3變為無效。
另一種情況是,相同的交易有可能被不同的節點打包到不同的并發區塊里,比如交易4。 在這種情況下,Conflux只會接受在全序中出現的第一個這樣的交易,而把后面的重復交易無效掉。
Conflux如何能夠防止雙花攻擊
我們首先來看一下一個攻擊者如何能夠逆轉在賬本中的一個交易,比如交易4。為了做到這一點,一個攻擊者需要產生一個交易4的雙花交易,打包到一個區塊里面,并且將這個區塊在區塊的全序中插入到區塊B的前面。
(紅色區塊是攻擊區塊)
但攻擊者很難做到這一點,主要有兩個原因。
第一個就是除非攻擊者能夠改變主鏈,不然他不能夠逆轉交易,因為交易的順序是由主鏈來決定的。比如一個攻擊者想把一個塊插在靠前的位置,他能做就是在一個很早的Epoch里面的區塊后面接著產生新塊。但是只要這個塊不在主鏈上,它就最終還是會屬于一個很晚的Epoch。因為當一個誠實的新塊產生以后,它會通過引用邊把這個攻擊者的區塊給拉到新的Epoch里面。
第二個原因就是,如果攻擊者沒有超過50%的算力,他就沒有辦法改變主鏈。
為什么是50%呢?我這里給出一個直觀的解釋。假設區塊A是一個主鏈上的塊,一個攻擊者想要用區塊A’來取代A在主鏈上的位置。那么所有攻擊者產生的塊都會在A’的子樹下面,然而所有誠實的節點所產生的塊都會在A的子樹下面,這樣的話,攻擊者就需要超過50%的算力才能讓A’的子樹超過A的子樹。
根據理論的分析,A’能夠取代A的概率是隨著時間的增加而指數下降的。
因此,一個交易的確認就包含以下幾步。用戶首先對攻擊者的算力比例以及他所能承受的風險有一個假設。給定這個假設,Conflux首先找到這個交易平臺屬的Epoch,然后找到和這個Epoch相應的主鏈區塊。最后再檢查這個主鏈區塊被逆轉的概率是否小于用戶所能承受的風險。如果小于,則該交易可以確認。
接下來我們再簡要的看一些實驗結果。我們搭建了Conflux的一個原型系統,然后在Amazom EC2上運行1萬個Conflux節點來做實驗。為了模擬公網上真實網絡環境,我們限制每個節點的網絡帶寬是20Mbps。
在實驗中我們調整不同的區塊大小和出塊率。我們測量了系統的吞吐率和交易延遲,并且和比特幣以及Ghost的協議進行了比較。
(藍色是Conflux的曲線,藍色綠色是GHOST、比特幣的曲線)
上面這個圖呢,顯示的是吞吐率隨著區塊大小增加的變化。下面這個圖呢,顯示的吞吐率隨著出塊率減少的變化。
那么我們可以看到當塊大小在4MB,以及五秒鐘出一個塊的前提下,Conflux的TPS可以達到3200。
在這種情況下,我們也和這個另外一個公鏈項目Algorand進行數據比較。在相同的這個環境下,Conflux的性能可以達到Algorand的3.7倍。
同時跟比特幣、GHOST比較的話,也是比他們高這個12.5倍。
Conflux和其他DAG項目比較
DAG 技術有很多了,比如說 Spectre和 Phantom 算法,這是設計思路與我們最接近的算法,都是采用 DAG 角度優化 PoW 鏈的效率。但遺憾的是,Spectre 無法對所有區塊排一個序出來,這導致它上面無法跑智能合約。而Phantom 被我們發現有漏洞。
同時,還有一些基于DAG 的算法跟Conflux形似但非神似,比如說雪崩共識,Hashgraph. 這些算法本質上都是聯盟鏈的算法。與通過“股權質押”的方式,將聯盟鏈算法轉換成PoS 公鏈算法。但聯盟鏈轉換成PoS公鏈算法的過程存在安全性問題。比較為人熟知的一些針對PoS的攻擊有,無利害攻擊和長程攻擊。
IOTA也是一個使用了DAG賬本結構的區塊鏈系統。他的這個賬本數據結構有個特殊的名字叫“tangle”,翻譯成中文就是糾纏混亂的意思。IOTA有一個很好的愿景,就是用區塊鏈來改造這個物聯網和供應鏈的工業啊。
夢想是美好的,然而現實總是骨感的。IOTA的項目愿景非常美好:它通過無區塊鏈,無交易費,無限可擴展,解決了物聯網場景中各種痛點。
首先就是說無限可擴展,其實是一個比較可笑荒謬的。就在這個世界上沒有什么實際的應用系統是可以無限擴展,而這個無交易費和可擴展本身就是相互矛盾的。因為這個無交易費就意味著沒有機制來防止用戶隨意的亂發垃圾交易。
(接下來的內容,都在密碼極客喜馬拉雅FM上,該部分內容不代表密碼極客觀點。)
Q&A
接下來是對Conflux項目、團隊的進一步提問,這次的提問,由密碼極客事先已經在社群內部以及各個協辦方處收集。
01密碼極客:
Conflux的DAG結構是如何解決垃圾信息攻擊的問題?Conflux和現有DAG算法的IOTA、BYTEBALL、NANO、摩爾鏈等項目相比,優勢在哪里?
關于垃圾交易的這個攻擊,一般都需要通過激勵機制來解決。比如這個交易費其實就是一種防止垃圾交易的機制。當然我們目前也在研究和設計一些更好的激勵機制,更有效地處理這個問題。這方面的進展我們將來會持續的更新給大家。
那么跟IOTA的區別,我剛才已經講了很多了。
Byteball是IOTA的一個擴展。在IOTA的基礎上,它增加了在交易DAG中對確定交易程序的機制。它的這個確定交易程序的方法和Conflux有點像,但是有一個很重要的區別:主鏈是如何選擇的?
Conflux是使用這個POW加GHOST的方式,那Byteball是通過見證人的方式。見證人呢就類似于EOS的超級節點,所以它們還是缺失了去中心化帶來的安全性好處。相比之下的話,Conflux會更加的安全。
NANO的話,它所謂的DAG其實叫做這個BlockLattice,它是每個用戶自己的交易都有一個鏈狀的結構,然后不同用戶的交易之間,由引用邊來描述依賴關系,但是它的共識機制仍然是基于POS或者是DPOS的。那么所以這個安全性和去中心化程度仍然是比Conflux要差。
02.TokenClub:
Conflux商業落地的話,會在哪些行業首先展開?目前的研發隊伍大概有多少人?有哪些城市有研發中心,有沒有到其他城市建立site的計劃?
我們正在積極思考商業落地的場景,同時也在積極尋找一些應用和商業端的合作伙伴。
目前我們看到一些比較有潛力的落地場景,有這么一些。比如這個金融數據的共享,這里面需要解決數據共享的質量、隱私以及防篡改等問題。
再有就是我們和一些合作伙伴在積極地探討,就如何通過去中心化預言機來解決這個鏈下數據安全上鏈的問題。這是一個很重要的問題,能解決區劃鏈與現實生活脫節的現狀。
還有一類就是這個去中心化交易平臺的應用場景,這也是我們目前積極去探索和研究的方向。
我們現在的這個研發隊伍大概有20人左右。我們目前的這個研發團隊都在北京。那么在其他城市建立分支的site,我們也是有計劃的,因為這有利于我們在全國推廣技術,壯大Conflux社區。
03.BRC:
Conflux TPS能到多少?交易確認時間是多少?是否能做到全網異步并發交易?
我剛才的分享也講到,Conflux我們實驗的結果就是TPS可以達到3000以上。交易確認的時間大概是十分鐘。
對于全網異步并發交易,就是說這個交易肯定是全網并發產生的,但交易的執行是順序的,對吧?就每個節點他會將交易的順序確定下來,然后去做一致順序的執行。
就是剛才有朋友問到,就是說跟摩爾鏈的區別。其實摩爾鏈的話它跟NANO是很像的,實際上它是在NANO的基礎上做了一些小的修改。
根據摩爾練的白皮書描述,它采用的共識機制仍然是基于DPOS的。這個跟Conflux完全不一樣的,因為我們基于POW。
04.騰訊區塊鏈場外論壇:
Conflux作為一個公鏈項目,現在還沒有發幣,那有發幣的打算嗎?這方面的計劃是怎樣的?
Conflux是一個這個公有鏈的項目,我們分專注這個底層技術和系統的開發。目前沒有公募,也不會發ERC-20。
我們的主網預計會在19年的第三季度上線。
05.密碼極客:
請問你們怎么看待區塊鏈信息服務備案的規定?Conflux有備案的打算嗎?
區塊鏈信息服務備案的規定,我們肯定是歡迎的。它給整個行業帶來了好的指導,有助于整個行業來凈化環境,那么可以讓真正有技術和創新突破的項目在魚龍混雜的環境中站出來,那對我們這些項目肯定是有幫助的。
那我們在2月15號之前呢已經注意到了這個備案信息,并且已經著手去做備案的工作。目前我們產品還沒有上線,還沒有對外提供這個區塊鏈的服務,所以還沒有完成備案。
那一旦產品上線,我們以測試網為時間節點,我們就會盡快去完成備案!
06.TokenClub:
Conflux是如何預防雙花攻擊的呢?Conflux和PoS公鏈項目對比有什么優勢呢?
我剛才在分享的時候,其實已經講到了,因為主鏈的情況決定了交易的順序。但是主鏈的選擇、安全性是由GHOST的規則來保證的。所以這就是它防止這個雙花攻擊的機制。
關于就是說跟POS功能相對比較的話,就是我們一直認為就是說,POW機制和POS相比的話,是具有更高的安全性的。
(部分內容語音轉錄,完整請到喜馬拉雅FM上搜索:密碼極客)